4

我想以加密形式存储密码。我用过sha256。我的代码如下

public static string ComputeHash(string plainText)
    {
        int minSaltSize = 4;
        int maxSaltSize = 8;

        Random random = new Random();
        int saltSize = random.Next(minSaltSize, maxSaltSize);

        byte[] saltBytes = new byte[saltSize];
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        rng.GetNonZeroBytes(saltBytes);

        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];

        for (int i = 0; i < plainTextBytes.Length; i++)
            plainTextWithSaltBytes[i] = plainTextBytes[i];

        for (int i = 0; i < saltBytes.Length; i++)
            plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i];


        HashAlgorithm hash = new SHA256Managed();
        byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);
        byte[] hashWithSaltBytes = new byte[hashBytes.Length + saltBytes.Length];

        for (int i = 0; i < hashBytes.Length; i++)
            hashWithSaltBytes[i] = hashBytes[i];

        for (int i = 0; i < saltBytes.Length; i++)
            hashWithSaltBytes[hashBytes.Length + i] = saltBytes[i];

        string hashValue = Convert.ToBase64String(hashWithSaltBytes);
        return hashValue;
    }

现在当用户登录我想验证这个密码我该怎么做?

4

1 回答 1

13

从用户那里获取纯文本密码,使用相同的算法对其进行散列,并将新生成的散列与存储在数据库中的散列进行比较。如果两个哈希值相同,则用户输入了正确的密码。

更新

您每次都使用新鲜的随机盐,从而导致不同的哈希值。只需在您的数据库中创建一个包含所用盐的新列,然后使用这一列。

将盐与哈希一起保存不是安全问题。如果直接使用盐,盐只会禁止将预先计算的彩虹表简单地用于单个哈希算法。它没有提供关于使用的真实密码的任何线索,也没有关于盐如何与纯文本密码(前置、附加、交织......)组合的任何线索,因此它可以安全地存储在下一个到生成的哈希。

于 2013-01-23T07:42:43.960 回答