【问题标题】:C# -- How To Properly Hash A Password (String)C#——如何正确散列密码(字符串)
【发布时间】:2015-04-19 15:14:26
【问题描述】:

我目前正在开发一个 C# 中的表单应用程序,它有一个登录系统,用户必须输入他们的用户名和密码才能使用该程序。这些用户帐户存储在 XML 文件中,目前以纯文本形式存储(我只处于原型阶段)。我正在寻找一种方法来对密码(可能还有用户名)进行哈希处理,然后将它们存储在 XML 文件中。

我已经对此进行了一些研究,但是每次我进行另一次搜索时,我都会发现一种不同的加密方式。有些方法能够加密和解密字符串,而其他方法只能加密字符串。我正在努力寻找最适合我的情况的方法。

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

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

【问题讨论】:

  • 关键字未加密。相反,散列
  • 啊,谢谢,我会编辑问题。
  • 我猜这里一定有某种形式的客户端/服务器通信,但你没有澄清这一点。如果没有(这只是一个本地应用程序登录),那么散列是没有意义的。如果密码正在通过网络,那么存储客户端哈希可能很好,但存储服务器端哈希(可能除了客户端哈希之外)是最佳实践方法。
  • 在未来的版本中会有客户端/服务器通信。目前它只是一个客户端,所有内容都存储在本地。一旦服务器创建完成,所有登录信息都将在服务器端处理(包括存储)
  • How to hash a password 的可能重复项(注意这个答案stackoverflow.com/a/10402129/1185053)

标签: c# xml encryption password-encryption


【解决方案1】:
  1. 您应该生成名为“salt”的随机字符串
  2. 将纯密码字符串与盐和哈希结果结合起来

详细说明:

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

登录时:

  1. 再次计算哈希。 hash = sha(salt_in_file + password_input)
  2. 将哈希与您的 hash_in_file 进行比较

而且不要使用 MD5!更好看here 也可以翻看this的文章

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

不管怎样,在很多情况下,以上应该足够了。

【讨论】:

  • 谢谢,我去看看链接。
  • 很抱歉,但这不是您应该做的。 SHA* 和 MD5 等算法不适用于散列密码,因为它们的设计速度很快,因此很容易被暴力破解。相反,应该使用具有成本因子的哈希算法,例如 BCrypt 或 PBKDF2。
【解决方案2】:

散列密码的正确方法是使用专门的函数,如bcrypt or scrypt。

【讨论】:

    【解决方案3】:

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

    相反,您可以使用慢速密钥派生函数,例如 BCrypt 或 PBKDF2。 CSharp 原生支持 PBKDF2,可以通过 Rfc2898DeriveBytes 类来实现,例子你可以找到here。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2021-02-19
      • 2019-12-12
      • 2019-07-12
      • 1970-01-01
      • 2018-12-30
      • 2015-10-21
      相关资源
      最近更新 更多