什么是盐轮以及盐如何存储在 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 中?的主要内容,如果未能解决你的问题,请参考以下文章

bcrypt 的盐怎么了?

为啥 Ruby 的 bcrypt 库在哈希中包含明文中的盐? [复制]

[Bcrypt / Blowfish无效盐,具有低的发数<04

bcrypt 哈希究竟如何防止彩虹表查找?

更改盐没有效果:为啥散列密码不会因不同的盐而改变?

如何在 vba 中使用 Bcrypt.Net 对 PHP 中 crypt 函数存储的密码进行身份验证