2

客户端程序(我无法控制)通过向我发送密码进行身份验证,密码为SHA1(password).

我不愿意在我的数据库中存储仅使用 SHA1 散列的密码,所以我建议将密码存储在散列为的数据库中SHA256(SHA1(password))(其中密码使用 PBKDF-2 或类似的东西在多次迭代中散列)。

我的问题是:在这种情况下,使用 SHA1 的最内层哈希有什么不安全的地方吗?我意识到冲突的可能性会增加,但由于这只是为了在数据库中存储密码,我认为我不需要担心这一点。还有什么我想念的吗?

4

2 回答 2

1

如果客户端总是向您发送相同的密码,只是 SHA1 散列,那么 SHA1 散列输出就是密码,用于所有意图和目的。以与任何其他密码相同的方式处理和存储它,例如使用 PBKDF2、SCrypt 或 BCrypt。

于 2012-10-26T11:27:42.143 回答
1

考虑在进行最终加密之前添加每行唯一的盐。例子:

假设您收到W6ph5Mm5Pz8GgiULbPgzG37mj9g=(的 SHA1 加密"password")。这与用户相关联,该用户应具有唯一键,例如用户 ID 和/或用户名。

我的建议 - 为了避免冲突 - 将 Bytes 转换为 Base64String (在 C# 中,这将是Convert.ToBase64String( byteVariable )- 然后连接到用户的唯一 ID 的字符串上(使新字符串类似于:

W6ph5Mm5Pz8GgiULbPgzG37mj9g=+103(我添加+103以反映用户的 ID) - 然后应用您的 SHA256 算法。这将产生:mNXRjWsKJ7V+BHbAuwJJ7neGT+V1IrLQSQXmb4Vv1X8=- 您可以将其存储在数据库中。SHA256 哈希 - 消除了不太安全的 SHA1 算法的冲突。

而且 - 由于您使用的是单向加密 - 当您将来检查密码是否有效时,您只需在检查之前再次附加用户的 ID。

于 2012-10-25T20:42:30.900 回答