(写在前面的话:之前负责了一个关于数据安全接入的模块,涉及到了数据的加密解密,文件校验,下载落地,入库等。在wannercry肆虐之际,更深刻体会到数据安全的重要意义。鉴于此,不才受邀在今天给团队成员统一普及了一下数据安全方面的概念,重点给Java同事分享了一下基于Java的数据加密解密实现和梁栋的《java加密与解密的艺术》。有感于这次的wannercry风暴,特将今天的培训整理出来和大家分享一下,诚邀勘误指正。 培训资料:参考了梁栋的《java加密与解密的艺术》,大家也可以自行买这本书阅读,应该感谢梁栋为我们提供了一本好书。)
一、java加密组件的权限解禁
受 sun 公司的进出口限制,java默认JDK或JRE中加密组件的安全强度不够(秘钥长度受限)以及某些算法(MD4等)不予支持,在不受进出口限制的国家地区拓展使用时,需要在 sun 官网下载无政策限制权限文件。
需要注意的是不同版本JDK/JRE需要下载与之对应的无政策限制权限文件。jce8下载链接如下:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
将其中的jar文件替换掉 %java_home%/lib/security/ 下对应的jar文件;替换掉 %java_home%/jre/lib/security/ 下对应的jar文件。
默认java组件不支持 AES 秘钥长度 256 ,解禁是否成功,可以通过下述代码验证 AES 秘钥长度 256 是否能否生成,若解禁失败,则会抛出异常java.security.InvalidKeyException。
KeyGenerator.getInstance("AES").init(256);
二、第三方加密组件 Bouncy Castle
1、环境搭建
java自带的加密组件的加密强度或算法往往不能够满足我们的应用需求,我们可以通过开源组织提供的第三方家组件来拓展java的加密性能。只需要引入相关jar包即可,maven配置如下:
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.57</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-ext-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-ext-jdk15on</artifactId>
<version>1.57</version>
</dependency>
2、组件调用
在初始化秘钥生成器等各类引擎类前,调用如下代码:
/** * 注册第三方加密组件BouncyCastle */ Security.addProvider(new BouncyCastleProvider());
3、提供的工具类
- Base64
- URLBase64
- Hex十六进制转换工具
三、Commons Codec辅助工具
该工具是有apache开源组织提供的,并没有对java组件拓展新的算法或者提高加密强度,仅仅是做了相应的工具封装,使得java加密组件的应用更简洁好用。
1、提供了Base64转换工具
2、提供了Base64InputStream
3、提供了Base64OutputStream
4、提供了Hex十六进制转换工具
5、提供了DigestUtils消息摘要算法的封装工具类