C#——如何正确散列密码(字符串)

C#——如何正确散列密码(字符串),c#,xml,encryption,password-encryption,C#,Xml,Encryption,Password Encryption,我目前正在用C#开发一个表单应用程序,它有一个登录系统,用户必须输入用户名和密码才能使用该程序。这些用户帐户存储在一个XML文件中,当前以纯文本形式存储(我仅处于原型阶段)。我正在寻找一种方法对密码(可能还有用户名)进行散列,然后将其存储在XML文件中。 我已经对此做了一些研究,但每次我做另一次搜索时,我都会发现一种不同的加密方法。有些方法能够对字符串进行加密和解密,而另一些方法只能对字符串进行加密。我正在努力寻找最适合我的情况的方法 对于我的代码,我只需要对密码进行散列。这将有助于使它们更安全

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

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

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

同样,我见过很多加密或散列密码的方法,但我对加密和散列的东西比较陌生,所以我不知道一个好的方法。任何帮助都将不胜感激,如果需要,我可以添加一些示例代码

  • 您应该生成名为“salt”的随机字符串
  • 将普通密码字符串与salt和hash结果相结合
  • 详情如下:

  • 生成一个长的随机盐。注意:每个登录密码对的salt必须不同
  • hash=sha(salt+password)//伪代码
  • 在文件中保存散列和盐
  • 登录时:

  • 再次计算散列。hash=sha(文件中的salt\u+密码输入)
  • 将哈希值与\u文件中的哈希值\u进行比较
  • 不要使用MD5!好看点 还要通读这篇文章

    更新: 好吧,也许这个方法不够好。如果你想要真正强大的安全性,你应该使用特殊的慢散列算法。其中一些已经保存了盐。我并不自称是密码学专家。在这个领域,永远不要依赖单一的意见


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

    对密码进行散列的正确方法是使用专门的函数,例如。

    像MD5、SHA-1甚至SHA-256这样的快速散列算法不是对密码进行散列的好选择,因为它们太快了,很容易被强制执行。人们可以用普通硬件计算大约

    相反,您可以使用慢键派生函数,如BCrypt或PBKDF2。CSharp对PBKDF2有本机支持,它可以通过Rfc2898DeriveBytes类实现,您可以找到一个示例


    这也很容易使用。通常人们不确定使用这样的库是否安全,但我不认为有人反对使用它。只要库返回正确的值并正确生成salt,就可以了,因为安全性来自算法而不是实现。

    关键字不加密。相反,哈辛加,谢谢你,我将编辑这个问题。我猜这里一定有某种形式的客户机/服务器通信,但你没有澄清这一点。如果没有(这只是一个本地应用程序登录),那么散列是没有意义的。如果密码是通过网络传输的,那么存储客户端散列可能很好,但是存储服务器端散列(可能是客户端散列之外的)是最佳实践方法。在未来的版本中将有客户端/服务器通信。目前,它只是一个客户端,所有内容都存储在本地。一旦创建了服务器,所有登录的内容都将在服务器端处理(包括存储)可能的重复(请注意此答案)谢谢,我将查看链接。很抱歉,这不是您应该做的。像SHA*和MD5这样的算法不适合散列密码,因为它们设计得很快,因此很容易被强制使用。相反,应该使用具有成本因子的哈希算法,如BCrypt或PBKDF2。