【问题标题】:In Solaris SecureRandom.setSeed("abc") is bypassed在 Solaris SecureRandom.setSeed("abc") 被绕过
【发布时间】:2013-10-09 14:45:56
【问题描述】:

您好,我有以下 sn-p 代码:

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" , "SUN");
secureRandom.setSeed("seed");
keyGen.init(DEFAULT_KEY_LENGTH, secureRandom);
SecretKey secretKey = keyGen.generateKey();
byte[] encodedKey = secretKey.getEncoded();

“编码密钥”每次在平台窗口、AIX、linux 上都给我相同的结果。 HP-Unix,但它在 Solaris 中给出不同的结果,似乎 setSeed() 不适用于 Solaris 或被绕过,

请帮帮我,从前两天开始我就在这个问题上崩溃了。

谢谢 希瓦姆

【问题讨论】:

  • 为什么要将种子传递给安全的 PRNG?在可能有用的测试中(即使那是值得怀疑的),在生产代码中它肯定不是。如果您想从短密钥中获取随机数据,请使用定义明确的流密码(例如 AES-CTR)。

标签: security random cryptography


【解决方案1】:

SecureRandom.setSeed(long) 上的 Javadoc 说:

给定的种子是对现有种子的补充,而不是替代。

SecureRandomjava.util.Random 的工作方式不同——Random 算法在所有实现中都是标准化的,但不保证 SecureRandom 算法。

还要注意

[...] 传递给 SecureRandom 对象的任何种子材料都必须是不可预测的。

这里不是这样。如果您的种子材料不是不可预测的,那么生成的随机数可能也不会是,因此没有使用加密安全的随机数生成器。

【讨论】:

  • crypt-strong PRNG 提供的保证是您需要大量先前的样本来猜测下一个产生的数字。可预测种子的问题在于,攻击者可以使用先前的观察结果来辅助攻击,从而扩大漏洞窗口。如果种子是完全可预测的,那么他们就可以可靠地猜测。
  • 但是我不明白为什么我每次在 Windows、Linux 和 AIX 上执行我的代码时都能使用相同的密码获得相同的密钥,但只有在 solaris 上我才遇到这个问题。
  • @user2131172 因为 SecureRandom 算法不是标准的。它只是碰巧在您测试过的所有平台上都是相同的,除了 Solaris。 Solaris 算法也遵循规范 - 没有什么可以禁止您遇到的行为。我试图用答案中的最后一句话说的是,在这种情况下,您显然不需要 SecureRandom 的加密安全属性:改用标准化的 Random。
【解决方案2】:

如果你这样声明你的 keyGen keyGen = KeyGenerator.getInstance("DES","SunJCE"); 您可以在 solaris 上获得相同的密钥。 所有其他平台都使用 SunJCE 作为默认提供程序,但 solaris 使用 SunPKCS11-Solaris 作为默认提供程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多