之前写随机数的时候一直用SecureRandom.getInstanceStrong()方法生成SecureRandom实例,进而调用其各种next方法。突然有一次,发现next方法卡住了, 每一次调用都需要四五分钟。google之,发现网上也有很多其他开发人员在反馈这个问题,有的说在启动的时候提案加    。但是有时候项目不是自己部署的,不是你想用什么命令就用什么命令,想替换什么文件就替换什么文件,比如某安某寿。研究SecureRandom.getInstanceStrong()方法的源码,发现最终调用的是SecureRandom.getInstance()方法,getInstance()方法的入参是Security.getProperty("securerandom.strongAlgorithms")的返回值。经测试,Security.getProperty("securerandom.strongAlgorithms")的返回值在不同平台是不一样。在windows jdk中,返回值是Windows-PRNG:SunMSCAPI,SHA1PRNG:SUN,进SecureRandom.getInstanceStrong()方法,发现最终调用的是SecureRandom.getInstance("Windows-PRNG", "SunMSCAPI"),即算法algorithm是Windows-PRNG,provider是SunMSCAPI。在mac jdk中,返回值是NativePRNGBlocking:SUN,最终调用的是SecureRandom.getInstance("NativePRNGBlocking", "SUN")。在linux jdk中,返回值是。

研究Security的getProperty(String key)静态方法:

读取的是JAVA_HOME/jre/lib/security目录中的java.security属性文件中的内容。可以很容易的在各平台看到securerandom.strongAlgorithms的值。

如果不用SecureRandom.getInstanceStrong()方法的话,可以用什么呢?可以用new SecureRandom(),也可以用getInstance()方法的一堆重载来生成SecureRandom实例。

new SecureRandom(),最终调用的是SecureRandom.getInstance("SHA1PRNG")。

在windows平台jdk的java.security文件中,有这样一段描述:

# Sun Provider SecureRandom seed source.
#
# Select the primary source of seed data for the "SHA1PRNG" and
# "NativePRNG" SecureRandom implementations in the "Sun" provider.
# (Other SecureRandom implementations might also use this property.)
#
# On Unix-like systems (for example, Solaris/Linux/MacOS), the
# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from
# special device files such as file:/dev/random.
#
# On Windows systems, specifying the URLs "file:/dev/random" or
# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding
# mechanism for SHA1PRNG.
#
# By default, an attempt is made to use the entropy gathering device
# specified by the "securerandom.source" Security property. If an
# exception occurs while accessing the specified URL:
#
# SHA1PRNG:
# the traditional system/thread activity algorithm will be used.
#
# NativePRNG:
# a default value of /dev/random will be used. If neither
# are available, the implementation will be disabled.
# "file" is the only currently supported protocol type.
#
# The entropy gathering device can also be specified with the System
# property "java.security.egd". For example:
#
# % java -Djava.security.egd=file:/dev/random MainClass
#
# Specifying this System property will override the
# "securerandom.source" Security property.
#
# In addition, if "file:/dev/random" or "file:/dev/urandom" is
# specified, the "NativePRNG" implementation will be more preferred than
# SHA1PRNG in the Sun provider.
#
securerandom.source=file:/dev/random

#
# A list of known strong SecureRandom implementations.
#
# To help guide applications in selecting a suitable strong
# java.security.SecureRandom implementation, Java distributions should
# indicate a list of known strong implementations using the property.
#
# This is a comma-separated list of algorithm and/or algorithm:provider
# entries.
#
securerandom.strongAlgorithms=Windows-PRNG:SunMSCAPI,SHA1PRNG:SUN

在mac平台jdk的java.security文件中,描述如下:

# Sun Provider SecureRandom seed source.

#

# Select the primary source of seed data for the "SHA1PRNG" and

# "NativePRNG" SecureRandom implementations in the "Sun" provider.

# (Other SecureRandom implementations might also use this property.)

#

# On Unix-like systems (for example, Solaris/Linux/MacOS), the

# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from

# special device files such as file:/dev/random.

#

# On Windows systems, specifying the URLs "file:/dev/random" or

# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding

# mechanism for SHA1PRNG.

#

# By default, an attempt is made to use the entropy gathering device

# specified by the "securerandom.source" Security property.  If an

# exception occurs while accessing the specified URL:

#

#     SHA1PRNG:

#         the traditional system/thread activity algorithm will be used.

#

#     NativePRNG:

#         a default value of /dev/random will be used.  If neither

#         are available, the implementation will be disabled.

#         "file" is the only currently supported protocol type.

#

# The entropy gathering device can also be specified with the System

# property "java.security.egd". For example:

#

#   % java -Djava.security.egd=file:/dev/random MainClass

#

# Specifying this System property will override the

# "securerandom.source" Security property.

#

# In addition, if "file:/dev/random" or "file:/dev/urandom" is

# specified, the "NativePRNG" implementation will be more preferred than

# SHA1PRNG in the Sun provider.

#

securerandom.source=file:/dev/random

#

# A list of known strong SecureRandom implementations.

#

# To help guide applications in selecting a suitable strong

# java.security.SecureRandom implementation, Java distributions should

# indicate a list of known strong implementations using the property.

#

# This is a comma-separated list of algorithm and/or algorithm:provider

# entries.

#

securerandom.strongAlgorithms=NativePRNGBlocking:SUN

在linux平台jdk的java.security文件中,描述如下:

# Sun Provider SecureRandom seed source.

#

# Select the primary source of seed data for the "SHA1PRNG" and

# "NativePRNG" SecureRandom implementations in the "Sun" provider.

# (Other SecureRandom implementations might also use this property.)

#

# On Unix-like systems (for example, Solaris/Linux/MacOS), the

# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from

