Encryption 使用SHA1作为链中最内层散列的散列

Encryption 使用SHA1作为链中最内层散列的散列,encryption,cryptography,sha,Encryption,Cryptography,Sha,客户端程序(我无法控制)正在通过向我发送密码进行身份验证,密码散列为SHA1(密码) 我不愿意在我的数据库中仅使用SHA1散列存储密码,因此我建议将密码散列存储在数据库中,作为SHA256(SHA1(密码))(其中密码使用PBKDF-2或类似的方法在多次迭代中散列) 我的问题是:在这个场景中,使用SHA1的最内部散列是否有任何不安全的地方?我意识到冲突的可能性会增加,但由于这只是为了在数据库中存储密码,我认为我不需要担心这一点。还有什么我遗漏的吗?在进行最终加密之前,考虑添加每行唯一的salt。

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

我不愿意在我的数据库中仅使用SHA1散列存储密码,因此我建议将密码散列存储在数据库中,作为
SHA256(SHA1(密码))
(其中密码使用PBKDF-2或类似的方法在多次迭代中散列)


我的问题是:在这个场景中,使用SHA1的最内部散列是否有任何不安全的地方?我意识到冲突的可能性会增加,但由于这只是为了在数据库中存储密码,我认为我不需要担心这一点。还有什么我遗漏的吗?

在进行最终加密之前,考虑添加每行唯一的salt。例如:

假设您收到了
W6ph5Mm5Pz8GgiULbPgzG37mj9g=
(密码
的加密)。它与一个用户相关联,该用户应该具有唯一的密钥,例如用户ID和/或用户名

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

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


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

如果客户端总是向您发送相同的密码,只需进行SHA1散列,那么SHA1散列输出就是密码,无论出于何种目的。将其处理并以相同的方式存储您可以使用任何其他密码,例如使用PBKDF2、SCrypt或BCrypt。

进行(可能)更正确地回答这个问题,请尝试PBKDF-2使用base64或任何其他冗余的扩展。添加salt(无论是用户的内部唯一ID还是存储在其记录中的其他不可变的ID)始终是一个好主意。确定性数据,如用户ID,对于salt来说不是一个好选择。也不是发明自己的salt密码系统-这就是PBKDF2和其他密码散列原语存在的原因。谢谢你的回答。但是,我想知道为什么我应该关心是否会发生冲突?你真的不应该-但是你在问题中提到了冲突。冲突会让你担心的唯一真正原因是有人能够访问你的数据库and试图破解密码。冲突的密码散列将允许黑客同时找到多个帐户的工作密码。不过,这并不比两个用户选择相同的密码差。更大的好处是在散列中添加了盐。