C# 使用GetHashCode来;“安全”;用户密码

C# 使用GetHashCode来;“安全”;用户密码,c#,.net,security,cryptography,C#,.net,Security,Cryptography,我工作的公司已经签订了一份大型订单处理系统的支持合同。作为初始系统审计的一部分,我注意到数据库中存储的密码实际上是密码的哈希代码 基本上: string pwd = "some pasword"; string securePwd = pwd.GetHashCode(); 我的问题是,这有多安全 我对它感到不舒服,但我对GetHashCode的工作原理了解不够。我更喜欢使用MD5哈希之类的东西,但如果我在浪费时间,我就不会麻烦了。GetHashCode返回一个32位整数作为哈希值。考虑到,它的

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

基本上:

string pwd = "some pasword";
string securePwd = pwd.GetHashCode();
我的问题是,这有多安全


我对它感到不舒服,但我对GetHashCode的工作原理了解不够。我更喜欢使用MD5哈希之类的东西,但如果我在浪费时间,我就不会麻烦了。

GetHashCode
返回一个32位整数作为哈希值。考虑到,它的哈希值不够长,因为碰撞的概率相对较高,即使它被明确设计为抗碰撞,但事实并非如此

您应该使用SHA256或其他加密安全的哈希函数来处理此类任务


要存储密码,仅使用简单的哈希函数是不够的。您应该为每个用户添加一些随机的“salt”,并进行足够的迭代次数,这样暴力攻击的计算成本就会很高。因此,您应该使用像bcrypt、PBKDF2这样的东西,并进行大量迭代。

您应该使用加密的强散列,例如
SHA256Managed

杰夫·阿特伍德(Jeff Attwood)在这个话题上发表了几篇好文章:


它不仅不安全,而且可能会发生变化:

GetHashValue为给定输入返回的值在过去已更改


无法保证应用程序的不同执行之间的哈希值是相同的。

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


建议您在推送时使用咸哈希,甚至MD5。您可以轻松地将其切换到名称空间中的某个位置。

正如其他人所说,GetHashCode不是为您所要做的事情而设计的。有一个真正的问题


为了总结本文,您需要使用相对较慢的自适应哈希方案,例如,或者使用。我建议采用前者。当然你也应该用盐

我建议改用。正如其他人所说,使用GetHashCode作为密码不是一个好主意。

取决于您如何定义密码。有一些已知的方法可以计算发生冲突的值(至少在MD5中我确信是这种情况),但这并不会使它们变得无用。在大多数情况下,即使是腌制的MD5也足以存储密码。他们的“坏”属性对数字签名的影响更大。哦,也就是说,我无论如何都不建议使用MD5或SHA1。正如米奇所说,使用SHA256或更高的哈希算法。我评论的重点是关于“破碎”的事情。在加密算法中,break=dead。但是在散列算法中有一个更灰色的区域。谢谢,这正是我所想的。我尝试将系统移到SHA256.+1。链接的示例显示,即使在对.NET framework进行修补的简单Windows更新之后,哈希值计算也会发生变化。这意味着没有人可以再登录了。SRP与密码哈希的选择是正交的。它仍然需要一个好的慢散列作为构建块。不幸的是,许多SRP实现使用的是快速的。您的答案中安全处理用户密码的链接将转到某个ncctrust网站的主页。请你修一下好吗?