当前位置: 首页 > 知识库问答 >
问题:

使用pbkdf2的SALT和HASH

白青青
2023-03-14

我使用以下方法从NodeJS中的crypto lib创建加盐和散列密码:

crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)

对于randomBytes调用(创建SALT)我应该使用多大的大小?我听说过128位的盐,可能最多256位。看起来这个函数使用的是字节大小,那么我可以假设32(256位)的大小就足够了吗?

对于pbkdf2调用,什么是好的迭代次数,什么是好的密钥长度(keylen)?

salt::derivedKey::keyLength::iterations

共有1个答案

慕容玉堂
2023-03-14

1.随机字节大小:

盐的大小应至少与散列函数相同,因此对于SHA256应至少使用32个字节。node.js crypto的PBKDF2使用SHA1,所以最小应该是20个字节。但是,您至少应该使用64位(8字节),如#3所述。(来源:https://crackstation.net/hashing-security.htm)。

2.PBKDF2迭代次数:

看这个问题进行大讨论。我从中得出,10.000范围在没有影响性能的情况下就足够了,但这取决于硬件/性能。

3.PBKDF2长度:

请参阅关于密钥长度的其他讨论。参数同样是使用的散列函数,在您的例子中是SHA-1,所以20字节是正确的值。由于PBKDF2的标准建议盐至少为64位,生成比输入小的键是浪费,所以至少使用8字节。不要使用大于20的输出长度,因为它不会提供额外的安全性,但对于20的每个倍数,计算时间会加倍。

在上面的所有链接(特别是第一个链接)中讨论过,盐应该沿着密码保存(但绝不在其他地方重用),通常是先在结果字符串(salt:hash)中追加它,或者在另一个数据库列中追加它。

至于其他变量,它们的知识对于破坏安全性并不重要(正如Kerckhoffs的原理所述,因此您可以在任何地方安全地参数化它。通过用“::”分隔它们的方法很好,但您保存了额外的信息。CrackStation的代码只保存“算法:iterations:salt:hash”,因此在您的情况下,“salt::derivedkey::iterations”就是您所需要的。

 类似资料:
  • 尽管我有点困惑,我是否应该将salt输入到我的PBKDF2函数中,并将salt存储在一列中,而将PBKDF2的密码存储在另一列中。 我也在使用CodeIgniter,并找到了一个用于PBKDF2的库(https://github.com/hashemqolami/codeigniter-pbkdf2-library),它声称我不需要单独存储salt。 使用作为推荐的用户密码注册用户;无需单独存储用

  • 我正在使用以下代码创建哈希密码和salt: 我正在数据库中存储HashedPassword和Salt。 现在我要验证用户登录时的密码: 这不起作用,我得到了一个完全不同的哈希密码,而不是存储在数据库中的密码。据我所知,您应该在用户登录时输入的密码之前预置salt,然后运行相同的哈希密码函数。上面不是等价于那个吗?

  • 我正在使用CryptoJS加密密码,下面是我正在使用的示例代码 当函数被执行时,它提供的数据如下所示 Salt:923CA1AB6DC88806B05F012C5F7DF49F脚本。JS:13:11 Salt_Hex:923CA1AB6DC88806B05F012C5F7DF49F脚本。JS:14:11密钥:1438927D9BC8A42B9689A93C0FEFC8506A5BE0819FEB2

  • 问题内容: 有没有一种方法可以解密Java中的密码。Java将算法实现为。我得到了创建密码哈希的代码。我在下面提到了哈希技术的链接: http://howtodoinjava.com/security/how-to-generate-secure-password-hash- md5-sha-pbkdf2-bcrypt-examples/ 我的要求是以加密格式存储第三方FTP服务器密码,并在需要登

  • 我想找到一个解决方案或方法,使我能够添加盐和控制迭代次数。本机Rfc2898DeriveBytes基于HMACSHA1。理想情况下,使用SHA-256或SHA-512将使系统经得起未来的考验。 这是迄今为止我发现的最好的例子:http://jmedved.com/2012/04/pbkdf2-with-sha-256-and-others/但是当我用SHA-256运行它时,它实际上比用SHA-51

  • 问题内容: 我试图将密码安全地存储在数据库中,为此,我选择存储使用PBKDF2函数生成的哈希值。我想使用弹性城堡库来执行此操作,但是我不知道为什么我无法通过使用JCE接口来使其工作…问题是,以三种不同的方式生成哈希值: 1.使用PBKDF2WithHmacSHA1秘密密钥由sun提供的工厂 。2.直接 使用有弹性的城堡api。3.通过JCE使用有弹性的城堡会 产生2个不同的值:前两个值相同,第三个