首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储PBKDF2迭代

存储PBKDF2迭代
EN

Stack Overflow用户
提问于 2014-11-24 16:44:28
回答 3查看 1K关注 0票数 1

因此,我使用Rcfc2898DeriveBytes类在.NET中将密码哈希到数据库中。

对于散列和存储最终散列和盐分,一切都很好。

但是,在计算如何存储类在散列密码时所经历的迭代次数时,我遇到了一个问题。

在谷歌搜索之后,我只看到它应该存储在密码哈希前面,但我不知道如何做到这一点,以便在以后更改数字(如果不存储迭代,更改将打破旧密码)时,可以检索该数字。

我看到bcrypt会为你做这一切,但是我没有为这个项目添加一个库的奢侈。

存储这个数字的最佳方法是什么,我如何才能做到这一点,这样它就可以恢复,而不仅仅是存储在散列中(一旦我得到它,我将如何将它从散列中分离出来)?

感谢提前给出的任何建议和信息!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-24 17:54:26

我在下面的网址上找到了我要找的东西。

https://cmatskas.com/-net-password-hashing-using-pbkdf2/

有关守则如下:

代码语言:javascript
复制
public class PasswordHash  
{
    public const int SALT_BYTE_SIZE = 24;
    public const int HASH_BYTE_SIZE = 20;
    public const int PBKDF2_ITERATIONS = 1000;
    public const int ITERATION_INDEX = 0;
    public const int SALT_INDEX = 1;
    public const int PBKDF2_INDEX = 2;

    public static string HashPassword(string password)
    {
        var cryptoProvider = new RNGCryptoServiceProvider();
        byte[] salt = new byte[SALT_BYTE_SIZE];
        cryptoProvider.GetBytes(salt);

        var hash = PBKDF2(password, salt, PBKDF2_ITERATIONS,    HASH_BYTE_SIZE);
        return PBKDF2_ITERATIONS + ":" +
               Convert.ToBase64String(salt) + ":" +
               Convert.ToBase64String(hash);
    }

    public static bool ValidatePassword(string password, string correctHash)
    {
        char[] delimiter = { ':' };
        var split = correctHash.Split(delimiter);
        var iterations = Int32.Parse(split[ITERATION_INDEX]);
        var salt = Convert.FromBase64String(split[SALT_INDEX]);
        var hash = Convert.FromBase64String(split[PBKDF2_INDEX]);

        var testHash = PBKDF2(password, salt, iterations, hash.Length);
        return SlowEquals(hash, testHash);
    }
}

我使用HashPassword方法将我的值保存到数据库中供以后使用。我用ValidatePassword把它们拿回来让我再用一次。它就像一种魅力,允许我根据所需的强度来确定salt和hash的字节大小,以及迭代次数。这些值只是存储在Web/文件中。

谢谢大家的回答!

票数 1
EN

Stack Overflow用户

发布于 2014-11-24 17:10:59

原则上,您根本不必存储迭代量。就像您不需要存储哈希类型,如果您保持它的一致性。

我建议做一些稍微不同的事情:存储包含版本号的单个字节(前缀),从零开始,就在salt & hash之前。这个版本号被链接到迭代次数、散列方法、字符编码方法,当然还有PBKDF2。如果您想升级到更好的协议,只需将01存储为初始字节,并将其与新参数链接。这样您就可以区分旧的样式密码和新的样式了。

通常,只有当用户输入密码时才能升级,因为哈希是不可逆的,所以很难升级迭代次数。

票数 1
EN

Stack Overflow用户

发布于 2014-11-24 16:58:52

看看bcrypt如何在这里存储散列表:What column type/length should I use for storing a Bcrypt hashed password in a Database?

因此,如果您只计划更改迭代,则可以进行以下简单的操作:

代码语言:javascript
复制
$<number of iterations>$<hash>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27109784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档