什么是Salt Rounds以及在Bcrypt中如何存储Salts?

75

我正在尝试为一个node应用配置Bcrypt,并且有几个关于盐(salt)的问题,希望这里的某个人能够友好地回答。

  • 什么是盐“轮回”(salt round)? 例如,在github文档(https://github.com/kelektiv/node.bcrypt.js/)中,它使用了10个盐轮回。这到底意味着什么?

  • Bcrypt生成的盐是否总是相同的?例如,如果我将用户的哈希密码保存到数据库中,用于哈希密码的盐是否对每个密码都相同?

  • 盐是如何存储的?它是否安全,可以防范潜在攻击?

2个回答

112
  1. "salt round" 实际上指的是成本因素。成本因素控制计算单个BCrypt哈希所需的时间。成本因素越高,就会执行更多的哈希轮次。将成本因素增加1倍将使必要时间加倍。需要更多时间,破解就越困难。
  2. 盐是一个随机值,每次计算都应该不同,因此即使密码相同,结果也几乎不可能相同。
  3. 盐通常以可读形式包含在生成的哈希字符串中。因此,通过存储哈希字符串,您也存储了盐。有关详细信息,请参见此答案

1
你能解释一下“成本因素控制计算单个BCrypt哈希所需的时间”的意思吗?谢谢。 - Webwoman
21
@Webman - 成本因素为10意味着计算要进行2^10次,大约是1000次。需要更多的计算回合才能得到最终哈希值,需要更多的CPU/GPU时间。这对于计算单个登录哈希值来说不是问题,但当你暴力破解数百万个密码组合时,这是一个巨大的问题。我在我的密码教程中尝试解释了这一点。 - martinstoeckli
很棒的教程@martinstoeckli! - NealWalters
1
有趣。我正在使用bcryptjs...看起来盐和轮数与哈希一起存储...这就解释了为什么bcrypt.compare(secret,hash) API不需要输入轮数? - Learner
1
@SahilRajput - 现在它可以工作了,似乎是一个临时问题。 - martinstoeckli
显示剩余7条评论

21

在哈希值中仅包含Salt,比较时无需记住Salt。


var myPlaintextPassword='Saifio';  
var saltRounds = 10;   
const hash = bcrypt.hashSync(myPlaintextPassword, saltRounds);


$2b$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa

| | | | | | | 哈希值 = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | | | | 盐值 = nOUIs5kJ7naTuTFkBy1veu | | | 迭代次数 = 10 = 2^10 次迭代 | 哈希算法 = 2b = BCrypt


4
他解释了生成字符串的组成部分。我认为这很有帮助。 - mwieczorek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接