为什么BCrypt哈希存储有关版本和迭代的信息?

时间:2018-01-26 07:21:05

标签: algorithm hash bcrypt

BCrypt哈希通常以一些重复符号开头。

让我们举例说,我们看到$2a$10是我们哈希的开头。每个BCrypt哈希都有类似的东西。

$是分隔符

2a在这种情况下是版本

10是10次方的迭代次数

我的问题是 - 为什么这些信息在哈希?

没有特别需要此信息的dehashing算法,当人们登录时,他们生成相同的版本并使用相同的版本和相同的迭代次数,然后将结果与存储在数据库中的结果进行比较。这意味着算法没有构建比较获取has的函数,并且基于此信息(版本和迭代)哈希密码进行比较。

然后......为什么这个信息被放弃了?谁使用这些信息?

我的猜测是,如果版本已经改变或者我们的程序或其他什么会知道迭代次数,但是......为什么?我的意思是算法必须只配置一次,如果需要更改,那么公司的工作就是做出适当的安排,以便它知道使用的版本和现在使用的版本。为什么记住迭代的版本和数量是哈希的工作?

哈希每周左右都会泄露,有了这些信息,有人可以轻松设置他的BCrypt并使用相同的版本和迭代配置运行...但是如果这些信息在哈希中不可见哈希被公之于众......那么如何制作自己的BCrypt版本并开始比较?

不提供这些信息更安全,以便如果单独的哈希被泄露,没有人会知道使用了什么配置来制作它?

2 个答案:

答案 0 :(得分:1)

它使bcrypt向前和向后兼容。

例如,bcrypt哈希2a开头。

他们从:

开始
  • $2$
  • $2a
  • $2x$
  • $2y$
  • $2b$

您需要知道自己正在阅读的版本,以便正确处理。

此外,您需要知道迭代次数。

  • 并非每个哈希都会使用10
  • 并非每个哈希都会使用相同的费用

为什么要存储版本和迭代?因为你必须这样做。

此外,它也很棒。在过去,人们过去只是存储哈希,而且很糟糕。

  • 人们每次都使用无盐或同样的盐,因为存放它太难了
  • 人们使用1次迭代或硬编码的迭代次数,因为存储它太难了

BCrypt,SCrypt和Argon2使用非常聪明的想法为你做所有那些笨拙的工作,让你只需要调用一个函数,而不会以任何方式削弱系统的安全性。

答案 1 :(得分:0)

  • 你试图通过默默无闻来宣传安全。停止,它不起作用。

  • 在数据中没有详细信息并不罕见,在this old hack中,黑客提到它是SHA1。这很容易 - 攻击者和研究人员也将获取泄露的数据列表,并使用一小部分常用密码(例如phpbb list from SkullSecurity)尝试各种常见算法和交互/工作因子计数。 ;当他们发现不可避免的破解可怕的密码时,他们会知道他们找到了算法并打破了全面破解。

  • 存储算法意味着您可以逐渐从旧的过渡到新的,并在个体用户进入时升级,并且在一个用户中使用多个变体 - 包括过渡类型

    • 过渡时期:您使用盐渍SHA-1(BAD),移动到PBKDF2-HMAC-SHA-512,重复200,000次(好),在中间您实际批量转换为PBKDF2-HMAC-SHA-512(SHA- 1(盐渍密码)),但在每个用户的登录时,将它们移动到纯PBKDF2-HMAC-SHA-512(密码)。
  • 拥有迭代计数意味着,就像上面的过渡一样,您可以随着时间的推移增加它,并为登录时设置的不同用户设置不同的计数。