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

SecureRandom.getInstanceStrong()引发的线程阻塞问题分析 1. 背景介绍 sonar扫描到使用Random随机函数不安全, 推荐使用SecureRandom替换之, 当使用SecureRandom.getInstanceStrong()获取SecureRandom并调用next方式时, 在生产环境(linux)产生较长时间的阻塞, 但开发环境(windows7)并未重现 2. 现象展示 使用测试代码: package com.youai.test; import java.security.NoSuchAlgorithmException; import jav 阅读详情

问题描述:

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


问题分析:

现象:

  • 代码卡在 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 {
    @Override
    public 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

Linux下SecureRandom.getInstanceStrong()卡死?教你3种替代方案(附性能对比) 本文深入解析Linux下`SecureRandom.getInstanceStrong()`卡顿问题,提供三种高效替代方案,包括改用默认SecureRandom实例、部署haveged熵补充服务及定制化随机数生成策略,并附性能对比数据,帮助开发者解决线程阻塞问题,提升系统性能。 阅读详情

相关推荐

SecureRandom产生随机数采坑记录

前言:最近上线时遇到一个很诡异的问题,这个问题在测试环境和pr环境都没问题,但是在生产环境必现,排查配置、代码是否一致等原因后,最终通过cat生成的traceId和研读代码,花费了两个小时,定位到问题是由于SecureRandom产生随机数系统熵池中数量不足,阻塞了当前线程。记录一下这个踩坑经验,希望大家规避掉类似的使用~ 情境描述以及随机算法介绍 系统中经常有获取随机数的场景,我们通常new一个Random对象,通过random.nextInt(size)来获取一个随机数。通过jdk8中对Random类的

qq_36741161的博客 4686

SecureRandom.getInstanceStron获取随机数线程阻塞

1、(强伪随机数,难以预测的随机数)采用 new SecureRandom() 实例化,这个实例化底层是读取的是操作系统的 /dev/urandom文件,这个是伪随机,相比 SecureRandom.getInstanceStrong() 方式,它的随机性稍微弱一些,但大多数场景够用了。2、(弱伪随机数,易于预测的随机数)使用commons-lang3工具包中的RandomUtils.nextLong(起始值,结束值)方法,可以得到一个在该范围内的随机数。(和采用的代码语言无关)。

qq_33590654的博客 1811

学习笔记之——Event Camera(事件相机)调研

概述 Event Camera是一种bio-inspired sensor,对应的领域为bio-inspired vision。对于传统的相机,从某种程度上,是捕获一个静态/静止的空间,而Event Camera的目的是:敏感地捕捉运动的物体。 对于传统RGB-camera,相机传回的信息是同步的,所谓同步,就是在某一时刻t,相机会进行曝光,把这一时刻所有的像素填在一个矩阵里回传,一张照片就诞生了。一张照片上所有的像素都对应着同一时刻。至于视频,不过是很多帧的图片,相邻图片间的时间间隔...

gwpscut的博客 3万+

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

背景 我遇到的场景是,我们有个生成随机数的场景,采用的便是 SecureRandom.getInstanceStrong() 获取Random 实例。在windows电脑以及在docker环境中都运行正常,所以没发现问题。直到我们把代码部署到centos系统中时发现了问题(没有采用docker)。就发现这个方法执行时间很长,导致前端接口504 time out 错误。 最开始感觉很纳闷,一样的代码怎么会这样子。经过排查才发现是next方法执行时间很长导致的。 深究原因可以参考: https://blog.c

Rocky的博客 3310

[RK3568][Android11.0]Vold-DiskInfo:区分u盘和硬盘

测试平台 Platform: RK3568 OS: Android 11.0 需求描述 目前系统内部设备没有对硬盘(sata/usb移动硬盘)和u盘做区分,统一显示的为usb存储设备.目前有需求要在显示上有所区分。 解决方案 如何区分移动硬盘和U盘,见Android usb设备的检测及区分(sata硬盘、优盘及移动硬盘).主要就是检测removeable值,为0:硬盘,为1:u盘 解决补丁如下 From 572cf35c07f68c5cb5defe40c536dd9ad1b4648e Mon Sep 17

weixin_39966398的博客 1897

.NET MAUI 第13讲 深入探索 .NET MAUI Essentials:让应用感知设备与环境,打造智能体验

摘要:本文介绍了.NET MAUI Essentials库如何赋能移动应用感知设备环境的能力。文章详细讲解了设备信息获取(DeviceInfo)、网络状态监测(Connectivity)、地理位置服务(Geolocation)、地图集成(Map)以及传感器(Accelerometer等)等核心功能的使用方法,并提供了完整的代码示例。通过一个综合练习,展示了如何构建设备信息仪表板,实时显示设备参数和网络状态,并实现位置获取与地图导航功能。这些跨平台API能显著提升应用智能化和用户体验,同时保持代码简洁高效。

AlphaNil的博客 1087

SecureRandom.getInstanceStrong()引发的线程阻塞

概述 sonar扫描到使用Random随机函数不安全,推荐使用SecureRandom替换,当使用SecureRandom.getInstanceStrong()获取SecureRandom并调用next方式是,在linux产生较长时间的阻塞,但开发环境(windows7)并未重现。 问题现象 测试代码: package com.study.practice.secure; import java.security.NoSuchAlgorithmException; import java.securit

抽象的螺旋 2027

莆田市C++专项选拔第一轮题4

现在小明同学想要从两堆硬币中各选择一枚硬币,使得两枚硬币的面值之和 不超过 k。不同的硬币组合,就算面值相同,也视为不同的方案。现在他把这些硬币分成了两堆,已知两堆硬币分别有 n 和 m 枚硬币。可选方案有: (1,2), (1,1), (1,1), (5,2), (5,1), (5,1),共 6 种。第一行三个整数 n, m, k,分别表示第一堆硬币的数量,第二堆硬币的数量,以及面值之和的上限。对于30%的数据,1 ≤ n , m ≤ 1000 , 1 ≤ b , c ≤ 1000。

lpstudio的博客 924

java SecureRandom.getInstanceStrong()随机数的深坑

2、SecureRandom.getInstanceStrong()造成阻塞的原因:在不同的系统环境执行的底层代码不相同,在linux系统中通过底层NativePRNG方法,通过/dev/random方式读取随机数,/dev/random方式受系统环境的影响容易造成线程阻塞;1、在获取随机数时,使用new Random()写发时,在sonar扫描提示建议使用SecureRandom.getInstanceStrong()语法获取。

weisian的博客 2701

深入理解DQN中的Q值:核心概念和应用

在强化学习中,Q值(或称为动作价值函数)是核心概念之一。Q值函数 ( Q(s, a) ) 表示在给定状态 ( s ) 下,采取动作 ( a ) 并遵循某策略后,智能体从当前状态到未来状态所能获得的预期总回报。简言之,Q值是评估特定状态和动作对的好坏的指标。

qlkaicx的博客 2975

薅“刷宝”羊毛的autojs脚本教程,简单粗暴好用!!!

本教程旨在帮助大家实现用手机或闲置手机来进行“刷宝”平台的收益,能薅多少米就看你的本事了,作者教你的是如何用autojs来进行脚本的挂机教程,掌握了这个思路后,你可以根据自己的实际需要来改进脚本或者撸别的平台:) 适用系统,**android4.0以上,苹果机暂不适用**(大多数android系统手机都是7.0以上,要查看自己手机是android几,见文件夹“视频教程-基础”>1.查看android版本的方法)

