使用AES算法的时候,会发现下面的代码在windows每次产生确定的结果,但Linux就不同,导致无法正确解密

public static String encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent); SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(password.getBytes());
kgen.init(128, random); return parseByte2HexStr(result); // 加密
} catch (Exception e) {
System.out.print(e);
}
return null;
}

原因在于加红的部分SecureRaom的生成,Linux下默认的算法是“NativePRNG”, 而windows下默认是“SHA1PRNG”(sun提供的算法)

对于这两种算法

相同点:
1. 都是伪随即算法,
2. 默认都是阻塞式 不同点:
1. SHA1PRNG使用的seed是在系统启动时就指定的,而NativePRNG会在内核中随机取得(这也是Linux下每次结果不同的原因)
2. 正是因为每次随机取,NativePRNG开销要更大些

虽然Linux认为最佳随机算法是NativePRNG(安全因素),但使用每次都变化的radom是无法正确解密的,所以并不适用于此种场合。

解决办法

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(password.getBytes());
kgen.init(128, secureRandom);

另外,这两种算法都是阻塞式算法,会读取/var/random,如果想非阻塞,启动时加上下面参数

Djava.security=file:/dev/urandom

参考:

http://www.cjsdn.net/Doc/JDK50/java/security/SecureRandom.html

https://docs.oracle.com/javase/7/docs/api/java/security/SecureRandom.html

http://calvin1978.blogcn.com/articles/securerandom.html

https://stackoverflow.com/questions/27622625/securerandom-with-nativeprng-vs-sha1prng

最新文章

  1. Android应用源码基于安卓的个人隐私监控项目
  2. GetKeyboardType获取键盘类型(通过键盘可初步判断用户使用的是台式电脑还是笔记本电脑)
  3. C# Thread 线程状态知识
  4. [问题2014A02] 解答三(降阶公式法)
  5. Spring MVC Web框架
  6. 《JAVA与模式》之组合模式
  7. new一个二维数组
  8. nyoj 70 阶乘因式分解(二)
  9. 【BZOJ】【3007】拯救小云公主
  10. HDU 2050 折线分割平面 (递推)
  11. 读取sd卡下图片,由图片路径转换为bitmap
  12. Mesos+Zookeeper+Marathon+Docker分布式集群管理最佳实践
  13. list与Set、Map区别
  14. iis / asp.net 使用 .config 和 .xml 文件的区别
  15. WPF如何得到一个在用户控件内部的元素的坐标位置
  16. kafka-connect-hdfs重启,进去RECOVERY状态,从hadoop hdfs拿租约,很正常,但是也太久了吧
  17. Django 拾遗
  18. jQuery滚屏插件XSwitch.js
  19. 表格-table 样式
  20. 告诉我, 究竟我的SQL Server慢在哪里?

热门文章

  1. C run-time函数总览
  2. rm 删除文件或目录
  3. Replace Pioneer注册方法
  4. Luogu 2114 [NOI2014]起床困难综合症
  5. Luogu 3193 [HNOI2008]GT考试
  6. delete请求,删除不成功?
  7. 按失真类型分类整理TID2008
  8. static的功能
  9. jquery easyui datagrid 多选只能获取一条数据
  10. Docker 的优势