密码哈希 - 为什么要盐60,000次

5 c# hash sha sha256

我正在为一家财富100强企业工作,我将面临从SHA1到SHA-2的安全任务.这不是我的专业领域,但在我研究密码学时,我质疑过时的信息等......

  1. 显然需要SHA-2而不是SHA-1,但是当安全团队知道密码+盐的散列使用SHA时,GPU在破解数十亿个哈希值时非常快速 - 我不知道为什么密码我不是被告知使用bcrypt或其他慢速的等效物,为什么?

  2. 我看到了一张幻灯片,我被告知要制作我的盐60,000次.我搜索了整个互联网,我没有看到任何这样的建议或例子.为什么?

我正在使用C#

string SaltAndPwd = string.Concat(plainTextPassword, salt);
SHA256 sha2 = SHA256Managed.Create();
byte[] buff = sha2.ComputeHash(Encoding.Unicode.GetBytes(SaltAndPwd));
Run Code Online (Sandbox Code Playgroud)

我想我并没有被告知反复创建一个盐,而是一遍又一遍地创建哈希.

这种逻辑是否合适?

string plainTextPassword = "aF7Cvs+QzZKM=4!";  
string salt = "o9kc5FvhWQU==";
SHA256 sha2 = SHA256Managed.Create();

for(var i = 0; i <= 60000; i++)
{
   byte[] buff = sha2.ComputeHash(Encoding.Unicode.GetBytes(SaltAndPwd));
}
Run Code Online (Sandbox Code Playgroud)

如何使此散列正常工作?

更新发现了powerpoint幻灯片

在此输入图像描述

使用代码更新 - 验证哈希的实现问题

问题是当我使用我正在尝试的代码检查时 if (resultHash.Equals(hassPassword)) ,它不匹配...

    public string BuildVerify()
    {

        string password = "";
        string salt = "";
        byte[] result;


        using (var sha256 = SHA256.Create())
        {
            password = "hovercraft";

            // step 1: you can use RNGCryptoServiceProvider for something worth using
            var passwordHashing = new PasswordHashing();
            salt = passwordHashing.CreateRandomSalt();

            // step 2
            string hash =
               Convert.ToBase64String(sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + password)));

            // step 3
            result = sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + hash));

            // step 4
            for (int i = 0; i < 60000; i++)
            {
                result =
                 sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + Convert.ToBase64String(result)));
            }
        }


        // TESTING  VERIFY this works ..

        string SaltAndPwd = string.Concat(password, salt);
        SHA256 sha2 = SHA256Managed.Create();
        byte[] buff = sha2.ComputeHash(Encoding.Unicode.GetBytes(SaltAndPwd));
        string resultHash = Convert.ToBase64String(buff);
        string hassPassword = Convert.ToBase64String(result);

        if (resultHash.Equals(hassPassword))
        {
            // perfect 
        }




        return "";

    }


public class PasswordHashing
{

    public string CreateRandomSalt()
    {
        string password = "";
        password = HashPassword.CreateSalt(8) + "=";
        password = password.Replace("/", "c");
        return password;
    }

}
Run Code Online (Sandbox Code Playgroud)

///

    public static string CreateSalt(int size)
    {
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

        byte[] buff = new byte[size];
        rng.GetBytes(buff);
        return Convert.ToBase64String(buff);
    }
Run Code Online (Sandbox Code Playgroud)

新问题认为我会继续创建一个新问题,提前感谢所有人. 验证哈希密码不起作用

Nas*_*ine 9

我不知道为什么密码我没有被告知使用bcrypt或另一个慢的等价物

我猜这就是他们要求你哈希60000次的原因.添加工作因素并减缓暴力攻击.

如何使此散列正常工作?

像这样的东西:

using (var sha256 = SHA256.Create())
{
    string password = "hovercraft";

    // step 1: you can use RNGCryptoServiceProvider for something worth using
    string salt = GenerateSalt();

    // step 2
    string hash = 
       Convert.ToBase64String(sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + password)));

    // step 3
    byte[] result = sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + hash));

    // step 4
    for (int i = 0; i < 60000; i++)
    {
        result = 
         sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + Convert.ToBase64String(result)));
    }
}
Run Code Online (Sandbox Code Playgroud)