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

Posted

技术标签:

【中文标题】bcrypt 哈希究竟如何防止彩虹表查找?【英文标题】:How exactly does a bcrypt hash prevent rainbow table lookup? 【发布时间】:2019-11-20 12:42:33 【问题描述】:

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

到目前为止我的理解:

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

2 个问题..

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

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

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

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

【问题讨论】:

检查this 还要回答你的问题 2,这就是盐的作用:使得设计彩虹表在计算上非常昂贵/不可行:黑客必须创建一个单独的彩虹每种可能的盐的表(请记住,盐空间非常大)。彩虹表通过预先计算散列来工作。这是相当困难的工作,至少可以说,没有盐。现在,想象一下必须为盐空间的每个可能元素做些什么。稍后可能会提供完整的答案,如果我有时间 【参考方案1】:

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

你的彩虹桌有:

hash("password1234") hash("hunter2") hash("正确的马电池订书钉")

但它没有:

hash("ȃ@?♽?ƅ?☸☑+password1234") hash("ȃ@?♽?ƅ?☸☑+hunter2") hash("ȃ@?♽?ƅ?☸☑+正确的马电池订书钉")

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

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

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

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

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

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

【讨论】:

以上是关于bcrypt 哈希究竟如何防止彩虹表查找?的主要内容,如果未能解决你的问题,请参考以下文章

如何将密码文本与 bcrypt 哈希值进行比较?

nodejs - 如何比较bcrypt的两个哈希密码

hmac

带有 BCrypt 哈希的 AES 256。如何从数据库中检查用户密码? [复制]

使用mongoose和bcrypt实现用户密码加密

bcrypt 哈希加密的问题 - node.js