什么是盐轮以及盐如何存储在 Bcrypt 中?
Posted
技术标签:
【中文标题】什么是盐轮以及盐如何存储在 Bcrypt 中?【英文标题】:What are Salt Rounds and how are Salts stored in Bcrypt? 【发布时间】:2018-03-23 10:28:21 【问题描述】:我正在尝试为我正在制作的节点应用程序配置 Bcrypt,并且有几个关于盐的问题,我希望这里的人可以帮助回答。
什么是盐“圆形”?例如,在 github 文档 (https://github.com/kelektiv/node.bcrypt.js/) 中,它使用 10 的盐轮。这到底是什么意思?
Bcrypt 生成的盐总是一样的吗?例如,如果我将用户的散列密码保存到数据库中,它用于散列密码的盐对于每个密码是否相同?
盐是如何储存的?它是否安全免受潜在攻击?
【问题讨论】:
【参考方案1】:-
“salt round”实际上是指成本因素。成本因素控制计算单个 BCrypt 哈希所需的时间。成本因子越高,完成的散列次数就越多。将成本因子增加 1 会使所需时间加倍。需要的时间越多,暴力破解就越困难。
salt 是一个随机值,每次计算都应该不同,因此即使密码相同,结果也几乎不会相同。
盐通常以可读的形式包含在生成的哈希字符串中。因此,通过存储哈希字符串,您还可以存储盐。请查看此answer 了解更多详情。
【讨论】:
您能解释一下“成本因素控制计算单个 BCrypt 哈希所需的时间”是什么意思吗?请 ?谢谢 @Webman - 成本因子为 10 意味着计算完成 2^10 次,大约是 1000 次。获得最终哈希所需的计算轮数越多,所需的 cpu/gpu 时间就越多。这对于计算登录的单个哈希值没有问题,但是当您暴力破解数百万个密码组合时,这是一个大问题。试图在我的密码tutorial中解释它。 不错的教程@martinstoeckli! 在将秘密与哈希进行比较时,我需要知道使用的盐轮数吗? 有趣。我正在使用 bcryptjs ......看起来好像盐和轮数与哈希一起存储......这解释了为什么 bcrypt.compare(secret,hash) api 不将轮数作为输入? 【参考方案2】:盐只包含在哈希中,比较时我们不需要记住。
var myPlaintextPassword='Saifio';
var saltRounds = 10;
const hash = bcrypt.hashSync(myPlaintextPassword, saltRounds);
$2b$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | | | | | |哈希值 = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | | | | salt = nOUIs5kJ7naTuTFkBy1veu | | |成本因子 = 10 = 2^10 次迭代 | 哈希算法 = 2b = BCrypt
【讨论】:
他解释了结果字符串的组成部分。我认为这很有帮助。以上是关于什么是盐轮以及盐如何存储在 Bcrypt 中?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Ruby 的 bcrypt 库在哈希中包含明文中的盐? [复制]