Java keytool / 使用 java 生成密钥的安全性(一般)

2024-04-20

我们使用与 java 安装捆绑在一起的 keytool 来生成密钥以进行非对称 RSA 加密。鉴于近期events https://www.schneier.com/blog/archives/2013/09/the_nsa_is_brea.html有人问我 java keytool 的底层发生了什么。特别是关于结果数字的随机性。 (例如,“呃,为什么没有像鼠标移动或键盘输入这样的随机用户输入?”

那么 java keytool 创建密钥的“随机源”是什么?

我自己做了一个快速的研究,但是我发现的唯一信息是post http://www.mail-archive.com/cryptography@c2.net/msg03141.html从 2000 年开始:

  • keytool.exe 使用 SecureRandom 作为其随机数的基础。
  • Sun 的 SecureRandom 提供商遵循 IEEE P1363 标准,
  • Sun SecureRandom 提供程序符合 NIST 的 FIPS PUB 140-1 第 4.11 节。
  • Sun 的 SecureRandom 提供程序将其他熵源与线程争用过程的结果混合在一起。除其他外 这包括当前时间、虚拟机内存状态 使用情况、系统属性和文件系统活动。
  • 在没有 JIT 的情况下,该算法可能会表现不佳,因此我们正在考虑提供一个替代提供商,该提供商将采取 对熵收集设备的平台特定支持的优势 例如 /dev/random 或 Pentium III 热噪声 RNG。

但这是在 2K 中出现的,所以你们中的某个人可能会对此有所了解并提供对上述内容的更新(Java7 中有所不同?)。根据您的回答,如果您建议切换到像 bouncycastle 这样的其他提供商,我会很感兴趣......

Update: 我现在假设 keytool 使用 java.security.SecureRandom (因此是默认提供程序)作为其随机数的基础。我发现另一个有趣的article http://resources.infosecinstitute.com/random-number-generation-java/,它向我指出了控制 SecureRandom API JAVA_HOME/lib/security/java.security 配置的文件

其中规定如下:

选择 SecureRandom 的种子数据源。默认情况下尝试 是使用由指定的熵收集装置 securerandom.source 属性。如果访问时出现异常 URL,然后使用传统的系统/线程活动算法。 在 Solaris 和 Linux 系统上,如果指定了 file:/dev/urandom 并且它 如果存在,则默认激活特殊的 SecureRandom 实现。 这个“NativePRNG”直接从/dev/urandom 读取随机字节。在 Windows 系统,URL 文件:/dev/random 和 file:/dev/urandom 允许使用 Microsoft CryptoAPI 种子功能。

securerandom.source=文件:/dev/urandom

由于我们使用的是 Windows 系统,我假设微软加密API http://en.wikipedia.org/wiki/Microsoft_CryptoAPI用来。由于Win7使用的是CNG(CryptoAPI Next Generation)。有谁知道“Microsoft CryptoAPI 种子功能的用途”是什么。方法?最可能的方法似乎是:CryptGenRandom function http://msdn.microsoft.com/en-us/library/aa379942%28VS.85%29.aspx

Update: Oracle 似乎已经改善了一些问题Java 8 https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html.


