客户端程序(我无法控制)通过向我发送密码进行身份验证,密码为SHA1(password)
.
我不愿意在我的数据库中存储仅使用 SHA1 散列的密码,所以我建议将密码存储在散列为的数据库中SHA256(SHA1(password))
(其中密码使用 PBKDF-2 或类似的东西在多次迭代中散列)。
我的问题是:在这种情况下,使用 SHA1 的最内层哈希有什么不安全的地方吗?我意识到冲突的可能性会增加,但由于这只是为了在数据库中存储密码,我认为我不需要担心这一点。还有什么我想念的吗?
客户端程序(我无法控制)通过向我发送密码进行身份验证,密码为SHA1(password)
.
我不愿意在我的数据库中存储仅使用 SHA1 散列的密码,所以我建议将密码存储在散列为的数据库中SHA256(SHA1(password))
(其中密码使用 PBKDF-2 或类似的东西在多次迭代中散列)。
我的问题是:在这种情况下,使用 SHA1 的最内层哈希有什么不安全的地方吗?我意识到冲突的可能性会增加,但由于这只是为了在数据库中存储密码,我认为我不需要担心这一点。还有什么我想念的吗?
如果客户端总是向您发送相同的密码,只是 SHA1 散列,那么 SHA1 散列输出就是密码,用于所有意图和目的。以与任何其他密码相同的方式处理和存储它,例如使用 PBKDF2、SCrypt 或 BCrypt。
考虑在进行最终加密之前添加每行唯一的盐。例子:
假设您收到W6ph5Mm5Pz8GgiULbPgzG37mj9g=
(的 SHA1 加密"password"
)。这与用户相关联,该用户应具有唯一键,例如用户 ID 和/或用户名。
我的建议 - 为了避免冲突 - 将 Bytes 转换为 Base64String (在 C# 中,这将是Convert.ToBase64String( byteVariable )
- 然后连接到用户的唯一 ID 的字符串上(使新字符串类似于:
W6ph5Mm5Pz8GgiULbPgzG37mj9g=+103
(我添加+103
以反映用户的 ID) - 然后应用您的 SHA256 算法。这将产生:mNXRjWsKJ7V+BHbAuwJJ7neGT+V1IrLQSQXmb4Vv1X8=
- 您可以将其存储在数据库中。SHA256 哈希 - 消除了不太安全的 SHA1 算法的冲突。
而且 - 由于您使用的是单向加密 - 当您将来检查密码是否有效时,您只需在检查之前再次附加用户的 ID。