C# -- 如何正确地哈希密码(字符串)

4
我目前正在使用C#开发一个表单应用程序,其中包含登录系统。用户必须输入用户名和密码才能使用该程序。这些用户账户存储在XML文件中,并且当前以明文形式存储(我只处于原型阶段)。我正在寻找一种方法来哈希密码(也许是用户名),然后将它们存储在XML文件中。
我已经进行了一些研究,但每次搜索时,我都会找到不同的加密字符串方法。有些方法可以加密和解密字符串,而另一些方法只能加密字符串。我试图找到最适合我情况的方法。
对于我的代码,我只需要哈希密码。这将有助于更好地保护它们。我可以在登录时仅哈希密码,然后比较它们,所以解密并不是真正的问题。此外,该过程需要在任何计算机上运行。我看到一些答案仅适用于单台机器,如果可能的话,我正在寻找一些跨机器兼容的东西。另外,哈希输出必须能够序列化到XML文件中,而不需要重新编写用于写入XML文件的代码。目前,我正在使用XMLSerializer和StreamWriter来写入XML文件。
再次强调,我已经看到了很多加密或哈希密码的方法,但我对加密和哈希东西相对较新,因此不知道如何做到这一点。任何帮助都将不胜感激,如果需要,我可以添加一些示例代码。

关键字不是加密。相反,哈希 - EZI
啊,谢谢,我会编辑问题的。 - Josh H
我猜这里一定有某种形式的客户端/服务器通信,但你没有澄清。如果没有(只是本地应用程序登录),那么哈希是无意义的。如果密码确实通过网络传输,则存储客户端哈希可能很好,但存储服务器端哈希(可能还要加上客户端哈希)是最佳实践方法。 - PaulG
未来版本中将会有客户端/服务器通信。目前只是客户端,一切都存储在本地。一旦创建服务器,所有登录相关的事务都将在服务器端处理(包括存储)。 - Josh H
可能是如何哈希密码的重复问题(请注意此答案https://dev59.com/_G855IYBdhLWcg3wuG2W#10402129)。 - dav_i
3个回答

4
  1. 您应该生成名为“salt”的随机字符串
  2. 将您的明文密码字符串与盐混合并进行哈希处理

详细说明:

  1. 生成一个长且随机的盐。注意:每个登录-密码对的盐必须不同!
  2. 哈希= sha(盐+密码)//伪代码
  3. 将哈希和盐保存在您的文件中

当登录时:

  1. 再次计算哈希。哈希= sha(文件中的盐+输入的密码)
  2. 将哈希与您的文件中的哈希进行比较

不要使用MD5!最好看一下这里 还要查看文章

更新: 好吧,也许这种方法还不够好。如果您想要真正强大的安全性,您应该使用特殊的缓慢哈希算法。其中一些已经维护了盐。我不是密码学专家。在此领域永远不要仅依赖单一意见。

无论如何,上述方法在许多情况下都应该足够。


谢谢,我会查看这些链接。 - Josh H
1
很抱歉要说,但这不是你应该做的。像SHA*和MD5这样的算法不适合用于哈希密码,因为它们被设计成快速的,因此可以轻易地被暴力破解。相反,应该使用具有成本因素的哈希算法,如BCrypt或PBKDF2。 - martinstoeckli

4

正确的密码哈希方式是使用专门的函数,如bcrypt或scrypt


2
快速哈希算法如MD5、SHA-1,甚至SHA-256不适合用于哈希密码,因为它们太快了,可以轻易地被暴力破解。一个人可以使用普通硬件计算大约每秒3亿个SHA-1(具体请参见此处)。
相反,您可以使用慢速密钥派生函数,例如BCrypt或PBKDF2。CSharp原生支持PBKDF2,可以使用Rfc2898DeriveBytes类实现,您可以在这里找到示例。
还有一个易于使用的BCrypt库。经常有人不确定是否安全使用此类库,但我认为没有反对使用它的理由。只要库正确返回值并正确生成盐,就应该没问题,因为安全性来自算法而不是实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接