您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

工作中的坑(1) securerandom

SecureRandom

  • Random和SecureRandom
    • Random是什么
    • SecureRandom是什么
  • SecureRandom的坑
  • 结论

Random和SecureRandom

Random是什么

randomg常用来创建伪随机数,因为只要给定一个初始的种子,所以产生的随机数是一样的,生成随机数方式可以使用方法nextInt()、nextLong()、nextFloat()、nextDouble()来生成不同类型的随机数。如果种子相同,就会生成相同的2个随机序列。
如图所示就是相同种子生成的随机数,实际上都是一样的

SecureRandom是什么

SecureRandom就是一个不可预测的安全的随机数。他无法预设制定种子,是使用的RNG(random number generator)算法来实现的。一般SecureRandom的安全的随机种子,都是通过CPU的热噪声,读写磁盘的字节,等各种随机事件产生的“熵”。
如果涉及到需要十分安全的随机数时,应该优先使用SecureRandom

SecureRandom的坑

在今天的项目准生产环境测试时,有一个功能死活用不了.还导致了出现mysql行锁,已经定位到具体的方法了肯定就好去解决了.立马就在本地环境开始测试调试。结果一测试发现,直接就跑通了没有复现??随后又把新的代码放回了服务器,再次测试,结果又出现了这个问题…当时我甚至都把事务注解给注释掉了…还以为是因为自己的update写的有问题呢…可是还不行.后来让我们同事来看了一下,才发现,原来是SecureRandom.getInstanceStrong()的方法出现了问题,因为他没有足够的随机数据提供就会持续等待,他一等待,我其他需要涉及到mysql事务提交的也在等待在这种情况下,因为存在的熵太少了.就会导致这种在线程阻塞的情况。

结论

也是网上总结、看大佬博客最后可行的解决方案还是找到了几个的
1.使用SecureRandom random = new SecureRandom();
的方式创建这种创建方式不会产生阻塞
2.针对于不是特别需要安全的还是使用Random random = new Random();的方式以时间戳为种生成。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进