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

相关文章:

  • Python爬虫 urllib 模块详细教程:零基础小白的入门指南
  • Unity3D水下场景与游泳系统开发指南
  • Scrapy(一):轻松爬取图片网站内容​
  • 安宝特方案丨工业AR+AI质检方案:致力于提升检测精度与流程效率
  • linux-系统性能监控
  • Python爬虫实战:研究spiderfoot工具,构建网络情报收集系统
  • python每日一题 贪心算法
  • 线程-线程池篇(二)
  • 基于Hadoop的木鸟民宿数据分析与可视化、民宿价格预测模型系统的设计与实现
  • 使用 gptqmodel 量化 Qwen3-Coder-30B-A3B-Instruct
  • MyBatis基础操作完整指南
  • smart-water表设计方案
  • 百度华为硬件笔试机试题-卷4
  • 希赛《华为 HCIA-Datacom 》核心考点之 NAT 技术解析
  • 解决远程连接云服务器mysql编号1130问题
  • 文本编码扫盲及设计思路总结
  • 应急响应排查(windows版)
  • JAVA高级编程第七章
  • 【Linux系统】进程间通信:命名管道
  • 嵌入式处理器指令系统:精简指令集RISC与复杂指令集CISC的简介,及区别
  • Chrontel 昆泰【CH7107B-BF】CH7107B ——HDMI to CVBS Converter
  • 【arcmap中shp图层数据导入到postgresql数据库中,中文出现乱码,怎么办?】
  • 使用 Maxwell 和 RabbitMQ 监控 Mysql Flowable 表变更
  • 医学影像PACS系统的设计与实现,PACS系统源码
  • LMS/NLMS最小均值算法:双麦克风降噪
  • python中的推导式
  • YOLOv5 上使用 **labelImg** 标注并训练自己的数据集
  • PyTorch生成式人工智能——Hugging Face环境配置与应用详解
  • 【32】C++实战篇—— m行n列的坐标点,求每行相邻点X差值dX,每列相邻点y差值dY,并以矩阵形式左端对齐
  • 远程连接----ubuntu ,rocky 等Linux系统,WindTerm_2.7.0