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

How can I use 3DES securily in Java?

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

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

引用NIST SP800-57 part 1: Recommendation for Key Management (part 1)

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

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

要以最安全的方式使用 3DES,只需使用 "DESede" KeyGenerator.

生成一个 192 位密钥
KeyGenerator keyGen = KeyGenerator.getInstance("DESede");
keyGen.init(168);
SecretKey desABCKey = keyGen.generateKey();

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

设置 FIPS 模式无济于事,因为这似乎只是实现 TLS 的 "Sun" JSSE 提供程序的一个选项。如果您有来自其他供应商的加密提供程序,它可能会有所帮助。

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


应该使用 AES,因为它更安全、更快、更适合未来、具有更大的块大小、没有弱密钥、完全随机化的密钥(等等) .等)。