在我正在做的一个项目中,应用程序是使用类似于以下命令启动的:
java -Djava.security.egd=file:/dev/urandom -jar app.jar
我从未见过java。安全之前的egd
选项。稍微搜索一下,它似乎用于在Java应用程序中配置随机数生成。
是这样吗?什么时候应用?
如果您使用的是JDK 8或更高版本,则不再需要此选项
Java已经解决了这个问题,下面是一些链接
大纲
修复了SHA1PRNG和NativePRNG,以正确尊重java.security文件中的SecureRandom种子源属性。(不再需要使用file:///dev/urandom和file:/dev/./urandom的模糊解决方案。)
有关更多信息(在页面中搜索random):
https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html
https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
这与linux/dev/随机
和/dev/urandom
随机数生成器的区别有关。
摘自此链接
JavaBug 6202721指出,java.security.SecureRandom使用 /dev/random而不是 /dev/urandom即使 /dev/urandom是指定的,因为当时(大约2004年) /dev/urandom不能正常工作。这个错误从未被逆转过,因为 /dev/urandom工作得很好。因此,您必须通过使用 /dev/./urandom来模糊设置来伪造它,以强制使用SHA1PRNG而不是 /dev/random.
回答你的问题
什么时候应该申请?
基于上面的链接,这是Java版本5独有的东西,因为2004年Linux系统 /dev/urandom的问题。
TL; DR
如果在支持确定性随机位生成器(DRBG)的现代操作系统上运行Java8,我建议使用-Djava。安全egd=file:/dev/uradom
,以避免意外阻止代码。如果不确定正在使用的操作系统,我的建议是坚持原来的建议,即:-Djava。安全egd=文件:/dev//铀矿
如果运行Java11,我建议只使用-Djava。安全egd=文件:/dev//Uradom
以确保:
securerandom.source=file:/dev/uradom
)请继续阅读以了解详细信息。
Java应用程序可以而且应该使用Java。安全SecureRandom类使用加密强伪随机数生成器(CSPRNG)生成加密强随机值。java的标准JDK实现。util。随机类被认为不是强加密类。
类似Unix的操作系统具有/dev/random
,这是一个特殊文件,提供伪随机数访问从设备驱动程序和其他来源收集的环境噪声。然而,如果可用的熵小于请求的熵,它就会阻塞/dev/uradom
通常从不阻塞,即使伪随机数生成器种子自启动后未使用熵完全初始化。还有第三个特殊文件,/dev/arandom
,它在启动后阻塞,直到种子以足够的熵安全地初始化,然后再也不会阻塞。
默认情况下,JVM使用/dev/random
为SecureRandom类种子,因此Java代码可能会意外阻塞。选项-Djava。安全egd=文件:/dev//用于启动Java进程的命令行调用中的uradom
告诉JVM改用/dev/uradom
。
额外的//
似乎使JVM使用SHA-1的SHA1PRNG算法作为PRNG(伪随机数发生器)的基础。它比指定
/dev/uradom
时使用的NativePRNG算法更强。
最后,有一个神话认为
/dev/urandom
是一个伪随机数生成器,一个PRNG,而/dev/random
是一个“真实”的随机数生成器。这根本不是真的,/dev/random
和/dev/uradom
都是由同一个CSPRNG(加密安全伪随机数生成器)提供的。只有它们的行为不同:/dev/random
根据某些估计,当其随机性池的熵用完时会阻塞,而/dev/urandom
则不会。
那么低熵的系统呢?没那么糟。
事实证明,“看起来随机”是几个密码组件的基本要求,比如网络服务器的短暂会话密钥。如果你取一个密码散列的输出,它与随机字符串是无法区分的,所以密码将接受它。这就是使用SHA1PRNG算法的原因,因为它使用哈希函数和计数器以及种子。
什么时候应该申请?
我想说,总是这样。
来源:
https://gist.github.com/svrc/5a8accc57219b9548fe1
https://www.2uo.de/myths-about-urandom
编辑09/2020:
我已经改变了这个更新来反映测试:
-Java8在现代操作系统
-Java11,因为它是目前的长期支持(LTS)版本。
一条评论提到了Java8中SecureRandom类行为的变化。
修复了SHA1PRNG和NativePRNG,以正确尊重java.security文件中的SecureRandom种子源属性。(不再需要使用file:///dev/urandom和file:/dev/./urandom的模糊解决方案。)
这一点已在上文来源部分中引用的测试中指出。额外的
//
我同意NativePRNG比SHA1PRNG更安全,但只有在现代操作系统上运行时才安全。因此,我相应地更新了我的结论,并将其移至顶部。
不过,我有一些消息想和大家分享。根据JEP-273,自Java 9以来,SecureRandom类实现了NIST 800-90Ar1中描述的三种确定性随机位生成器(DRBG)机制。这些机制实现了与SHA-512和AES-256一样强大的现代算法。
JDK以前有两种SecureRandom实现:
一个依赖于平台,基于本地调用或操作系统设备,例如在Unix上读取/dev/{u}随机
或在Windows上使用CryptoAPI。最新版本的Linux和Windows已经支持DRBG,但旧版本和嵌入式系统可能不支持。
另一种是纯Java实现,它使用较旧的基于SHA1的RNG实现,不如经批准的DRBG机制使用的算法强。
与此同时,《Java11安全开发人员指南》仍在阅读
在Linux和macOS上,如果java.security中的熵收集设备设置为
file:/dev/urandom
或file:/dev/随机
,则NativePRNG优先于SHA1PRNG。否则,优选SHA1PRNG。
为了阐明新的DRBG机制如何与以前的PRNG一起使用,我在macOS(Darwin)上使用了OpenJDK(build 11.0.7 10)进行了一些测试。结果如下:
-Djava。安全egd=file:/dev/random
(这等于默认选项)
默认算法:NativePRNG
提供者:SecureRandom。NativePRNG算法来源:SUN
-Djava。安全egd=file:/dev/uradom
默认算法:NativePRNG
提供程序:SecureRandom。NativePRNG算法来源:SUN
-Djava。安全egd=文件:/dev//Uradom
默认算法:DRBG
提供程序:SecureRandom。DRBG算法来源:SUN
最后,即使在使用现代操作系统时,使用
/dev/uradom
作为随机性源仍然是最重要的,正如我们在这篇非常有趣的文章中所读到的:
共享
/dev/random
对于任何Linux容器技术来说都是一个挑战
虚拟化服务器上的低熵问题由于。。。在同一主机上运行的Linux容器竞争有限的熵。这类问题有时被称为踩踏群。/dev/random
设备是一种稀缺的共享系统资源,Linux容器租户可能没有意识到他们正在共享。当他们都试图同时使用它时,他们实际上是在相互之间造成拒绝服务。
资料来源:
https://www.openssl.org/blog/blog/2017/08/12/random/
问题内容: 在我正在处理的项目中,该应用程序是使用类似于以下命令的启动的: 我从未见过该选项。进行一点搜索,似乎可以用来配置Java应用程序中的随机数生成。 这样对吗?什么时候应该使用? 问题答案: Java应用程序可以并且应该使用 java.security.SecureRandom 类通过使用加密强度高的伪随机数生成器(CSPRNG)来生成加密强度高的随机值。 java.util.Random
本文向大家介绍什么是安全策略?相关面试题,主要包含被问及什么是安全策略?时的应答技巧和注意事项,需要的朋友参考一下 回答:安全策略是一个正式且简短的计划,其中包含组织的目标,目的和信息安全程序。简而言之,它定义了确切地需要保护免受威胁的条件以及在威胁发生时如何处理情况。
1.1 什么是安全渗透 渗透测试并没有一个标准的定义。国外一些安全组织达成共识的通用说法是,渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法,这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析。这个分析是从一个攻击者可能存在的位置来进行的,并且从这个位置有条件主动利用安全漏洞。 渗透测试与其他评估方法不同。通常的评估方法是根据已知信息资源或其他被评估对象,去发现所有
我对Spring和Spring Security都是新手。我在读关于Spring Security的文章,它提出了principal的概念,应该是当前登录的用户。但如果我们有多个当前登录用户呢?那么,我的问题是,在Spring安全中,校长到底是什么? 例如,我已经阅读了本教程: http://www.mkyong.com/spring-security/get-current-logged-in-
问题内容: 我看到了一些命令所在的教程: 该选项是什么意思? 在Google上找不到答案。 问题答案: 更新npm 5: 从npm 5.0.0开始 ,默认情况下已安装的模块作为依赖项添加,因此不再需要该选项。其他保存选项依然存在并在中列出的文件的。 原始答案: 在版本5之前,NPM 默认情况下只是安装了一个软件包。当您尝试为应用程序/模块安装依赖项时,您需要先安装它们,然后将它们(以及适当的版本号
在这种情况下,有人能帮助理解类型安全的含义吗? 我对Javadoc-https://docs . spring . io/spring-framework/docs/3 . 1 . 4 . release/Javadoc-API/org/spring framework/context/annotation/components can . html # base packages()的理解有些不