首页 > 其他分享 >SecureRandom随机数引起的故障

SecureRandom随机数引起的故障

时间:2023-11-06 21:33:33浏览次数:28  
标签:Random random 阻塞 故障 随机数 security SecureRandom

故障现象:

接口大面积超时(数十秒到十多分钟不等)、接口大面积报错(比如连接池报错);
常见监控如 JVM、数据库连接、SQL 查询、网络、请求量都没有异常。

问题分析:

问题开始于修复 Sonar 问题

public class MathUtils {

    /**
     * 根据长度,生成指定位数的随机数
     */
    public static String genRandomNumber(Long len){
        Random random = new Random();//这里会被Soanr检测出代码异味
        StringBuilder result = new StringBuilder();
        for(int i=0;i<len;i++){
            result.append(random.nextInt(10));
        }
        return result.toString();
    }
}

Sonar 给出的建议如下:
Alt text
建议中提到,Random 不应该作为局部变量,否则每次生成随机数都会 new 一个 Random 变量。这部分建议是没问题的,问题在于下面的代码建议。

// SecureRandom is preferred to Random
private Random rand = SecureRandom.getInstanceStrong();  
public void doSomethingCommon() {
  int rValue = this.rand.nextInt();
  //...

代码中建议使用 SecureRandom 来替代 Random。SecureRandom 对象是把双刃剑,一方面,SecureRandom 被称为“真随机数”,适合对随机数要求特别高的场景;另一方面,SecureRandom 又可能引发性能问题,下面简单介绍一下来龙去脉。
首先,Java 的 Random 类是有一些缺陷的,参见 初看一脸懵逼,看懂直接跪下! - 掘金,不适合对随机数要求高的场景。为了弥补这个缺陷,Java 提供了 SecureRandom,SecureRandom.getInstanceStrong() 会读取 Linux 中的 /dev/random 生成种子。 /dev/random 是一个阻塞数字生成器,通过监听键盘和鼠标输入以及磁盘活动等活动来生成随机数,当没有足够的随机事件时,就会阻塞 JVM,表现就是程序卡在 SecureRandom.getInstanceStrong() 这个方法,进一步会造成接口相应慢,超时重试、数据库连接池里没有可用连接等等一堆问题。这个问题在 k8s 集群中尤其明显,因为很多服务可能都都在消耗随机数。

进一步看,生成随机数最终调用的是 sun.security.provider.NativePRNG.generateSeed() 方法,这个方法读取的是上文提到的 /dev/random。 与此相对的,是sun.security.provider.NativePRNG.generateSeed() 方法,它读取的是 /dev/urandom ,这个方法不会导致阻塞。虽然 NativePRNG 是阻塞的,但是一些资料上提到它的性能会好一些, web 应用还是要使用这个方法。
SecureRandom.getInstanceStrong() 方法会根据 JVM 运行的系统,去调用它所认为最优的方法,比如在 Linux 系统中,调用的就是 sun.security.provider.NativePRNG.generateSeed()。

关于熵值的常见命令:
cat /proc/sys/kernel/random/poolsize //查看熵池容量

cat /proc/sys/kernel/random/entropy_avail && date //打印可用的熵及日期

//每个2s打印一下可用的熵,方便看熵的使用情况
while(true) do cat /proc/sys/kernel/random/entropy_avail && date sleep 2 done
正常情况下的熵:熵值一直是等于熵池容量的,这里的熵池容量是3754
img
异常情况下的熵。可以看到熵值有明显抖动,根据经验,熵池下降到 2000 左右,阻塞就会非常严重了
img

参考资料:

使用 SecureRandom 产生随机数采坑记录
https://cloud.tencent.com/developer/article/1558293
随机数SecureRandom在Linux下阻塞
https://segmentfault.com/a/1190000039268233
Proper use of Java SecureRandom
https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom.html
关于熵的一些命令
https://cloud.tencent.com/developer/article/1634848

标签:Random,random,阻塞,故障,随机数,security,SecureRandom
From: https://www.cnblogs.com/neuqdarcy/p/17813795.html

相关文章

  • java如何生成一个随机数,并写出生成原理和执行过程
     在Java中,生成随机数通常可以通过以下几种方式:使用 Math.random() 方法使用 Random 类使用 SecureRandom 类(更安全的随机数)1.使用 Math.random() 方法Math.random() 方法返回一个 double 类型的值,范围在0.0(含)至1.0(不含)之间的随机数。这个方法实际上是 java.u......
  • 解决美颜SDK集成:技术最佳实践和故障排除
    美颜SDK已成为许多应用的核心功能,因为它可以增强用户体验,提高图像质量,吸引更多的用户。然而,集成美颜SDK并不总是一帆风顺。本文将为您介绍一些关键的技术最佳实践,以及如何排除集成过程中可能遇到的故障。一、技术最佳实践1.选择合适的美颜SDK在集成美颜SDK之前,首要任务是选择一个适......
  • java随机数
    在Java中生成随机数可以使用java.util.Random类或者java.lang.Math类的静态方法,也可以使用Java8引入的java.util.concurrent.ThreadLocalRandom类。参考文章:java怎么产生随机数使用java.util.Random类:importjava.util.Random;publicclassMain{publicstaticvoid......
  • 随机数算法
    $rand()$范围:0-32767不是真正的随机,只是因为周期很长,看起来像如果不进行初始化,每次输出的结果是相同的#include<bits/stdc++.h>usingnamespacestd;signedmain(){ freopen("1.out","w",stdout); for(inti=1;i<=10;i++){ cout<<rand()&l......
  • 基于PLC控制的粮食脱粒机设备如何实现故障监控与高效运维
    粮食脱粒机广泛应用于农业、粮食加工等领域,如小麦、玉米、大豆等作物的脱粒,是一种用于将谷类作物脱粒脱壳,并对粮食进行清理和筛选的机械设备。 传统的粮食脱粒依靠人力工作,存在劳动强度大、工作效率差、粮食损耗高等问题,随着PLC逐渐应用到粮食机械中,为农业带来便捷的管理方式与更......
  • 称重式液体灌装机物联网解决方案,远程监控,故障报警
    称重式液体灌装机是一种用于将液体或半固体物料进行自动化灌装的机器设备。它主要由灌装系统、封口系统、输送系统和控制系统组成。在食品、医药、化工、建材等行业中,称重式液体灌装机的自动化改造是一个非常重要的环节,可以提高生产效率和产品质量,有效降低生产成本。 为加强称重式......
  • Tomcat 故障案例排错
    案例一、Tomcat开机自启动故障01、Tomcat 开机自启动方式,通过systemctl 设置开机自启动(点击此处查看二进制安装如何通过systemclt 管理服务)02、修改/etc/rc.d/rc.local,在里面添加/app/tools/tomcat/bin/startup.sh 启动命令开机自启动发现系统重启后,Tomcat启动失败,......
  • python实现定时器产生随机数
    【精选】python实现定时器_python定时器-CSDN博客参考的这位博主的python定时器题目长这样:编写一个程序从1~20里随机产生3个数每过5秒加一次,连续加三次后输出结果,下面是代码#-*-coding:utf-8-*-importthreadingimporttimeimportrandomcancel_tmr=Falsecount=0......
  • 【技术分享】Amazon RDS MySQL常见故障分析和排查
    在亚马逊云的RDS中支持几乎主流的数据库,对于亚马逊云中的数据库的问题排查对于我们的日常业务的稳定运行会很有帮助。本篇将对于Amazon RDSMySQL常见故障问题的分析和排查办法。RDS提供了强大的适配工作负载功能对于RDS的责任共担RDS常见连接问题Check:√客户端IP地址是否在D......
  • MySQL系列:binlog日志详解(参数、操作、GTID、优化、故障演练)
    目录简介作用系统参数--log_bin--server_id--binlog_format--sync-binlog(双一标准)--gtid-mode(gtid)--enforce-gtid-consistency(gtid)--expire-logs-day(优化参数)--binlog_cache_size(优化参数)--max_binlog_cache_size(优化参数)--max_binlog_size(优化参数)sql_log_bin日志操作开启日......