前言

你是否存在这样的苦恼,数据需要安全存储,但是每个系统大家自己写,很浪费时间。。

每一个子项目各自为政,加解密搞得也无法统一。也许下面这个开源项目可以帮助你。

encryption-local 一个离线版本的金融敏感信息加解密工具,用于数据库敏感信息存储。

创作目的:为金融敏感数据,提供一个简单易用的离线加解密工具。加密机服务可以在此基础上很容易的实现。

特性

  • 身份证加解密
  • 地址加解密
  • 姓名加解密
  • 邮箱加解密
  • 手机号加解密
  • 银行卡加解密
  • 密码加解密

项目推荐

下面是一些日志、加解密、脱敏安全相关的库推荐:

项目介绍
sensitive-word高性能敏感词核心库
sensitive-word-admin敏感词控台,前后端分离
sensitive高性能日志脱敏组件
auto-log统一日志切面组件,支持全链路traceId
encryption-local离线加密机组件
encryption加密机标准API+本地客户端
encryption-server加密机服务

拓展阅读

【老马】离线版金融敏感信息加解密组件开源项目encryption-local

【藏经阁】加密机服务完整解决方案,包含客户端+服务端

快速开始

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>encryption-local-core</artifactId>
    <version>1.2.0</version>
</dependency>

方法概览

常见方法都在 EncryptionLocalUtil#xxx 工具类中可见。

加密

方法说明
addressEncrypt地址加密
nameEncrypt姓名加密
emailEncrypt邮箱加密
phoneEncrypt手机号加密
idCardEncrypt身份证加密
bankCardNoEncrypt银行卡加密
passwordEncrypt密码加密

统一入参:(text, salt) text 为待加密的内容, salt 为秘钥。v1.1.0 支持不带 salt 的方法。

统一出参:CommonEncryptResponse 对象,有 3 个属性:

属性说明
cipher密文
mask掩码
hash摘要

解密

方法说明
addressDecrypt地址解密
nameDecrypt姓名解密
emailDecrypt邮箱解密
phoneDecrypt手机号解密
idCardDecrypt身份证解密
bankCardNumDecrypt银行卡解密
passwordDecrypt密码解密

统一入参:cipher 为加密之后的密文字符串

统一出参:解密之后的明文字符串

使用

用法都是类似的,此处以手机号为例:

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);

其他的各种数据效果示例整理如下,秘钥统一使用 99886622

注意:生产环境使用,必须保证秘钥的复杂性(建议不低于 10 位)

类别明文秘文掩码摘要
地址太平洋比基尼海滩比奇堡镇贝壳街124号的波萝屋D8D9E99FB8286107C2F75325C0B9046CF335EE4AC4FCD3F27E0D6BFD8B3DBF39440A3D69422A3AF933576798CF3860F330F288E196CEACB22CCCDA0623B94355太平洋比基尼*************的波萝屋31912515337902B8A3CC1CBDB5772358
姓名海绵宝宝91AF56071FA8830391144DBEAE3967DA海**宝94B221D98E0EF588B5304A88752DC6C7
邮箱haimian@baobao.com15768CD9C0E70E2C798451E7982C8877DF991568ECD7BC3E1A9E9AD72455B085hai****@baobao.com4C651B4CDACA3CFA4876277B678282A9
手机1888888888808276740AEC8AAC11C6D0F84184DE2B5188****8888381FA900C0626D7D7E2DB185B3558166
身份证33078119850907947974101E0AAF25796680E40F3198D1AEFBC00E25FD8316F40CE90B425338894A42330781*********4792C7E7A814C36DE11EF01F39C35CECF12
银行卡4427290920309717288D5EC5432203677D3714E9A270F9998AC04BF65E5A36C6773187A4239D05EE442729******9717DE550BAF362B3EF640FF5AEC7D6E2F38
密码1234568B208237BEB2E6A4390E7128E5E000D7******FEB408A10822A55A939E8E38A6612515
完整例子参考 EncryptionLocalUtilTest.java

引导类

为了便于用于拓展,加密支持通过引导类 EncryptionLocalBs 灵活指定配置。

配置

EncryptionLocalBs 中支持用户自定义下列配置。

属性说明默认值
salt秘钥null
hash哈希策略md5
secret加密策略aes

在指定秘钥之后,其他方法不再需要传递秘钥。

方法和工具类中一致。

例子

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);

小结

离线版本的加解密好处是非常的方便。

不过缺点也比较明显,那就是在真正追求安全的公司,研发是不能够拥有直接加解密的能力的。

所以最好是有一个单独的加密机服务,对公司内部提供统一的加解密能力。


老马啸西风
191 声望34 粉丝