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

时间:2015-02-18 14:59:38

标签: c# xml encryption password-encryption

我目前正在使用登录系统表单应用程序,用户必须输入用户名和密码才能使用该程序。这些用户帐户存储在XML文件中,目前以纯文本格式存储(我只在原型阶段)。我正在寻找一种方法来散列密码(可能是用户名),然后将它们存储在XML文件中。

我已经对此进行了一些研究,但每次我进行另一次搜索时,我都会找到一种加密刺痛的不同方法。某些方法能够加密和解密字符串,而其他方法只能加密字符串。我试图找到最适合我情况的方法。

对于我的代码,我只需要对密码进行哈希处理。这有助于让我们更加安全。我可以显然只是在登录时散列密码然后进行比较,因此解密不是一个真正的问题。此外,该过程需要在任何计算机上运行。我已经看到一些只能在一台机器上运行的答案,我正在寻找可能的跨机器兼容的东西。另一件事是,散列的输出必须能够序列化为XML文件,而无需对用于写入XML文件的代码进行太多的重新处理。目前我正在使用XMLSerializer和StreamWriter来写入XML文件。

同样,我已经看到了许多加密或散列密码的方法,但我对加密和散列内容相对较新,所以我不知道这样做的好办法。任何帮助将不胜感激,如果需要,我可以添加一些示例代码。

3 个答案:

答案 0 :(得分:3)

  1. 你应该生成一个名为“salt”的随机字符串
  2. 将普通密码字符串与salt和哈希结果相结合
  3. 详细信息:

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

      1. 再次计算哈希值。 hash = sha(salt_in_file + password_input)
      2. 将hash与hash_in_file进行比较
      3. 不要使用MD5!更好看here 另请查看this文章

        <强>更新 好吧,也许这种方法还不够好。如果你想要非常强大的安全性,你应该使用特殊的慢哈希算法。他们中的一些人已经保持盐。我并不声称自己是加密专家。永远不要依赖这方面的单一意见。

        无论如何,在许多情况下,上述内容应该足够了。

答案 1 :(得分:2)

散列密码的正确方法是使用像bcrypt or scrypt这样的专用函数。

答案 2 :(得分:1)

像MD5,SHA-1甚至SHA-256这样的快速哈希算法不是哈希密码的好选择,因为它们太快了,而且太容易暴力破解。可以使用通用硬件计算3 Giga SHA-1 per second

相反,您可以使用慢速键派生函数,如BCrypt或PBKDF2。 CSharp对PBKDF2有本机支持,它可以用Rfc2898DeriveBytes类实现,你可以找到here的例子。

这个BCrypt library也很容易使用。通常人们不确定使用这些库是否安全,但我认为不存在反对使用它的论点。只要库返回正确的值并正确生成salt,它应该没问题,因为安全性来自算法,而不是来自实现。