- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们正在使用与 java 安装捆绑在一起的 keytool 来生成 key 以进行非对称 RSA 加密。鉴于近期events有人问我在 java keytool 的幕后发生了什么。特别是关于结果数字的随机性。 (例如“嗯,为什么没有像鼠标移动或键盘输入这样的随机用户输入?”
那么 java keytool 创建 key 的“随机源”是什么?
我自己进行了快速研究,但我发现的唯一信息是 post从 2000 年开始:
- The keytool.exe uses the SecureRandom as basis of its random numbers.
- The Sun provider for SecureRandom follows the IEEE P1363 standard,
- the Sun SecureRandom provider complies with NIST's FIPS PUB 140-1 section 4.11.
- The Sun provider for SecureRandom mixes in other sources of entropy with the results from the thread contention process. Among other things this includes the current time, the state of the VM's memory usage, system properties, and file system activity.
- The algorithm can perform poorly in the absence of a JIT and so we are considering supplying an alternative provider which will take advantage of platform specific support for an entropy gathering device such as /dev/random or the Pentium III thermal-noise RNG.
但是这是在 2K 时的,所以你们中的某个人可能会对此有所了解并提供对上述内容的更新(在 Java7 中有所不同?)。根据您的回答,如果您建议切换到另一个供应商,如 bouncycaSTLe,我会很感兴趣...
更新:我现在假设 keytool 使用 java.security.SecureRandom(因此是默认提供程序)作为其随机数的基础。我发现了另一个有趣的 article ,它指向我控制 SecureRandom API JAVA_HOME/lib/security/java.security 的配置的文件
里面写着:
Select the source of seed data for SecureRandom. By default an attempt is made to use the entropy gathering device specified by the securerandom.source property. If an exception occurs when accessing the URL then the traditional system/thread activity algorithm is used. On Solaris and Linux systems, if file:/dev/urandom is specified and it exists, a special SecureRandom implementation is activated by default. This "NativePRNG" reads random bytes directly from /dev/urandom. On Windows systems, the URLs file:/dev/random and file:/dev/urandom enables use of the Microsoft CryptoAPI seed functionality.
securerandom.source=file:/dev/urandom
由于我们在 Windows 系统上,我假设 Microsoft CryptoAPI用来。由于使用的是 Win7,因此它是 CNG(CryptoAPI Next Generation)。 有人知道“Microsoft CryptoAPI 种子功能的用途”吗?是什么意思? 最可能的方法似乎是:CryptGenRandom function
更新:Oracle 似乎改进了 Java 8 的一些问题.
最佳答案
我想在这里分享我的发现:
keytool.exe 使用 SecureRandom 作为其随机数的基础,如其源代码所示:Keytool和 CertAndKeyGen .
通常,作为 SecureRandom API 状态:“加密强随机数最低限度地符合 FIPS 140-2,加密模块安全要求,第 4.9.1 节中指定的统计随机数生成器测试。”因此,SecureRandom 的所有实现都应符合 FIPS-140-2 .
安全提供程序(因此也适用于 SecureRandom)的配置在 JAVA_HOME/lib/security/java.security
中完成。默认值为(列表顶部):security.provider.1=sun.security.provider.Sun
如果不更改 3.) 在 Linux 上,SecureRandom 的默认实现是 NativePRNG ,而在 Windows 上默认为 SHA1PRNG .在我们的例子中,它是一台生成 key 的 Windows 电脑,因此它是 SHA1PRNG
。
查看 implementation 时以下是突出的:
"Note that if a seed is not provided, we attempt to provide sufficient seed bytes to completely randomize the internal state of the generator (20 bytes). However, our seed generation algorithm has not been thoroughly studied or widely deployed."
SeedGenerator (所有 SHA1PRNG SecureRandom 对象的单例)的“种子源”顺序如下:
现在发现 SHA1PRNG 存在以下问题:
"A black box test with a generated file of 500MB, however, showed the existence of statistical biases of the output by an order of 15."
Statistical bias II (第 1 页)
"The experimental results in this paper show that sequences produced by pseudorandom generators SHA1PRNG (in Java) could be distinguished from uniformly chosen sequences with a high probability"
Poor variance (第 12 页)和有限状态大小(第 9 页)
"The random bytes had grave difficulties with the STS tests, failing Monobit, Runs and the first eight Serial tests. This indicates poor variance in single bits and tuples up to eight bits." AND "In Java adding more entropy (>160bit) to an instance will not enhance security. This limitation is alarming, since it renders the PRNGs useless for key generation > 160 bit (as e.g., in AES' case)."
结果是:
因此可以假设 Java key 生成机制(至少在 Windows 上)已损坏。因此,大多数作者建议使用一些硬件,如 HSM/TRNG .
关于Java keytool/用java生成 key 的安全性(一般),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19119751/
我正在使用keytool创建一个csr。我想知道选项-genkey和-genkeypair有什么区别。我的理解是-genkey仅创建私钥,而-genkeypair同时创建私钥和公钥。如果是这样,我如何
我正在尝试生成一个 keystore 。我已经为 keystore 设置了密码,但我试图不为 key 设置密码。 keytool -storepass "$password" -keystore ${
我无法使用 keytool (java 8) 更改 PKCS keystore 密码。当我尝试更改 key 密码时: keytool -keypasswd -keystore keystore.p12
我尝试从 Java bin 目录执行 keytool,但我收到警告 bash: keytool: command not found 的错误。 root@xxxxxx]# keytool -genke
当我执行这个命令时: keytool -list -keystore %JAVA_HOME%/jre /lib/security/cacerts 我收到了这个输出: ascom-ws, 27.05.2
试图为 android 构建版本。我跑了keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000
正在尝试将证书添加到 keystore ,以便我可以在基于 Java 的应用程序中使用它。这对我来说是一个新概念。 我有该站点的 .p7b 证书,我将一个 keytool 命令放在一起。我输入的时候提
我正在尝试通过 HTTPS 连接 Java Web API;但是,抛出异常: javax.net.ssl.SSLHandshakeException: sun.security.validator.V
批处理文件: REM Create a keystore cd C:\Users\chatt\ChessClockIFACE del debug.keystore echo %JAVA_HOME% D
我想创建一个大小为 128 位的 TDES key ,因此我使用 keytool 通过以下命令生成 jceks。当我在 C:\Program Files (x86)\Java\jdk1.8.0_25\
我尝试从命令行运行 keytool,但收到以下错误: 要使用“keytool”命令行工具,您需要安装 JDK 我安装了 Android Studio,所以我假设我在某个地方有 JDK。 我进入了/Li
是否可以使用keytool生成长期有效的CSR? 当我使用 keytool 命令生成 CSR 时,我总是得到的有效期只有 3 个月。 请告诉我是否有办法生成有效期更长的 CSR。 Valid from
我目前正在尝试firebase的新功能,它要求我提供“调试签名证书SHA-1”,我已经阅读了如何获取代码的文档,但我不知道在哪里可以找到“keytool” .顺便问一下,这段代码的功能是什么,如果我不
我正在尝试生成一个 keystore 文件来签署我的 React Native Android 应用程序并将其发布到 Play 商店。 我正在尝试按照本文档中的说明进行操作:https://faceb
我正在阅读 Facebook 开发人员的开发指南,地址为 here。 它说我必须使用 keytool 来导出我的应用程序的签名,例如: keytool -exportcert -alias andro
我试图在 Mac OS x 上提取 MD5 指纹并面临 2 个问题: 1) 我的 debug.keystore 在哪里 我在系统的任何地方都找不到 .android 文件,它应该在/Users/tug
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
在尝试导入证书时出现无法导入的错误,因为本例中的别名 (tomcat) 已经存在 $ keytool -import -v -alias tomcat -file tomcat.crt -keysto
在我看来,几乎没有任何好的工具可以帮助 webapp 部署者保护他们的环境。我觉得很多部署问题都是因为管理员没有得到适当的工具来忽略 TLS/SSL 的复杂性。我曾经有幸在 websphere 或 w
我正在尝试将 jks 证书转换为 bks 但显示下一个异常: 导入别名 myalias 条目时出现问题:java.security.KeyStoreException:java.io.IOExcept
我是一名优秀的程序员,十分优秀!