Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对密码进行哈希运算,得到不同的结果_C#_.net_Hash_Hashalgorithm - Fatal编程技术网

C# 对密码进行哈希运算,得到不同的结果

C# 对密码进行哈希运算,得到不同的结果,c#,.net,hash,hashalgorithm,C#,.net,Hash,Hashalgorithm,我正在接管一个以前的开发人员编写的系统。系统由管理员批准用户帐户,当管理员批准用户帐户时,系统将使用以下方法散列密码并将其保存到数据库中。它将未加密的密码发送给用户。当用户登录时,系统使用完全相同的方法对用户输入的内容进行散列,并将其与数据库值进行比较。我们已经遇到过几次数据库条目与用户条目不匹配的情况,这是他们应该做的。因此,该方法似乎并不总是对相同的值进行散列。有人知道这种散列方法是否可靠,以及如何使其可靠吗?谢谢 private string HashPassword(string

我正在接管一个以前的开发人员编写的系统。系统由管理员批准用户帐户,当管理员批准用户帐户时,系统将使用以下方法散列密码并将其保存到数据库中。它将未加密的密码发送给用户。当用户登录时,系统使用完全相同的方法对用户输入的内容进行散列,并将其与数据库值进行比较。我们已经遇到过几次数据库条目与用户条目不匹配的情况,这是他们应该做的。因此,该方法似乎并不总是对相同的值进行散列。有人知道这种散列方法是否可靠,以及如何使其可靠吗?谢谢

    private string HashPassword(string password)
    {
        string hashedPassword = string.Empty;

        // Convert plain text into a byte array.
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(password);

        // Allocate array, which will hold plain text and salt.
        byte[] plainTextWithSaltBytes =
                new byte[plainTextBytes.Length + SALT.Length];

        // Copy plain text bytes into resulting array.
        for(int i = 0; i < plainTextBytes.Length; i++)
            plainTextWithSaltBytes[i] = plainTextBytes[i];

        // Append salt bytes to the resulting array.
        for(int i = 0; i < SALT.Length; i++)
            plainTextWithSaltBytes[plainTextBytes.Length + i] = SALT[i];

        // Because we support multiple hashing algorithms, we must define
        // hash object as a common (abstract) base class. We will specify the
        // actual hashing algorithm class later during object creation.
        HashAlgorithm hash = new SHA256Managed();

        // Compute hash value of our plain text with appended salt.
        byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);

        // Create array which will hold hash and original salt bytes.
        byte[] hashWithSaltBytes = new byte[hashBytes.Length +
                                            SALT.Length];
        // Copy hash bytes into resulting array.
        for(int i = 0; i < hashBytes.Length; i++)
            hashWithSaltBytes[i] = hashBytes[i];

        // Append salt bytes to the result.
        for(int i = 0; i < SALT.Length; i++)
            hashWithSaltBytes[hashBytes.Length + i] = SALT[i];

        // Convert result into a base64-encoded string.
        hashedPassword = Convert.ToBase64String(hashWithSaltBytes);

        return hashedPassword;
    }
私有字符串HashPassword(字符串密码)
{
string hashedPassword=string.Empty;
//将纯文本转换为字节数组。
字节[]明文字节=Encoding.UTF8.GetBytes(密码);
//分配数组,该数组将包含纯文本和salt。
字节[]带altbytes的明文=
新字节[plainTextBytes.Length+SALT.Length];
//将纯文本字节复制到结果数组中。
for(int i=0;i
如果过程不使用任何随机决策(即,它是完全确定的),并且所用算法的实现是相同的(它们应该是相同的-SHA256应该在任何地方都完全相同,Base64字符串也是相同的),那么算法本身不太可能“散列值不是相同的”

如果您无法重现错误(意思是:查找某个值,该值在服务器上哈希时总是生成一个哈希,在客户端哈希时总是生成另一个哈希),您应该确保正确传输和接收值。可能客户端未加密的密码被扰乱了?可能服务器从客户端接收到损坏的数据?可能服务器数据库本身的数据发生了某种变化? 确保每个事务都经过验证,即用户无法收到损坏的密码。

此函数使用salt进行哈希运算。这是一种技术,可确保它为同一密码生成不同的哈希,并使表查找更加困难

只有当您具有相同的salt值时,哈希才是相同的

有关此技术的详细信息,请参阅维基百科

引述:

用盐来减缓攻击。 盐是调味的一种方法 在对它们进行散列之前,先 攻击者的预计算字典 没用,这是怎么做的。 无论何时将条目添加到 数据库中,您计算一个随机变量 用作盐的数字字符串。 当您要计算 爱丽丝的密码,你查一下盐 Alice帐户的值,请在前加上 输入密码,并将其散列 结果数据库看起来 像这样:

<users>
  <user name='Alice' salt='Tu72*&' password='6DB80AE7...'/>
  <user name='Bob'   salt='N5sb#X' password='096B1085...'/>
  <user name='Fred'  salt='q-V3bi' password='9118812E...'/>
</users>

请注意,现在没有办法判断 鲍勃和弗雷德用的是同一个 密码。注意盐本身 这不是秘密