使用SHA1作为链中最内部哈希的哈希

时间:2012-10-25 20:28:24

标签: encryption cryptography sha

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

我不愿意在我的数据库中仅使用SHA1存储密码哈希,因此我建议将密码存储在数据库中,密码为SHA256(SHA1(password))(其中使用PBKDF-2对密码进行多次迭代的哈希处理或类似的东西)。

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

2 个答案:

答案 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。