深坑:SecureRandom.getInstanceStrong() next方法阻塞啦

背景

我遇到的场景是,我们有个生成随机数的场景,采用的便是 SecureRandom.getInstanceStrong() 获取Random 实例。在windows电脑以及在docker环境中都运行正常,所以没发现问题。直到我们把代码部署到centos系统中时发现了问题(没有采用docker)。就发现这个方法执行时间很长,导致前端接口504 time out 错误。

最开始感觉很纳闷,一样的代码怎么会这样子。经过排查才发现是next方法执行时间很长导致的。

深究原因可以参考: https://blog.csdn.net/weixin_45244678/article/details/106137948
我的情况和这篇博文的情况很相似。

总结下来导致这个问题的原因是

SecureRandom.getInstanceStrong() 在linux环境下会读取操作系统的 /dev/random 文件来生成随机数,
而这个文件的数据来源于系统的扰动,比如键盘的输入、鼠标点击等等操作。当系统产生扰动很少的时候,就会导致读取这个文件的线程阻塞(和采用的代码语言无关)。操作系统产生的这个扰动可以通过 cat /proc/sys/kernel/random/entropy_avail 查看(即系统熵值)。

解决办法

  1. 采用 new SecureRandom() 实例化,这个实例化底层是读取的是操作系统的 /dev/urandom文件,这个是伪随机,相比 SecureRandom.getInstanceStrong() 方式,它的随机性稍微弱一些,但大多数场景够用了。
  2. 仍然采用 SecureRandom.getInstanceStrong() 方式,这种方式适合对随机性要求高的场景。采用这种方式为了避免阻塞问题,就需要系统产生足够的扰动。于是可以安装 haveged 并启动 haveged,启动haveged后可以发现 cat /proc/sys/kernel/random/entropy_avail 返回的值变大了,所以不再阻塞。也可以安装rng-tools这个来达到这个目的

实战

查看本机熵值
在这里插入图片描述
安装rng-tools
yum install rng-tools -y

启动rng-tools
systemctl enable rngd --now

再次查看本机熵值
在这里插入图片描述

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值