代码之家  ›  专栏  ›  技术社区  ›  user1493834

如何在Java中安全使用3DES?

  •  -1
  • user1493834  · 技术社区  · 9 年前

    根据NIST的研究,3DES不是一个好密码。但经过大量阅读后,我明白了缺点是在实现中(使用弱、半弱和组合),而不是在规范中。

    我们使用Oracle JSSE/JCA(JDK 1.7)。如何验证3DES密码是较弱的密码?启用FIPS模式有帮助吗?

    参考 NIST SP800-57 part 1: Recommendation for Key Management (part 1)

    1 回复  |  直到 9 年前
        1
  •  1
  •   Maarten Bodewes    9 年前

    据我所知,FIPS仍然允许TDEA与3个独立密钥(3个密钥3DES)一起使用。使用带有单个密钥的3DES当然是DES,而且DES已经有一段时间不安全了。使用2键3DES(DES-ABA)现在也不再符合FIPS。

    不幸的是,Java只支持3个密钥3DES(DES-ABC)。这意味着许多开发人员在需要实现DES-ABA时,只需复制第一个DES密钥作为第三个密钥。检测这种键的唯一方法是将3DES键的第一个和最后一个键部分相互比较。

    要以最安全的方式使用3DES,只需使用“DESede”生成192位密钥 KeyGenerator .

    KeyGenerator keyGen = KeyGenerator.getInstance("DESede");
    keyGen.init(168);
    SecretKey desABCKey = keyGen.generateKey();
    

    请注意,这将生成一个192位密钥,其中24个奇偶校验位被正确设置(168位有效,安全性约为112位)。

    设置FIPS模式没有帮助,因为这似乎只是实现TLS的“Sun”JSSE提供程序的一个选项。它 也许 如果您有其他供应商的密码提供者,请提供帮助。

    至于弱和半弱之间的区别:这可能与用于底层DES分组密码的密钥有关。通常,您不应该验证密钥本身是弱的,而应该验证实现。只要密钥具有足够的熵,就可以安全地忽略生成弱密钥的可能性。


    应该 使用AES是因为它更安全、更快、更经得起未来考验、具有更大的块大小、没有弱密钥、完全随机化密钥(等等)。