【问题标题】:How to salt and hash a password value using c#?如何使用 c# 对密码值进行加盐和哈希处理?
【发布时间】:2011-01-01 13:56:23
【问题描述】:

大家好,

我从Preferred Method of Storing Passwords In Database 了解到存储密码的哈希值是安全的...

  • 如何使用 c# 对密码值加盐和散列?

  • 如何比较存储在数据库中的值和用户给出的值?

【问题讨论】:

标签: c# passwords hash


【解决方案1】:

最流行的方法是使用散列算法。 blog post here 有一个很好的关于如何使用 MD5 算法对字符串进行哈希处理的例子,但在 System.Cryptography 命名空间中还有很多其他示例。

至于 #2,关于其工作原理的一般分步指南如下:

注册时:

  1. 使用您指定的算法散列用户密码并将其存储在数据库中
  2. Salt 这个哈希(可选,但首选)

登录/用户和密码检查:

  1. 在数据库中查找用户名
  2. 如果存在,则检索散列密码
  3. 对输入的密码进行哈希和加盐,并将其与检索到的密码进行比较

都是比较啰嗦的,但是很安全。

还有另一个关于散列盐渍here的非常深入的指南。

【讨论】:

【解决方案2】:

简单哈希:

public string GetSHA256Hash(string s)
        {
            if (string.IsNullOrEmpty(s))
            {
                throw new ArgumentException("An empty string value cannot be hashed.");
            }

            Byte[] data = System.Text.Encoding.UTF8.GetBytes(s);
            Byte[] hash = new SHA256CryptoServiceProvider().ComputeHash(data);
            return Convert.ToBase64String(hash);
        }

【讨论】:

    【解决方案3】:

    严格来说,您应该salt the password 然后对其进行哈希处理,以避免字典攻击。您可以使用System.Cryptography 命名空间中的HashAlgorithm 抽象类的任何实现来计算散列 - 当前的最佳选择可能是SHA-2 algorithms 之一。

    您存储哈希而不是密码,并比较哈希值以验证用户。

    【讨论】:

      【解决方案4】:

      正如其他人所说,有很多选择。

      这是来自Microsoft 的一些示例代码(使用 MD5 而非 SHA),可能有助于您入门

         using System;
         using System.Security.Cryptography;
         using System.Text;
      
         string sSourceData;
         byte[] tmpSource;
         byte[] tmpHash;
      
         sSourceData = "MySourceData";
         //Create a byte array from source data.
         tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
      
         //Compute hash based on source data.
         tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
      

      【讨论】:

        【解决方案5】:

        对于散列,您在 System.Security.Cryptography 中有几种受支持的算法,对于您的用例,您可能希望选择基于 SHA 的散列或类似的东西。

        关于比较:您不会比较 DB 值和用户给您的值。您首先使用用于将密码存储在数据库中的相同加密/散列函数,这次是用户输入。如果结果等于数据库中的哈希值,则密码(可能)正确。

        目的是没有人可以访问数据库以明文形式检索密码,甚至您的程序也不需要知道它(只有接受用户输入的部分会在短时间内拥有它)。

        链接(甚至可能重复):

        【讨论】:

          【解决方案6】:
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多