c# - 密码哈希 - 为什么加盐 60,000 次

标签 c# hash sha256 sha

我在一家财富 100 强公司工作,我的任务是将安全性从 SHA1 转移到 SHA-2。这不是我的专业领域,但在我学习密码学时,我正在质疑过时的信息等......

  1. SHA-2 显然比 SHA-1 更需要,但是当安全团队知道密码 + salt 的散列使用的是 SHA,GPU 在破解数十亿散列时速度快得离谱 - 我不明白为什么对于密码,我没有被告知使用 bcrypt 或其他速度较慢的等效项,为什么?

  2. 有人向我展示了一张 powerpoint 幻灯片,其中告诉我制作盐 60,000 次。我在整个互联网上进行了搜索,但没有看到任何此类建议或示例。为什么?

我正在使用 C#

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

我想我不是被告知要一遍又一遍地创建盐,而是一遍又一遍地创建哈希。

这个逻辑合适吗?

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));
}

如何使此哈希正常工作?

更新发现powerpoint幻灯片

enter image description here

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

问题是当我对我正在尝试的代码使用检查时 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;
    }

}

///

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

        byte[] buff = new byte[size];
        rng.GetBytes(buff);
        return Convert.ToBase64String(buff);
    }

新问题 我想我会继续提出一个新问题,在此先感谢大家。 Verification of Hashing password is not working

最佳答案

I do not get why for passwords i'm not being told to use bcrypt or another equivalent that is slow

我猜这就是为什么他们要你哈希 60000 次。添加工作因素并减缓暴力攻击。

How do I make this hashing to work properly?

像这样:

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)));
    }
}

关于c# - 密码哈希 - 为什么加盐 60,000 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342435/

相关文章:

c# - 为什么通过 OleDb 在 Access 数据库中调用我的更新查询不起作用?

C++ 正在使用 [](int i){return i;} 作为 unordered_set 散列函数的好习惯吗?

c# - 如何在C#中使用SHA256withRSA算法进行签名

c# - 如何安装色谱柱?

c# - Json.Net 将复杂对象序列化为 Xml 属性和值

c# - 使用 moon apns 设置内容可用

assembly - 将 ARMv8 Crypto 加速的 SHA256 集成到现有的 C 实现函数中

c++ - C++中哈希表的实现

java - 在 SD 卡上组织数据以便快速搜索的最佳方式

linux - oclHashcat SHA256 行长异常