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