根据NIST研究,3DES不是一个好的密码。但经过大量阅读后,我了解到实施中的弱点(使用弱,半弱和组合),但在规范中却没有。
我们使用Oracle JSSE / JCA(JDK 1.7)。如何验证3DES密码是否较弱?启用FIPS模式有帮助吗?
参考NIST SP800-57 part 1: Recommendation for Key Management (part 1)
答案 0 :(得分:1)
据我所知,FIPS仍然允许TDEA与3个独立键(3键3DES)一起使用。使用单个密钥的3DES当然是DES和DES一段时间以来一直不安全。使用2键3DES(DES-ABA)现在也不再符合FIPS标准。
不幸的是,Java仅支持3个关键3DES(DES-ABC)。这意味着许多开发人员只需复制第一个DES密钥,以便在需要实施DES-ABA时将其用作第三个密钥。检测此类键的唯一方法是将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,因为它更安全,更快,更具未来证据,具有更大的块大小,没有弱密钥,完全随机化的密钥(等等)。