rousseaou8的博客 8万+

SecureRandom.getInstanceStrong引起的线程阻塞

项目场景: 某个项目中,sonar扫描到使用Random随机函数不安全, 推荐使用SecureRandom替换,于是就换成了使用SecureRandom.getInstanceStrong()获取SecureRandom并调用nextInt()。 悲剧开始了... 问题描述 在生产环境(linux)产生较长时间的阻塞,造成了nginx返回大量499,一度以为是tomcat不接收消息或是nginx转发问题,但开发环境(windows10)并未重现。 原因分析: 通过jstack发现,有599个线

qq_38536878的博客 2099

【OpenClaw从入门到精通】第03篇:吃透Gateway/Skills/ClawHub核心概念(2026实测+避坑)

本文针对OpenClaw新手易混淆的核心概念痛点,以通俗类比+实操演示拆解OpenClaw核心、Gateway、Skills、ClawHub四大组件。通过“数字员工团队”类比明确各组件定位:OpenClaw核心是“老板”(调度中心)、Gateway是“前台+后勤”(后台进程)、Skills是“专业员工”(功能插件)、ClawHub是“人才市场”(技能商店)。补充版本更名史、技能加载优先级、ClawHub与GitHub区别等关键细节,结合“AI融资新闻查询并邮件推送”虚拟案例演示组件协同流程,梳理5个高频认知

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 5038

Random random = SecureRandom.getInstanceStrong();堵塞线程问题解决

sonar扫描到使用Random随机函数不安全, 推荐使用SecureRandom替换,就是他–》【SecureRandom.getInstanceStrong()】,分别在本地,测试环境测过没问题上生产,但是运行了一段时间突然报错!然后还是像那个博主一样,一段一段代码的注释上测试环境才发现问题在哪里,坑就坑在这,在win10环境正常得很,一到linux上面就和个发病的一样生成随机数字卡顿,导致接口请求无响应。sonar推荐的不一定都是适合自己业务场景,只是站在了技术层面考虑,推荐的东西自己还是要慎用!

Apollo 1154

游戏客户端开发工程师笔试题

