当前位置: 首页 > 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.xdnf.cn/news/1252297.html

相关文章:

  • 【motion】标签体系设计与检索 1:HumanML3D 和 KIT Motion-Language(KITML)
  • Java 使用动态代理和反射实现字段变更跟踪
  • 生成网站sitemap.xml地图教程
  • 【STM32U385RG 测评】基于VSCode的STM32开发环境搭建
  • 西门子PLC基础指令6:读取时钟指令、设置时钟指令、使能含义与注意
  • 【32】C++实战篇—— m行n列的坐标点,求每行相邻点X差值dX,每列相邻点y差值dY,并以矩阵形式左端对齐
  • JAVA--流程控制语句
  • 【VS + Qt】VS2022 Qt 开发中 ui_xx.h 文件编辑报错但编译正常的问题解决
  • 「iOS」————单例与代理
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘caffe’问题
  • 河南萌新联赛2025第四场-河南大学
  • K8S云原生监控方案Prometheus+grafana
  • yolov1-v3原理解析
  • DHCP 服务器与DNS服务器
  • 服务器——“查询不到显卡驱动,且输入nvidia-smi报错”的解决办法
  • 2.6 sync
  • 媒体资产管理系统和OCR文字识别的结合
  • 多端同步新解法:Joplin+cpolar联合通过开源设计实现跨平台无缝协作?
  • 自动驾驶系统的网络安全风险分析
  • 013 HTTP篇
  • Transwell 细胞迁移与侵袭实验:从原理到操作的详细指南
  • Hive【应用 04】常用DDL操作(数据库操作+创建表+修改表+清空删除表+其他命令)
  • 【android bluetooth 协议分析 03】【蓝牙扫描详解 4】【BR/EDR扫描到设备后如何上报给app侧】
  • Redis中间件(一):Redis相关命令及其原理
  • 企业后端系统常用数据源类型有哪些?
  • 芯片分享【昆泰】——CH7305A -display controller device.
  • Nacos配置中心和数据隔离在idea中的实现
  • Selenium在Pyhton应用
  • 《算法导论》第 8 章—线性时间排序
  • 【C语言】文件操作全解析