Bcrypt安全性

6

我知道这是一个被问得很多的话题,Bcrypt,但我对它的安全性有一些担忧。

我一直在使用sha512($password.$salt),然后寻找更好的解决方案,发现了Bcrypt

让我担心的是,当阅读有关它的文章时,它说轮数($02$)和盐在3个单独的“块”中存储在哈希中,就像这样:$rounds$.$salt.$hash(或者至少是我这样解释的)。

我的问题是:这不安全吗? 显示所使用的轮数以及明确可用的盐。 因为攻击者可以仅仅通过“好的,我需要2轮,盐是123salt,那就是哈希值”,对吗?

我知道在阅读时,它并不完全是关于安全性的,重要的是破解密码所需的时间,这就是Bcrypt的好处,它很慢。

请问是否有人能够澄清我的误解/误解呢?

谢谢。


你现在是如何存储盐的? - SLaks
我问了同样的问题:https://dev59.com/42ox5IYBdhLWcg3wHAwA - Tchoupi
SLaks,我目前将哈希值插入mysql数据库 - 尽管我已经阅读了Bcrypt包含盐,但我会添加另一个盐,例如Bcrpyt($email.$random_salt.$password,14 rounds),并将结果插入到数据库中。 MathieuImbert - 我没有意识到。不过当弹出框显示“类似的问题”时,我确实进行了检查。 - RobAtStackOverflow
如果你已经在那里存储了盐,你还担心什么? - SLaks
不太确定我是否理解了你的问题,如果我误解了,很抱歉。 实际上,我并没有将我的随机盐存储在数据库中,而是将其包含在哈希值中。 如果你指的是盐已经被显示出来,我无法做任何事情——这是Bcrypt的“设计”。 - RobAtStackOverflow
2个回答

11

bcrypt通过不可约简的复杂性实现安全,而非通过混淆实现安全。

盐的作用是防止攻击者对多个用户重复使用计算结果。
将盐交给攻击者并没有什么问题。

同样地,即使攻击者知道您使用了多少轮迭代,这也不会节省太多时间(假设您使用足够高的轮数)。 使用多轮的目的不是让攻击者不知道要使用多少轮,而是每一轮都强制攻击需要更长的时间。


哦,好的,我以为盐是为了让密码更安全,如果可能的话攻击者不应该知道它。 我想这样更有意义/澄清了事情,谢谢。 - RobAtStackOverflow
@Anonymous2011:盐的作用是使预构建的查找表变得无关紧要。攻击者必须从头开始计算完整的表。 - Leigh
@Anonymous2011:对攻击者隐藏盐值会有所帮助(假设您可以在维护每个用户的盐值的同时有效地执行此操作),但这并非必要。 - SLaks
你可以做的是使用仅存储在不同服务器上的单独安全存储中的密钥加密bcrypt哈希的结果。这将使攻击者对您的数据库更加无用。 - SLaks
Leigh; 啊,好的,我猜那确实有道理。 Slaks; 目前在开发中,我将盐值存储在用户表中,并且每个用户的盐值都是不同的。 在生产环境中,我考虑创建另一个数据库来单独存储盐值(不同的用户名/密码等),以增加安全性。 我觉得这比我目前想做的要复杂一些,但我不会放弃 - 谢谢你的提示,我没有考虑到这一点。 - RobAtStackOverflow

4
盐与哈希值一起存储是因为每个哈希值使用了不同的盐。这与之前使用sha512算法的方法不同,那时所有哈希值都使用相同的盐。
采用此方法后,单个彩虹表仅对一个密码有效;反之,若所有哈希值都使用相同的盐,则单个彩虹表可用于所有哈希值。
“工作因子”(你称之为“轮数”)也需要被存储,以便正确验证哈希值。是的,你可以将其剥离,但并没有造成实质性的伤害。
bcrypt算法设计为一种密集算法。计算单个哈希值很耗费资源,在高工作因子的哈希值上创建查找表是不可能的。
工作因子被设计为随着技术进步而变更,以便始终难以破解bcrypt哈希值。但只能在验证密码的过程中升级哈希值。
您最终可能拥有一个系统,其中不同的哈希值存储有不同的工作负载值,具体取决于哪些哈希值已经升级,哪些没有。

这是我的错,我应该澄清一下我正在使用带有sha512的随机盐 - 但是我理解你关于使用一个“静态”盐不好的观点。 现在我更好地理解了彩虹表的工作原理以及它们在密码破解中的作用,我完全误解了它们。我现在可以看到Bcrypt更好的地方了。 - RobAtStackOverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接