我所在的公司接受了一份大型订单处理系统的支持合同。作为初始系统审核的一部分,我注意到存储在数据库中的密码实际上是密码的哈希码。
本质上:
string pwd = "some pasword";
string securePwd = pwd.GetHashCode();
我的问题是,这个方案有多安全?
我并不太放心,但是我对GetHashCode的工作原理了解不足。我更倾向于使用类似MD5哈希的东西,但如果这样做是浪费时间的话,我就不打算这么做了。
我所在的公司接受了一份大型订单处理系统的支持合同。作为初始系统审核的一部分,我注意到存储在数据库中的密码实际上是密码的哈希码。
本质上:
string pwd = "some pasword";
string securePwd = pwd.GetHashCode();
我的问题是,这个方案有多安全?
我并不太放心,但是我对GetHashCode的工作原理了解不足。我更倾向于使用类似MD5哈希的东西,但如果这样做是浪费时间的话,我就不打算这么做了。
这不仅不安全,而且还容易改变:
http://netrsc.blogspot.com/2008/08/gethashcode-differs-on-systems.html
对于给定的输入,GetHashValue返回的值在过去已经发生了变化。
不能保证在应用程序的不同执行之间它甚至是相同的。
GetHashCode 明显不是以这种方式使用的,因为其实现并未保证对于不同的对象会生成不同的哈希返回值。这意味着潜在地多个密码可能会产生相同的哈希值。同时,它也不能保证在不同版本的 .NET Framework 上返回相同的哈希值,这意味着升级后可能会为相同字符串产生不同的哈希值,使您的密码无法使用。
建议您使用加盐哈希或者至少 MD5,您可以很容易地切换到 Security.Cryptography 命名空间内的其他算法。
像其他人说的那样,GetHashCode并不是为您尝试做的事情而设计的。有一篇非常出色的文章,讲解如何安全地处理用户密码。
总结文章,您需要使用相对较慢的自适应哈希方案,例如bcrypt, 或者斯坦福安全远程密码协议。我建议使用前者。当然,您还应该使用盐。