我想在这里分享我的发现:

  1. keytool.exe 使用 SecureRandom 作为其随机数的基础,如其源代码所示:Keytool http://www.docjar.com/html/api/sun/security/tools/KeyTool.java.html and 证书和密钥生成器 http://www.docjar.com/html/api/sun/security/x509/CertAndKeyGen.java.html.

  2. 通常情况下,作为安全随机 http://docs.oracle.com/javase/7/docs/api/java/security/SecureRandom.htmlAPI 规定:“加密的强随机数至少符合 FIPS 140-2,加密模块的安全要求,第 4.9.1 节中指定的统计随机数生成器测试。”因此 SecureRandom 的所有实现都应符合FIPS-140-2 http://en.wikipedia.org/wiki/FIPS_140-2.

  3. 安全提供程序的配置(因此也适用于 SecureRandom)是在JAVA_HOME/lib/security/java.security。默认值为(列表顶部):security.provider.1=sun.security.provider.Sun

  4. 当不更改 3.) 时,在 Linux 上,SecureRandom 的默认实现是原生PRNG http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/provider/NativePRNG.java,而在 Windows 上,默认值为SHA1PRNG http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/provider/SecureRandom.java。在我们的例子中,它是一个生成密钥的 Windows 电脑,因此它是SHA1PRNG.

  5. 当看着执行 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/provider/SecureRandom.java#SecureRandom以下几点很突出:

    “请注意,如果未提供种子,我们会尝试提供足够的种子 种子字节以完全随机化生成器的内部状态 (20 bytes)。然而,我们的种子生成算法还没有 彻底研究或广泛部署."

  6. The 种子生成器 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/provider/SeedGenerator.java(所有 SHA1PRNG SecureRandom 对象中的单例)的“种子源”具有以下顺序:

    • NativeSeedGenerator() http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/provider/NativeSeedGenerator.java(Linux 上为 /dev/random,Windows 上使用 MS CryptoAPI)
    • URL种子生成器(url) http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/provider/SeedGenerator.java#SeedGenerator.URLSeedGenerator如果属性“securerandom.source”是其他内容
    • 线程种子生成器 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/provider/SeedGenerator.java#SeedGenerator.ThreadedSeedGenerator倒退
  7. 现在发现SHA1PRNG存在以下问题:

    • 不一致之处 http://moi.vonos.net/java/securerandom/
    • 统计偏差一 http://www.ssi.gouv.fr/IMG/pdf/JavaSec-Langage.pdf(第 152 页,法语,如果 n,请使用翻译器。)

      "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."

    • 统计偏差二 https://eprint.iacr.org/2013/441.pdf (pp.1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java keytool / 使用 java 生成密钥的安全性(一般) 的相关文章

