更改加密算法

5
有没有好的教程可以将Java应用程序中的PBEWithMD5AndDES加密算法更改为AES?特别是,我想知道在将此算法更改为更安全的算法时应该注意什么预防措施。在算法更改之前和之后检查任何重要的测试案例。另一个问题是,由于我使用了PBEWithMD5AndDES,大多数用户密码都使用该算法进行加密。因此,如果我将我的算法更改为AES,我如何确保旧算法解密密码,同时仍然可以使用新算法进行任何新的加密。

SHA-256不是加密算法,而是哈希算法! - Joachim Sauer
啊!从MD5到SHA-256。我感觉肚子很奇怪。这可能吗? - Nishant
@Nishant:为什么不可能呢?我没有看到任何问题。 - Kris
5个回答

4
通常情况下,您不会加密用户的密码,而是使用盐哈希。
从一个加密系统迁移到另一个加密系统可能会有点麻烦,我认为您有两个选择:
1. 在升级过程中解密并重新加密所有密码 2. 添加一个标志来指示所使用的加密方法。所有现有密码显然都将设置为当前标准。新用户将设置为您选择的任何方法,您可以在他们更改密码时迁移其他用户。

2
你可以在其他用户使用旧技术加密的密码进行登录时进行迁移,因为他们将输入其明文版本。如果密码匹配旧方法,则无需等待他们更改密码。 - chelmertz
@chelmertz:很好的观点。无论哪种方式,你都需要跟踪你使用的加密方法。 - brain

3
如果你已经用格式a加密了数据,并且想要开始使用另一种加密方案b,我可以想到两种方法来实现这个目标:
  1. 解密所有数据并使用`b`重新加密。 当你可以将数据存储离线并“一次性修复所有问题”时,这种方法是很好的选择。
  2. 对于每个你尝试解密的项目,首先尝试使用`b`进行解密。如果失败,则使用`a`进行解密。下次尝试加密时,请确保使用`b`。 当你无法将数据存储离线,但希望使用另一种算法加密所有数据时,可以采用这种方法。最终,你的所有数据都将使用另一种算法进行加密。

当需要解密的数据非常大时,您会有什么建议? - yogsma
你的意思是当你的数据存储包含大量记录或单个记录很大时? - David Weiser
@David - 是的,有大量记录,而且我的问题是我实施了'B'方案,我必须删除'A'方案,那么我如何实现你在第二点中提到的内容? - yogsma
@David:“使用另一种算法最终将加密所有数据”只有在您能够以某种方式识别新加密的数据时才是正确的,这应该包含在该解决方案中 :) - chelmertz
@chelmertz:没错。我做了一个(未明说的)假设,即他们会采取行动(比如登录),如果失败了,那么他们会认为他们使用了错误的算法进行解密。然而,这又引入了另一组问题。 - David Weiser

1

更改算法实际上没有任何问题。您需要做的是解密密码文本,然后使用新算法加密生成的明文。这很简单。如果您将在一段时间内执行此过渡,我建议创建一个新的数据库表,跟踪特定实体(基于唯一标识符)是否已转移到新算法。如果是,则仅使用新算法进行解密并忘记它,否则则使用旧算法进行解密。无论如何,所有新的加密都应该使用新算法执行。

现在,这里有第二个问题。为什么要费心解密密码呢?只需保存密码的哈希值并忘记它即可。如果您能够解密密码,则会引入潜在的漏洞。如果恶意用户能够获得您用于加密这些密码的密钥,则他们可以访问密码的明文。不仅如此,用户还可以使用该信息来危及您的系统,如果您的用户在其他网站上使用相同的用户名/密码组合,则这些帐户也将受到威胁。您应该仅存储密码的哈希值(SHA是一个好选择,不要使用MD5),然后当用户尝试登录时,您对输入进行哈希处理并比较两个结果。您无需知道明文密码是什么。

1

1

PBEWithMD5AndDES 是一种方法,可以从用户的密码中派生出一种加密方案,用于保护更多的数据。它不是验证密码的方法,也不是加密密码的方法。

如果您只对密码验证感兴趣,则需要解密密码并用安全哈希替换它们,并在将来匹配哈希。您还需要将密码提醒服务更新为密码重置服务。
问题是,您传递到PBE算法中的密码来自哪里?如果它是应用程序的固定密码,则只需替换它并执行某种升级。观察到,如果将加密的数据存储为文本(无论是十六进制还是base-64编码),则文本输出中可能不会出现某些字符,因此,您可以在前面添加这些字符以指示较新的加密方案。例如,冒号字符 ":" 在 base-64 中不会出现。那样就可以识别已升级和未升级的内容。
如果密码来自用户,则每个用户都有自己的密码派生密码。在这种情况下,只能在用户提供其密码时重新加密使用用户密码的密码的任何数据。

最直接的替换方案将大致为PBEWithSHA256And256BitAES。不幸的是,这在Java 6中不受支持,因此您需要第三方JCE库,例如Bouncy Castle。Bouncy Castle提供了PBEWithSHA256And256BitAES-CBC-BC,这是一个适合的替代方案。

升级密码的过程是具有挑战性的。使用DES加密的任何数据只能使用用户的密码进行解密。我假设您无法访问密码。这意味着只有当知道密码的人提供密码时,才能重新加密数据。您的系统将长时间包含各种密码,因此您需要一种识别转换内容的方法。

如果我们谈论的是文件,您可以更改文件后缀,或存储它们的文件夹。如果我们谈论的是数据库中的BLOBs,则可以在数据库表中添加额外的列以说明加密方法。如果两者都不可能,您可以向数据添加某种形式的标头,以指示已使用新方式加密。这有些冒险,因为您的现有数据没有标头,并且很有可能会意外地与新标头匹配。

还建议保留尚未转换其数据的用户列表,以便提示他们进行转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接