我工作的公司已经签订了大型订单处理系统的支持合同。作为初始系统审核的一部分,我注意到存储在数据库中的密码实际上是密码的哈希码。

本质:

string pwd = "some pasword";
string securePwd = pwd.GetHashCode();

我的问题是,这有多安全?

我对此感到不舒服,但我对GetHashCode的工作原理还不太了解。我更喜欢使用类似MD5哈希的东西,但如果我浪费时间,那么我就不会打扰了。

有帮助吗?

解决方案

GetHashCode 返回32位整数作为哈希值。考虑到生日悖论,由于相对较高的碰撞概率,它的哈希值不够长即使它明确设计为抗冲击,但事实并非如此。

您应该使用SHA256或其他用于处理此类任务的加密安全散列函数。

要存储密码,仅使用简单的哈希函数是不够的。你应该添加一些随机的“盐”。每个用户并迭代足够的次数,以便在暴力方面计算成本高昂。因此,您应该使用bcrypt, scrypt ,PBKDF2等大量迭代。

其他提示

您应该使用加密的加密哈希,例如 SHA256Managed

Jeff Attwood在这个主题上有一些好的帖子:

Rainbow Hash Cracking

您可能错误地存储密码

这不仅不安全,而且还可能发生变化:

http://netrsc.blogspot.com/2008/ 08 / GetHashCode的-不同-ON-systems.html

GetHashValue为给定输入返回的值在过去已发生变化。

不能保证在应用程序的不同执行之间它们会相同。

我建议使用 BCrypt 。正如其他人已经说过使用GetHashCode进行密码不是一个好主意。

GetHashCode绝对不是以这种方式使用的,因为实现不保证不同对象的不同哈希返回。这意味着可能有多个密码可能会产生相同的哈希值。它也不能保证在不同版本的.NET框架上返回相同的哈希值,这意味着升级可能会为同一个字符串生成不同的哈希值,从而导致您的密码无法使用。

建议您在推送时使用盐渍哈希甚至MD5。您可以轻松地将其切换到 Security.Cryptography 名称空间。

正如其他人所说,GetHashCode不是为你想要做的而设计的。有一个真正的关于如何安全处理用户密码的优秀文章

总结一下这篇文章,您需要使用相对较慢的自适应散列方案,例如 bcrypt ,或者斯坦福安全远程密码协议。我会建议前者。当然你也应该用盐。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top