他们偷了你的数据库 无法破解一个密码

2026年8月31日1 次浏览来源:Dev.to阅读原文

想象一下最糟糕的一星期一:有人带着一个垃圾的用户桌走了.

电子邮件、姓名和密码栏。

好消息是,你没有把密码储存在清晰的地方——你用Argon2id储存散列。

坏消息是,这比看起来要少。

为什么单靠散列还不够Argon2id使每次尝试都花费了记忆和时间.

这是一个真正的防御,你应该使用它。

但是,看看是什么支撑着它:让每个攻击者尝试昂贵.

攻击者持有你的 数据库播放 不同规则: 他们不急。

没有利率限制,没有账户锁闭,没有日志让他们离开。

他们需要几个月的时间。

他们不会随机猜测。

他们从被泄露的密码列表开始,这些密码覆盖了任何真实用户群中一个不舒服的部分.

他们不使用您的服务器 。

他们使用每小时租用的GPU.

提高Argon2的成本有帮助 但你每一次合法登录都要付 而且每个候选人都要付一次 算术不在您一边:如果一个密码在被泄露的列表的前一万个条目中坐落,没有合理的参数可以保存.

根本问题是攻击者拥有他们需要的一切.

散地,盐和参数都在同一堆.

他们可以自己计算整个功能.

点子: 弄出一块 如果计算散列依赖于数据库里没有的秘密呢?

简单版本为胡椒:应用程序配置中的一种密钥,在散列前会与密码相混合.

它有帮助,并且有两个严重的问题: 它通常会随数据库一起泄露.

如果攻击者进入了服务器,环境变量就是一个了.

无法旋转 。

改变胡椒会使每道散列同时失效.

一个OPRF解决了第一个在根:秘密活在另一个服务中,而优雅的部分是这个服务从未看到密码.

OPRF是什么,没有数学 一个盲目的Pseudo-Random函数 是两个有不同寻常属性的当事方之间的计算: 你发出的密码被蒙上眼睛——数学上蒙上面具。

服务器接收到噪音 。

服务器将它的秘密密钥用于这种噪音,并返回更多的噪音.

你打开它,得到一个值 只能用钥匙和密码才能得到。

服务器没有学习您的密码 。

你没有学会它的关键。

没有人能计算出这种价值。

你和Argon2id在一起的就是这个价值 现在持有你数据库的攻击者 拥有散列,盐,参数...

而缺失。

他们不能测试一个候选人下线。

为了攻击,他们必须每次尝试一次与OPRF服务交谈——在那里你确实有费率限制,配额和日志.

他们把一场无限制的下线攻击 变成了一次可以测量的在线攻击 这是整个把戏,是巨大的。

几乎无人执行的部分: "可核查" 有个陷阱 如果 OPRF 服务器被损坏, 或者只是使用错误的密钥, 它会返回垃圾值, 你永远也不会发现 : 您将垃圾堆放, 存储, 并锁定您的所有用户 。

更糟糕的是,控制服务器的人可以用他们知道的钥匙回答.

因此,重要的变体是可核查的变体(VOPRF,RFC 9497):服务器附上DLEQ证明它使用了正确的密钥,客户端根据它所钉入的公钥验证.

下面是细节, 使一半的集成, 你会发现有装饰性: 公用钥匙必须被钉出波段。

如果你的客户端从它即将核查的同一服务器上要求它,你已经核实了什么——你要求被检查者带出自己的答案钥匙.

这是一个很容易的错误。

我做了:我的两个客户 如果整形师忽略了, 就会从服务器上取出钥匙。

它的固定方式是使它具有强制性。

任何突破,在它发生在你之前,说 没有建筑决定是免费的, 而这个有一个有三种真正的成本:

1.

您的登录取决于其他服务。

如果 PRF 不回答, 您无法验证密码 。

还有他

分享