PBEWithMD5AndDES
加密算法更改为AES
?特别是,我想知道在将此算法更改为更安全的算法时应该注意什么预防措施。在算法更改之前和之后检查任何重要的测试案例。另一个问题是,由于我使用了PBEWithMD5AndDES
,大多数用户密码都使用该算法进行加密。因此,如果我将我的算法更改为AES
,我如何确保旧算法解密密码,同时仍然可以使用新算法进行任何新的加密。PBEWithMD5AndDES
加密算法更改为AES
?特别是,我想知道在将此算法更改为更安全的算法时应该注意什么预防措施。在算法更改之前和之后检查任何重要的测试案例。另一个问题是,由于我使用了PBEWithMD5AndDES
,大多数用户密码都使用该算法进行加密。因此,如果我将我的算法更改为AES
,我如何确保旧算法解密密码,同时仍然可以使用新算法进行任何新的加密。a
加密了数据,并且想要开始使用另一种加密方案b
,我可以想到两种方法来实现这个目标:
更改算法实际上没有任何问题。您需要做的是解密密码文本,然后使用新算法加密生成的明文。这很简单。如果您将在一段时间内执行此过渡,我建议创建一个新的数据库表,跟踪特定实体(基于唯一标识符)是否已转移到新算法。如果是,则仅使用新算法进行解密并忘记它,否则则使用旧算法进行解密。无论如何,所有新的加密都应该使用新算法执行。
现在,这里有第二个问题。为什么要费心解密密码呢?只需保存密码的哈希值并忘记它即可。如果您能够解密密码,则会引入潜在的漏洞。如果恶意用户能够获得您用于加密这些密码的密钥,则他们可以访问密码的明文。不仅如此,用户还可以使用该信息来危及您的系统,如果您的用户在其他网站上使用相同的用户名/密码组合,则这些帐户也将受到威胁。您应该仅存储密码的哈希值(SHA是一个好选择,不要使用MD5),然后当用户尝试登录时,您对输入进行哈希处理并比较两个结果。您无需知道明文密码是什么。你可以查看ESAPI - java http://code.google.com/p/owasp-esapi-java/
ESAPI 1.4使用的是PBEWithMD5AndDES,但在2.0中引入了AES
查看他们的邮件链here
你可以查看这两种实现之间的差异
PBEWithMD5AndDES
是一种方法,可以从用户的密码中派生出一种加密方案,用于保护更多的数据。它不是验证密码的方法,也不是加密密码的方法。
最直接的替换方案将大致为PBEWithSHA256And256BitAES
。不幸的是,这在Java 6中不受支持,因此您需要第三方JCE库,例如Bouncy Castle。Bouncy Castle提供了PBEWithSHA256And256BitAES-CBC-BC
,这是一个适合的替代方案。
升级密码的过程是具有挑战性的。使用DES加密的任何数据只能使用用户的密码进行解密。我假设您无法访问密码。这意味着只有当知道密码的人提供密码时,才能重新加密数据。您的系统将长时间包含各种密码,因此您需要一种识别转换内容的方法。
如果我们谈论的是文件,您可以更改文件后缀,或存储它们的文件夹。如果我们谈论的是数据库中的BLOBs,则可以在数据库表中添加额外的列以说明加密方法。如果两者都不可能,您可以向数据添加某种形式的标头,以指示已使用新方式加密。这有些冒险,因为您的现有数据没有标头,并且很有可能会意外地与新标头匹配。
还建议保留尚未转换其数据的用户列表,以便提示他们进行转换。