# special device files such as file:/dev/random.

#

# On Windows systems, specifying the URLs "file:/dev/random" or

# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding

# mechanism for SHA1PRNG.

#

# By default, an attempt is made to use the entropy gathering device

# specified by the "securerandom.source" Security property.  If an

# exception occurs while accessing the specified URL:

#

#     SHA1PRNG:

#         the traditional system/thread activity algorithm will be used.

#

#     NativePRNG:

#         a default value of /dev/random will be used.  If neither

#         are available, the implementation will be disabled.

#         "file" is the only currently supported protocol type.

#

# The entropy gathering device can also be specified with the System

# property "java.security.egd". For example:

#

#   % java -Djava.security.egd=file:/dev/random MainClass

#

# Specifying this System property will override the

# "securerandom.source" Security property.

#

# In addition, if "file:/dev/random" or "file:/dev/urandom" is

# specified, the "NativePRNG" implementation will be more preferred than

# SHA1PRNG in the Sun provider.

#

securerandom.source=file:/dev/random

#

# A list of known strong SecureRandom implementations.

#

# To help guide applications in selecting a suitable strong

# java.security.SecureRandom implementation, Java distributions should

# indicate a list of known strong implementations using the property.

#

# This is a comma-separated list of algorithm and/or algorithm:provider

# entries.

#

securerandom.strongAlgorithms=NativePRNGBlocking:SUN

在commons-lang3.jar包中,提供了两个随机工具类,RandomUtils和RandomStringUtils,可以使用。RandomUtils用于生成一个随机数字,而RandomStringUtils主要是生成一个随机字符串。这俩工具类底层利用的都是Random类,而没有用SecureRandom。

SecureRandom的坑的更多相关文章

  1. 使用 SecureRandom 产生随机数采坑记录

    公众号「码海」欢迎关注 背景 我们的项目工程里经常在每个函数需要用到 Random 的地方定义一下 Random 变量(如下) public void doSomethingCommon() { Ra ...

  2. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

  3. [解决]Linux Tomcat启动慢--Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [236,325] milliseconds

    一.背景 今天部署项目到tomcat,执行./startup.sh命令之后,访问项目迟迟加载不出来,查看日志又没报错(其实是我粗心了,当时tomcat日志还没打印完),一开始怀疑是阿里云主机出现问题, ...

  4. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  5. 【解决】Linux Tomcat启动慢--Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [236,325] milliseconds

    一.背景 今天部署项目到tomcat,执行./startup.sh命令之后,访问项目迟迟加载不出来,查看日志又没报错(其实是我粗心了,当时tomcat日志还没打印完),一开始怀疑是阿里云主机出现问题, ...

  6. 当年用httpclient时踩过的那些坑

    一.前言 httpclient是java开发中最常用的工具之一,通常大家会使用其中比较基础的api去调用远程.长期开发爬虫,会接触httpclient不常用的api,同时会遇到各式各样的坑,本文将总结 ...

  7. 服务器端 CentOS 下配置 JDK 和 Tonmcat 踩坑合集

    一.配置 JDK 时,在 /etc/profile 文件下配置环境变量,添加   #java environment export JAVA_HOME=/usr/java/jdk- export CL ...

  8. 微信公众号支付备忘及填坑之路-java

    一.背景 最近公司给第三方开发了一个公众号,其中最重要的功能是支付,由于是第一次开发,遇到的坑特别的多,截止我写博客时,支付已经完成,在这里我把遇到的坑记录一下(不涉及退款).不得不吐槽一下,腾讯这么 ...

  9. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

随机推荐

  1. 论文翻译:HetConv-Heterogeneous Kernel-Based Convolutions for Deep CNNs

    Abstract 我们提出了一种新颖的深度学习架构,其中卷积操作利用了异构内核.与标准卷积运算相比,所提出的HetConv(基于异构内核的卷积)减少了计算(FLOPs)和参数的数量,同时仍保持表示效率 ...

  2. go的变量定义

    package main //理解包的概念 import "fmt" var ( aa = 1 bb = "kkk" ss = true) func varia ...

  3. Confluence6.9配置邮件服务器

    一.调整confluence服务 1.在confluence安装目录下的server.xml中加一段邮件服务器的配置,加在confluence的Context中 <Context path=&q ...

  4. 利用三层交换机实现VLAN间路由

    利用三层交换机实现VLAN间路由 本实验模拟企业网络场景.公司有两个部门一销 售部和客服部,分别规划使用VLAN 10和VLAN 20.其中销售部下有两台终端PC-1和PC-2,客服部下有一台终端PC ...

  5. laravel框架之批刪&全選&全不選&反選

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 拉勾网python开发要求爬虫

    #今日目标 **拉勾网python开发要求爬虫** 今天要爬取的是北京python开发的薪资水平,招聘要求,福利待遇以及公司的地理位置. 通过实践发现除了必须携带headers之外,拉勾网对ip访问频 ...

  7. php 图像处理 抠图,生成背景透明png 图片

    *自定义一个图片等比缩放函数 *@param string $picname 被缩放图片名 *@param string $path 被缩放图片路径 *@param int $maxWidth 图片被 ...

  8. traceback异常处理相关总结

    traceback模块 作用 traceback模块被用来跟踪异常返回信息 可在控制台输出结果 可将结果传入文件中记录 常用方法 print_exc([limit[, file]]): 会自动处理当前 ...

  9. 2019-11-29-dotnet-获取指定进程的输入命令行

    title author date CreateTime categories dotnet 获取指定进程的输入命令行 lindexi 2019-11-29 08:35:11 +0800 2019-0 ...

  10. pandas的基本功能

    一.重新索引 (1)reindex方式 obj = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4]) print(obj) obj.re ...