Jade Dungeon

Java加密解密

环境配置

JDK8

jdk8_151以前的版本:

修改/usr/java/jre1.8.0_144/lib/security下的 local_policy.jarUS_export_policy.jar

下载的来源:

java6: http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
java7: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
java8: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
cd /usr/java/jre1.8.0_144/lib/security
rm -rf local_policy.jar* US_export_policy.jar*
wget http://182.92.227.112/download/clients-crawler/US_export_policy.jar
wget http://182.92.227.112/download/clients-crawler/local_policy.jar

JDK8u161之前:

修改lib/security/java.security文件中的

crypto.policy=unlimited

或者在程序中修改运行时属性:

Security.setProperty("crypto.policy","unlimited");

JDK8u161之后的默认不限制。

BouncyCastle

为什么要使用BouncyCastle?

我们平常都使用jdk自带的加密包对数据进行加密,加密方式也都是使用的默认的, 如果我们想选择别的加密方式,发现会报错,比如如下代码:

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, 
		new SecretKeySpec("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".getBytes("UTF-8"), 
		"AES"));
cipher.doFinal("QWEASDZS".getBytes("UTF-8"));

这时候我们就需要借助BouncyCastle了。

如何使用BouncyCastle?

方式一

(1)去BouncyCastle官网下载provider的包,然后放入$JAVA_HOME\jre\lib\ext目录下;

(2)修改配置文件$JAVA_HOME\jre\lib\security\java.security,加入一行配置: security.provider.按顺序填数字=org.bouncycastle.jce.provider.BouncyCastleProvider

(3)代码如下:

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, 
		new SecretKeySpec("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".getBytes("UTF-8"), 
		"AES"));
cipher.doFinal("QWEASDZS".getBytes("UTF-8"));

方式二

(1)在代码中通过maven引入BouncyCastle的包

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.56</version>
</dependency>

(2)无需像方式一一样修改配置文件,直接在代码中手动添加provider:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, 
		new SecretKeySpec("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".getBytes("UTF-8"), 
		"AES"));
cipher.doFinal("QWEASDZS".getBytes("UTF-8"));

注意点

出于某些原因,可能需要去官网下载JCE包, 替换掉$JAVA_HOME\jre\lib\security目录下的内容,其次密钥的长度也要注意。