这是一种散列密码的安全方法吗?

Scu*_*012 7 c# security hash

您能告诉我以下是否是安全地散列密码以存储在数据库中的好方法:

    public string CreateStrongHash(string textToHash) {

        byte[] salt =System.Text.Encoding.ASCII.GetBytes("TeStSaLt");

        Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(textToHash, salt, 1000);
        var encryptor = SHA512.Create();
        var hash = encryptor.ComputeHash(k1.GetBytes(16));

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hash.Length; i++) {
            sb.Append(hash[i].ToString("x2"));
        }

        return sb.ToString();

    }
Run Code Online (Sandbox Code Playgroud)

提前谢谢了.

Cod*_*aos 7

你使用PBKDF2-SHA1,这是不错的但不是很好.Bcrypt好一点,scrypt更强.但由于.net已经内置了PBKDF2实现,这是一个可以接受的选择.

你最大的错误就是你没有得到盐.每个用户的盐应该是唯一的.简单地创建至少64位的随机值是标准做法.将它与哈希一起存储在数据库中.

如果您愿意,可以将盐分成两部分.一个与用户一起存储在数据库中,每个用户都不同,一个共享部分存储在别处.这获得了两者的优点.

我还建议使用更高的工作因子1000.找出可接受的性能,并进行相应调整.我不会低于10000,在某些情况下(磁盘加密)也可以接受一百万.


Ole*_*ksi 5

它可以改进.首先,您应该使用bcrypt.像SHA-512这样的传统哈希现在可以很容易地用GPU打破.问题是这些哈希是为速度而设计的,这与你想要的密码哈希相反.Bcrypt是自适应散列算法的示例.它可以被配置为花费"很长"的时间(但仍然不会导致系统中的性能问题)使暴力行为变得困难.

您还希望为每个用户创建独特的盐.

有关如何安全地散列密码的详细信息,请参阅此问题.

  • 他正在使用PBKDF2,它比bcrypt差一点,但仍然是推荐的功能之一. (3认同)