1

我非常接近了解 bcrypt 的比较功能是如何工作的,但是在我的知识中存在一些缺失的漏洞。

到目前为止我的理解:

brcypt 使用纯文本密码和随机生成的盐生成散列密码。散列密码是 bcrypt 版本、散列盐和串联散列纯文本密码的组合。当用户登录时,他们的纯文本密码通过比较功能运行。此时,bcrypt 知道散列中有多少个字符,以及从哪个偏移量开始将散列盐从完整散列中分割出来。然后它将盐与传入的纯文本密码连接起来,通过散列算法运行它以得到最终的散列字符串。将散列字符串与数据库中的散列字符串进行比较,如果字符完全匹配,则密码正确。

2个问题..

  1. 散列不应该是不可能逆转的吗?如果是这样,那么 bcrypt 如何知道如何解密散列盐,然后使用它来散列传入的纯文本密码。这对我来说没有任何逻辑意义。

  2. 如果 brcypts 算法被编写成它总是可以创建一个它总是知道如何解密的散列盐,那么黑客不能使用该算法从数据库中获取每个散列密码并将盐切掉吗?然后它可以为每种盐创建一个彩虹表并破解每个单独的密码?这在我看来是合乎逻辑的。

如果我的问题没有任何意义,请原谅。很高兴编辑。

阅读文章,阅读堆栈溢出问题,观看视频并询问高级工程师。

4

1 回答 1

1

彩虹表是您可以找到的每个密码及其哈希值的预编译列表。

你的彩虹桌有:

  • 哈希(“密码1234”)
  • 哈希(“猎人2”)
  • 哈希(“正确的马电池订书钉”)

但它没有:

  • 哈希(“ȃ@♽ƅ☸☑+密码1234”)
  • 哈希(“ȃ@♽ƅ☸☑+hunter2”)
  • hash("ȃ@♽ƅ☸☑+正确的马电池订书钉")

您可以继续创建一个彩虹表,其中包含此盐的每个密码。但这只是所谓的蛮力攻击。

而这第二张彩虹表对下一个选择不同盐的网站没有帮助:

  • hash("®óó»♠☘☛Ũh+password1234")
  • hash("®óó»♠☘☛Ũh+hunter2")
  • hash("®óó»♠☘☛Ũh+正确的马电池订书钉")

为了消除所有猜测,以及存储盐和决定盐的所有困难:现代密码哈希算法为您的每个密码生成不同的随机盐,并将盐存储在生成的哈希字符串中:

  • hash("ȼŚ¥dĥ®µ+password1234")
  • hash("ČɆǝ%ËȌÁpmLȫ+hunter2")
  • hash("♼♄ș♰;⚁f)²ŋì³UÍ+正确的马电池订书钉")

这本质上就是 bcrypt 所做的;它为每个密码生成不同的盐。

于 2020-04-05T01:15:50.270 回答