栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么是java.security.egd选项?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么是java.security.egd选项?

Java应用程序可以并且应该使用 java.security.SecureRandom
类通过使用加密强度高的伪随机数生成器(CSPRNG)来生成加密强度高的随机值。
java.util.Random 类的标准JDK实现在密码学上不强。

类似于Unix的操作系统具有

/dev/random
特殊文件,该文件提供伪随机数,以访问从设备驱动程序和其他来源收集的环境噪声。但是,
如果可用的熵比请求的少它将阻塞
/dev/urandom
即使自启动以来没有用熵完全初始化伪随机数生成器种子,通常也不会阻塞。还有一个第3个特殊文件,
/dev/arandom
该文件在启动后会阻塞,直到种子被足够的熵安全地初始化为止,然后再也不会阻塞。

默认情况下,JVM 使用来播种 SecureRandom

/dev/random
,因此 您的Java代码可能会意外阻止
-Djava.security.egd=file:/dev/./urandom
用于启动Java进程的命令行调用中的选项告诉JVM
/dev/urandom
代替使用。

多余的东西

/./
似乎使JVM使用SHA1PRNG算法,该算法使用SHA-1作为PRNG(伪随机数生成器)的基础。它比
/dev/urandom
指定时使用的NativePRNG算法强。

最后,有一个神话

/dev/urandom

是伪随机数生成器PRNG,而又
/dev/random
是“真”随机数生成器
。这是不正确的,这两个
/dev/random
/dev/urandom
由相同CSPRNG(密码安全伪随机数发生器)被馈送。只有它们的行为不同:
/dev/random
根据某些估计,当其随机池耗尽熵时会阻塞,而
/dev/urandom
不会。

低熵的系统呢? 还算不错

事实证明,“看起来随机”是几个加密组件(如Web服务器的临时会话密钥)的基本要求。而且,如果采用加密哈希的输出,则它与随机字符串是无法区分的,因此密码将接受它。这就是使用SHA1PRNG算法的原因,因为它使用哈希函数和计数器以及种子。

应该什么时候使用?

我总是说。

资料来源:
https : //gist.github.com/svrc/5a8accc57219b9548fe1
https://www.2uo.de/myths-about-urandom


编辑06/2020:
我已更改此更新以反映对Java 11的测试,因为它是当前的长期支持(LTS)版本。

评论提到Java 8中 SecureRandom 类的行为发生了变化。

SHA1PRNG和NativePRNG已修复,以正确遵守java.security文件中的SecureRandom种子源属性。(不再需要使用file:///
dev / urandom和file:/ dev /./ urandom的变通方法。)

上面“源”部分中引用的测试已经指出了这一点。额外

/./
需要改变所使用的算法 的SecureRandom
在Java中8从NativePRNG到SHA1PRNG。

但是,我确实有一些要分享的新闻。根据JEP-273,从Java 9开始,
SecureRandom 类实现了NIST
800-90Ar1中描述的三种
确定性随机位生成器(DRBG)
机制。这些机制实现了强度高达SHA-512和AES-256的现代算法。

JDK以前有两种 SecureRandom 实现:

  • 一种是平台相关的,并且基于本地调用或OS设备,例如
    /dev/{u}random
    在Unix上阅读或在Windows上使用CryptoAPI。最新版本的Linux和Windows已经支持DRBG, 但是较早的版本和嵌入式系统可能不支持
  • 另一种是使用较旧的基于SHA1的RNG实现的纯Java实现,它不如已批准的DRBG机制使用的算法强大。

同时,《Java
11安全开发人员指南》仍为

在Linux和macOS上,如果java.security中的熵收集设备设置为

file:/dev/urandom
file:/dev/random
,则NativePRNG优于SHA1PRNG。否则,首选SHA1PRNG。

为了阐明新的DRBG机制如何与以前的PRNG一起使用,我在MacOS(Darwin)上使用AdoptOpenJDK(内部版本11.0.7 +
10)进行了一些测试。结果如下:


-Djava.security.egd=file:/dev/random
这等于默认选项
默认算法: NativePRNG
提供程序: SecureRandom.NativePRNG算法来自:SUN

-Djava.security.egd=file:/dev/urandom

默认算法: NativePRNG
提供程序: SecureRandom.NativePRNG算法来自:SUN

-Djava.security.egd=file:/dev/./urandom

默认算法: DRBG
提供者: SecureRandom.DRBG算法来自:SUN


最后,

/dev/urandom
即使在使用现代OS时,用作随机源的问题仍然至关重要,因为我们可以在这篇非常有趣的文章中阅读:多租户Linux容器平台中的随机性挑战。

结论:

我建议继续使用

-Djava.security.egd=file:/dev/./urandom
Java 11以确保:

  1. 无论使用什么平台(DRBG),都可以利用最强大的 SecureRandom 实现
  2. 避免使代码意外阻塞(
    securerandom.source=file:/dev/urandom

资料来源:
https : //www.openssl.org/blog/blog/2017/08/12/random/



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/507608.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号