1、已知有一个关键字序列:(27,23,34,14,1,55, 20,19,85,83,10,68)散列存储在一个哈希表中,若散列函数为H(key)=key%7,并采用链地址法来解决冲突,则在等概率情况下查找成功的平均查找长度为(4、出现死锁时,除了可以采用资源剥夺的方法解决死锁问题外,还可以使用的方法是()是被限定只能在表的一端进行插入运算,在另一端进行删除运算的线性表.5、大端模式,是指数据的高字节保存在内存的(3、在二叉查找树中, 最好情况下复杂度为。)地址中,而数据的低字节保存在内存的(

博客 1871

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

使用 SecureRandom 产生随机数原理和问题

SecureRandom.getInstanceStrong()

weixin_39106547的博客 1447

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SecureRandom.getInstanceStrong() 导致线程阻塞

如无特殊要求,可用Random random = new SecureRandom();真是史前巨坑,上生产环境导致线程阻塞,靠打印日志一点点定位这行代码。

523

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SecureRandom.getInstance()导致线程阻塞发生

SecureRandom.getInstance()导致线程阻塞发生的复盘

qq_45559536的博客 1752

SecureRandom.getInstanceStrong() 与虚拟机的爱恨情仇

SecureRandom.getInstancestrong()方法会返回一个"强"随机数生成器,它需要收集足够的系统熵(随机性)才能生成随机数。在某些系统环境下,特别是虚拟机或源不足的服务器上,这个过程可能会阻塞很长时间,等待系统收集足够的随机熵。使用Ruoyi-cloud 二开,将服务部署到虚拟机上后,准备登录,发现验证码一致加载不出来,接口请求超时!

m0_51262652的博客 270

Java 8 SecureRandom 生成随机数

Java 8的SecureRandom API对原有的有几个变化 根据Oracle,已经做出了以下有趣的变化: 对于类UNIX平台,已经引入了两个新的实现,它们提供了阻塞和非阻塞行为:NativePRNGBlocking和NativePRNGNonBlocking。所述getInstanceStrong()方法是在JDK 8中引入此方法返回的每个平台上可用的最强SecureRa

Hatsune_Miku_的博客 3万+

SecureRandom.getInstanceStrong()问题

转载自:SecureRandom.getInstanceStrong()引发的线程阻塞问题分析

qq_39217714的博客 861

使用SecureRandom.getInstanceStrong() 遇到的深坑

解决 double nonce = SecureRandom.getInstanceStrong() 在华为云CCE 执行时间过长问题

liulinnnnnnnnnn的博客 1282

python如何设计工具类_常用工具类

Java的核心库提供了大量的现成的类供我们使用。本节我们介绍几个常用的工具类。Math顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态方法来便于我们实现数学计算:求绝对值:Math.abs(-100); // 100Math.abs(-7.8); // 7.8取最大或最小值:Math.max(100, 99); // 100Math.min(1.2, 2.3); // 1.2计算xy...

weixin_39522312的博客 346

SecureRandom.getInstanceStrong()造成Jenkins流水线编译卡顿

最近在整改sonar扫描的问题,有一个是不允许随机数直接去new Random(),sonar提供的解决办法是用SecureRandom.getInstanceStrong()替换new Random(),整改之后在本机测试没有问题,上传后git仓流水线后一直卡在改动后的类 查询资料看到SecureRandom.getInstanceStrong()在windows和liunx’下加载的不同的随机数库,取完熵之后会造成线程阻塞,因系统用随机数生成流水号,并发量要求也不是很高,并且在前面增加有时间,故使用ne

qiuhui123456的博客 1259

SecureRandom 引发的线程阻塞

写在前面--每个人都是在不断碰壁中获得成长,bug的逼格越高, 成长速度越快。 本人上周亲手写下了一个牛逼的bug,直接导致的结果是,晚上12点升级后台接口以后,第二天早上7点多开始,所有的app页面出现卡顿,白屏。公司研发老总,迅速召集公司运维大佬,产品大佬,研发大佬奔赴公司解决bug。所有人,开始手忙脚乱,查看线上日志,抓包,阿尔萨斯监听 接口耗时。各个大神,各种手段,各显才...

guorun18的专栏 8837

SecureRandom生成随机数慢(阻塞)问题解决记录

Java的随机数实现有很多坑,记录一下这次使用jdk1.8里新增的加强版随机数实现SecureRandom.getInstanceStrong()遇到的问题。 之前在维护ali-tomcat的时候曾发现过jvm随机数算法选用不当导致tomcat的SessionID生成非常慢的情况,可以参考JVM上的随机数与熵池策略和Docker中apache-tomcat启动慢的问题这两篇文章。不过当时...

liinux-Talk is cheap,show me the code. 4021
上一篇: 设计模式-适配器模式 Java
下一篇: 设计模式-装饰模式 Java
刘火锅
博客等级 码龄7年 121粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值