当前位置: 首页 > news >正文

Bug 记录:SecureRandom.getInstanceStrong()导致验证码获取阻塞

问题描述:

在发送验证码到邮件中,接口调用时卡在生成验证码阶段,导致验证码功能完全不可用;
经排查开发环境一切正常,测试环境会重现此问题;


问题分析:

现象:

  • 代码卡在 SecureRandom.getInstanceStrong().nextInt() 无法继续执行

原因:

  • SecureRandom.getInstanceStrong() 方法在 Linux 下默认使用/dev/random来生成随机数,而这个文件的数据来源于系统的扰动。当系统产生扰动很少的时候,就会导致读取这个文件的线程阻塞。
  • /dev/random:阻塞型设备,当熵不足时会阻塞程序
  • /dev/urandom:非阻塞型设备,熵不足时使用伪随机算法

熵池不足是什么意思?

  • 熵池不足"是指系统中可用于生成随机数的随机性资源不足。当熵池中的熵值低于某个阈值时,系统无法提供足够的随机性

查询服务器熵值:

cat /proc/sys/kernel/random/entropy_avail 

正常应该1000以上

解决方案:

方案一:使用使new SecureRandom()

new SecureRandom() 默认使用非阻塞源,在 Linux 环境下,Java 默认使用 /dev/urandom 作为熵源(永不阻塞,即使熵不足时使用伪随机算法补充)

方案二:使用ThreadLocalRandom来生成验证码

public class CaptchaNumCreator extends DefaultTextCreator {@Overridepublic String getText() {// 确保使用高效的随机数生成方式return ThreadLocalRandom.current().ints(6, 0, 10)  // 生成6位数字.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();}
}

方案三:在 JVM 启动参数中添加

-Djava.security.egd=file:/dev/./urandom

注意:这里使用 /dev/./urandom 而非 /dev/urandom 是为了绕过 JDK 的一个历史 Bug

http://www.dtcms.com/a/317561.html

相关文章:

  • 算法238. 除自身以外数组的乘积
  • 完整的登陆学生管理系统(配置数据库)
  • VSCode git提交记录中文commit显示乱码
  • 碰撞问题的分析
  • OpenAI开源大模型gpt-oss系列深度解析:从120B生产级到20B桌面级应用指南
  • C++实现线程池(3)缓存线程池
  • get请求中文字符参数乱码问题
  • 互联网一线大厂Java面试八股文整理(1000题附答案)
  • MATLAB深度学习之数据集-数据库构建方法详解
  • Leetcode——209. 长度最小的子数组
  • Redis中间件(二):Redis协议与异步方式
  • 用docker的方式快速搭建一个Hive的调测环境
  • Java 字节码文件(.class)的组成详解
  • 具有柔性关节的机械臂matlab仿真
  • 在Word和WPS文字中如何输入汉字的偏旁部首
  • 【计算机网络 | 第4篇】分组交换
  • Linux seLinux
  • 网络工程师--华为命令专题
  • 安卓雷电模拟器安装frida调试
  • 《Day2-PyTorch Tensor 从入门到实践:核心操作与避坑指南》
  • jmm 指令重排 缓存可见性 Volatile 内存屏障
  • 数据中心白牌服务器市场规模与发展趋势分析报告-路亿市场策略
  • 丝杆升降机的螺母磨损到什么程度需要更换?有无预警或检测方法?
  • Orange的运维学习日记--31.Linux防火墙深度详解
  • LVS-DR模式高性能负载均衡实战
  • PLC学习之路-定时器-(三)
  • Fabric.js从入门学习到实现labelImg矩形多边形标注工具【上】
  • 论文学习19:Multi-view Aggregation Network for Dichotomous Image Segmentation
  • STM32江科大学习笔记,全功能按键非阻塞式实现,按键点击,双击,长按
  • 思途AOP学习笔记 0806