【老马】离线版金融敏感信息加解密组件开源项目 encryption-local
<h1 id="前言">前言</h1><p>你是否存在这样的苦恼,数据需要安全存储,但是每个系统大家自己写,很浪费时间。。</p>
<p>每一个子项目各自为政,加解密搞得也无法统一。也许下面这个开源项目可以帮助你。</p>
<p>encryption-local 一个离线版本的金融敏感信息加解密工具,用于数据库敏感信息存储。</p>
<p>创作目的:为金融敏感数据,提供一个简单易用的离线加解密工具。加密机服务可以在此基础上很容易的实现。</p>
<h2 id="特性">特性</h2>
<ul>
<li>
<p>身份证加解密</p>
</li>
<li>
<p>地址加解密</p>
</li>
<li>
<p>姓名加解密</p>
</li>
<li>
<p>邮箱加解密</p>
</li>
<li>
<p>手机号加解密</p>
</li>
<li>
<p>银行卡加解密</p>
</li>
<li>
<p>密码加解密</p>
</li>
</ul>
<h2 id="项目推荐">项目推荐</h2>
<p>下面是一些日志、加解密、脱敏安全相关的库推荐:</p>
<table>
<thead>
<tr>
<th style="text-align: left">项目</th>
<th style="text-align: left">介绍</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">sensitive-word</td>
<td style="text-align: left">高性能敏感词核心库</td>
</tr>
<tr>
<td style="text-align: left">sensitive-word-admin</td>
<td style="text-align: left">敏感词控台,前后端分离</td>
</tr>
<tr>
<td style="text-align: left">sensitive</td>
<td style="text-align: left">高性能日志脱敏组件</td>
</tr>
<tr>
<td style="text-align: left">auto-log</td>
<td style="text-align: left">统一日志切面组件,支持全链路traceId</td>
</tr>
<tr>
<td style="text-align: left">encryption-local</td>
<td style="text-align: left">离线加密机组件</td>
</tr>
<tr>
<td style="text-align: left">encryption</td>
<td style="text-align: left">加密机标准API+本地客户端</td>
</tr>
<tr>
<td style="text-align: left">encryption-server</td>
<td style="text-align: left">加密机服务</td>
</tr>
</tbody>
</table>
<h2 id="拓展阅读">拓展阅读</h2>
<p>【老马】离线版金融敏感信息加解密组件开源项目encryption-local</p>
<p>【藏经阁】加密机服务完整解决方案,包含客户端+服务端</p>
<h1 id="快速开始">快速开始</h1>
<h2 id="maven-引入">maven 引入</h2>
<pre><code class="language-xml"><dependency>
<groupId>com.github.houbb</groupId>
<artifactId>encryption-local-core</artifactId>
<version>1.2.0</version>
</dependency>
</code></pre>
<h2 id="方法概览">方法概览</h2>
<p>常见方法都在 <code>EncryptionLocalUtil#xxx</code> 工具类中可见。</p>
<h3 id="加密">加密</h3>
<table>
<thead>
<tr>
<th style="text-align: left">方法</th>
<th style="text-align: left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">addressEncrypt</td>
<td style="text-align: left">地址加密</td>
</tr>
<tr>
<td style="text-align: left">nameEncrypt</td>
<td style="text-align: left">姓名加密</td>
</tr>
<tr>
<td style="text-align: left">emailEncrypt</td>
<td style="text-align: left">邮箱加密</td>
</tr>
<tr>
<td style="text-align: left">phoneEncrypt</td>
<td style="text-align: left">手机号加密</td>
</tr>
<tr>
<td style="text-align: left">idCardEncrypt</td>
<td style="text-align: left">身份证加密</td>
</tr>
<tr>
<td style="text-align: left">bankCardNoEncrypt</td>
<td style="text-align: left">银行卡加密</td>
</tr>
<tr>
<td style="text-align: left">passwordEncrypt</td>
<td style="text-align: left">密码加密</td>
</tr>
</tbody>
</table>
<p>统一入参:<code>(text, salt)</code> text 为待加密的内容, salt 为秘钥。v1.1.0 支持不带 salt 的方法。</p>
<p>统一出参:<code>CommonEncryptResponse</code> 对象,有 3 个属性:</p>
<table>
<thead>
<tr>
<th style="text-align: left">属性</th>
<th style="text-align: left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">cipher</td>
<td style="text-align: left">密文</td>
</tr>
<tr>
<td style="text-align: left">mask</td>
<td style="text-align: left">掩码</td>
</tr>
<tr>
<td style="text-align: left">hash</td>
<td style="text-align: left">摘要</td>
</tr>
</tbody>
</table>
<h3 id="解密">解密</h3>
<table>
<thead>
<tr>
<th style="text-align: left">方法</th>
<th style="text-align: left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">addressDecrypt</td>
<td style="text-align: left">地址解密</td>
</tr>
<tr>
<td style="text-align: left">nameDecrypt</td>
<td style="text-align: left">姓名解密</td>
</tr>
<tr>
<td style="text-align: left">emailDecrypt</td>
<td style="text-align: left">邮箱解密</td>
</tr>
<tr>
<td style="text-align: left">phoneDecrypt</td>
<td style="text-align: left">手机号解密</td>
</tr>
<tr>
<td style="text-align: left">idCardDecrypt</td>
<td style="text-align: left">身份证解密</td>
</tr>
<tr>
<td style="text-align: left">bankCardNumDecrypt</td>
<td style="text-align: left">银行卡解密</td>
</tr>
<tr>
<td style="text-align: left">passwordDecrypt</td>
<td style="text-align: left">密码解密</td>
</tr>
</tbody>
</table>
<p>统一入参:<code>cipher</code> 为加密之后的密文字符串</p>
<p>统一出参:解密之后的明文字符串</p>
<h2 id="使用">使用</h2>
<p>用法都是类似的,此处以手机号为例:</p>
<pre><code class="language-java">final String email = "18888888888";
final String salt = "99886622";
CommonEncryptResponse response = EncryptionLocalUtil.phoneEncrypt(email, salt);
String cipher = response.getCipher();
String mask = response.getMask();
String hash = response.getHash();
Assert.assertEquals("08276740AEC8AAC11C6D0F84184DE2B5", cipher);
Assert.assertEquals("188****8888", mask);
Assert.assertEquals("381FA900C0626D7D7E2DB185B3558166", hash);
// 解密
String plain = EncryptionLocalUtil.phoneDecrypt(cipher, salt);
Assert.assertEquals(email, plain);
</code></pre>
<p>其他的各种数据效果示例整理如下,秘钥统一使用 <code>99886622</code>。</p>
<p>注意:生产环境使用,<strong>必须保证秘钥的复杂性(建议不低于 10 位)</strong>。</p>
<table>
<thead>
<tr>
<th style="text-align: left">类别</th>
<th style="text-align: left">明文</th>
<th style="text-align: left">秘文</th>
<th style="text-align: left">掩码</th>
<th style="text-align: left">摘要</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">地址</td>
<td style="text-align: left">太平洋比基尼海滩比奇堡镇贝壳街124号的波萝屋</td>
<td style="text-align: left">D8D9E99FB8286107C2F75325C0B9046CF335EE4AC4FCD3F27E0D6BFD8B3DBF39440A3D69422A3AF933576798CF3860F330F288E196CEACB22CCCDA0623B94355</td>
<td style="text-align: left"><code>太平洋比基尼*************的波萝屋</code></td>
<td style="text-align: left">31912515337902B8A3CC1CBDB5772358</td>
</tr>
<tr>
<td style="text-align: left">姓名</td>
<td style="text-align: left">海绵宝宝</td>
<td style="text-align: left">91AF56071FA8830391144DBEAE3967DA</td>
<td style="text-align: left"><code>海**宝</code></td>
<td style="text-align: left">94B221D98E0EF588B5304A88752DC6C7</td>
</tr>
<tr>
<td style="text-align: left">邮箱</td>
<td style="text-align: left">haimian@baobao.com</td>
<td style="text-align: left">15768CD9C0E70E2C798451E7982C8877DF991568ECD7BC3E1A9E9AD72455B085</td>
<td style="text-align: left"><code>hai****@baobao.com</code></td>
<td style="text-align: left">4C651B4CDACA3CFA4876277B678282A9</td>
</tr>
<tr>
<td style="text-align: left">手机</td>
<td style="text-align: left">18888888888</td>
<td style="text-align: left">08276740AEC8AAC11C6D0F84184DE2B5</td>
<td style="text-align: left"><code>188****8888</code></td>
<td style="text-align: left">381FA900C0626D7D7E2DB185B3558166</td>
</tr>
<tr>
<td style="text-align: left">身份证</td>
<td style="text-align: left">330781198509079479</td>
<td style="text-align: left">74101E0AAF25796680E40F3198D1AEFBC00E25FD8316F40CE90B425338894A42</td>
<td style="text-align: left"><code>330781*********479</code></td>
<td style="text-align: left">2C7E7A814C36DE11EF01F39C35CECF12</td>
</tr>
<tr>
<td style="text-align: left">银行卡</td>
<td style="text-align: left">4427290920309717</td>
<td style="text-align: left">288D5EC5432203677D3714E9A270F9998AC04BF65E5A36C6773187A4239D05EE</td>
<td style="text-align: left"><code>442729******9717</code></td>
<td style="text-align: left">DE550BAF362B3EF640FF5AEC7D6E2F38</td>
</tr>
<tr>
<td style="text-align: left">密码</td>
<td style="text-align: left">123456</td>
<td style="text-align: left">8B208237BEB2E6A4390E7128E5E000D7</td>
<td style="text-align: left"><code>******</code></td>
<td style="text-align: left">FEB408A10822A55A939E8E38A6612515</td>
</tr>
</tbody>
</table>
<blockquote>
<p>完整例子参考 EncryptionLocalUtilTest.java</p>
</blockquote>
<h2 id="引导类">引导类</h2>
<p>为了便于用于拓展,加密支持通过引导类 <code>EncryptionLocalBs</code> 灵活指定配置。</p>
<h3 id="配置">配置</h3>
<p>EncryptionLocalBs 中支持用户自定义下列配置。</p>
<table>
<thead>
<tr>
<th style="text-align: left">属性</th>
<th style="text-align: left">说明</th>
<th style="text-align: left">默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">salt</td>
<td style="text-align: left">秘钥</td>
<td style="text-align: left">null</td>
</tr>
<tr>
<td style="text-align: left">hash</td>
<td style="text-align: left">哈希策略</td>
<td style="text-align: left">md5</td>
</tr>
<tr>
<td style="text-align: left">secret</td>
<td style="text-align: left">加密策略</td>
<td style="text-align: left">aes</td>
</tr>
</tbody>
</table>
<p>在指定秘钥之后,其他方法不再需要传递秘钥。</p>
<p>方法和工具类中一致。</p>
<h3 id="例子">例子</h3>
<pre><code class="language-java">EncryptionLocalBs localBs = EncryptionLocalBs.newInstance();
// 加密
CommonEncryptResponse encryptResponse = localBs.encrypt("123456", EncryptTypeEnum.PASSWORD.getCode());
Assert.assertEquals("CommonEncryptResponse{cipher='8B208237BEB2E6A4390E7128E5E000D7', mask='******', hash='FEB408A10822A55A939E8E38A6612515'}", encryptResponse.toString());
// 解密
String plainText = localBs.decrypt(encryptResponse.getCipher(), EncryptTypeEnum.PASSWORD.getCode());
Assert.assertEquals("123456", plainText);
</code></pre>
<h1 id="小结">小结</h1>
<p>离线版本的加解密好处是非常的方便。</p>
<p>不过缺点也比较明显,那就是在真正追求安全的公司,研发是不能够拥有直接加解密的能力的。</p>
<p>所以最好是有一个单独的加密机服务,对公司内部提供统一的加解密能力。</p><br><br>
来源:https://www.cnblogs.com/houbbBlogs/p/18882671
頁:
[1]