随机推荐

  • 如何在输入对话框中预设光标或选择默认答案

    如果创建一个输入对话框inputdlg和默认答案 看起来像这样 我需要哪个回调命令才能使它看起来像那样 这里缺少很多文档 这是为客户提供的一种 豪华服务 但我认为如果它很容易实现的话那就太好了 这个问题实际上已经解决了 因为我发现有一些方便
  • 从 TinyMCE 对话框中获取输入字段值

    all 我很难弄清楚这一点 这是我第二次需要用tinyMCE做一些事情 但这次我找不到答案 这就是我想要做的 我在编辑器上添加了一个按钮 用于打开一个带有单个文本输入字段和一个按钮的新弹出窗口 我想单击按钮并获取在输入字段中设置的值 然后使
  • 使用 和指令重新排序进行基准测试

    到目前为止 我一直在使用传统方法来对并发方法进行基准测试 即测量多次运行的持续时间 template
  • MinGW 作为可靠的 64 位 GCC 编译器

    我担心 64 位 MinGW 编译器作为 Visual C 编译器的替代品的可靠性 例如 假设 C 代码使用 GCC 4 6 2 在 Linux 下完美构建和运行 相应的 MinGW 是否会在 64 位 Windows 下生成类似可靠的可执
  • Java 从基本构造函数调用基本方法

    如何从 Super Super 调用 Super printThree 在下面的示例中 我改为调用 Test printThree class Super Super printThree I want Super printThree h
  • 在 Swift 4 中,扩展声明还不能被覆盖

    我最近将我的代码迁移到Swift 4 我面临一个问题扩展 i e 扩展的声明还不能被覆盖 我已经阅读了多篇重新评估此问题的帖子 但他们都不接受下面描述的场景 class BaseCell UITableViewCell Some code
  • 在 Perl 中如何计算给定正态分布的点的概率?

    Perl 中是否有一个包可以让您计算每个给定点的概率分布高度 例如 这可以在 R 中以这种方式完成 gt dnorm 0 mean 4 sd 10 gt 0 03682701 即x 0点服从正态分布 mean 4 sd 10的概率为0 03
  • Twitter Bootstrap:Affix 在单页应用程序中未触发

    我正在做一个单页应用程序并使用 Twitter Bootstrap 我尝试像这样使用 Affix div 当我刷新页面时 一切正常 引导程序词缀添加了一个类 如下所示 div class affix top 当我超过 100px 后 它会将
  • 使用欧几里德算法计算数组值的最小公倍数

    我想使用欧几里德算法计算值数组的最小公倍数 我正在使用这个伪代码实现 发现于维基百科 https en wikipedia org wiki Euclidean algorithm function gcd a b while b 0 t
  • FTP 二进制 x ASCII 自动选择

    我编写了一个 FTP 插件 使用 python 的 ftplib 我想知道确定给定文件是否应该使用二进制或 ASCII 传输方法的最佳方法是什么 换句话说 自动 传输模式 当我收到有关双线的问题报告时 我开始研究这个问题 并且谷歌搜索发现二
  • 让回调在 JavaScript 中同步工作

    我正在使用一个名为DSBridge https github com wendux DSBridge IOS将移动应用程序 在本例中为 iOS 代码 连接到包含我的应用程序主要逻辑的 javascript 代码 这涉及在不可见的 WKWeb
  • Apache 服务器(xampp)在使用 openssl 函数时崩溃

    我正在尝试使用 php ini 生成私钥 公钥对 服务器 Apache 2 4 3 Win32 OpenSSL 1 0 1c PHP 5 4 7 操作系统是 Windows XP SP3 安装了所有 Windows 更新 我正在尝试执行以下
  • 如何使用 C# 访问 SQLite?

    我正在尝试使用 C ASP NET 以编程方式连接到我的 Sqlite 数据库 string requete sql SELECT FROM USERS connStr Data Source C LocalFolder FooBar db
  • 马根托。将块插入另一个块而不更改模板代码

    我尝试寻找解决方案但没有结果 我的任务是编写模块 它应该将一些 html 插入现有块中 我注意到 当我使用布局 xml 文件时 我可以将我的块插入到一些参考中 例如
  • 无法让简单的 ParseKit 示例正常工作

    我刚刚发现 ParseKit 但似乎无法让它在一个简单的例子中工作 NSString test FOO BAR NSString grammar get grammar txt file and read it into a string
  • AngularJS - 外部模板

    我正在为 和 的每个内容制作一个模板 因为我有很多数据要显示 但都在相同的结构中 这里是index html div 这是 script js function Ctrl scope scope methods name method1 d
  • Windows 11 权限被拒绝(公钥)

    最近升级到 Windows 11 后 我无法通过 SSH 访问服务器 我不断收到permission denied publickey error 我尝试过重新生成新的公钥ed25519而不是已弃用的rsa我仍然遇到同样的错误 我已经看到了
  • 2D 弹跳公式无法正常工作

    我是 Unity 的新手 我正在尝试创建一个弹跳球 所以我做了很多关于弹跳相关物理的研究 我找到了一个公式 Formula 2 V dot N N V 其中 V 是速度矢量 N 是球弹跳表面的法线 这是我的脚本 using UnityEng
  • 主干表视图消耗行视图 - 如何构造?

    我有一组模型希望在表格视图中呈现 每个模型应由表中的一行表示 并且该行应使用模板生成 我应该能够将事件处理程序附加到该行 例如单击 在事件发生时发出有关与该行关联的模型的一些特定信息 我见过类似的事情的一种常见方法是将每一行分解到它自己的视
  • Java keytool / 使用 java 生成密钥的安全性(一般)

    我们使用与 java 安装捆绑在一起的 keytool 来生成密钥以进行非对称 RSA 加密 鉴于近期events https www schneier com blog archives 2013 09 the nsa is brea h