想象一下最糟糕的一星期一:有人带着一个垃圾的用户桌走了.
电子邮件、姓名和密码栏。
好消息是,你没有把密码储存在清晰的地方——你用Argon2id储存散列。
坏消息是,这比看起来要少。
为什么单靠散列还不够Argon2id使每次尝试都花费了记忆和时间.
这是一个真正的防御,你应该使用它。
但是,看看是什么支撑着它:让每个攻击者尝试昂贵.
攻击者持有你的 数据库播放 不同规则: 他们不急。
没有利率限制,没有账户锁闭,没有日志让他们离开。
他们需要几个月的时间。
他们不会随机猜测。
他们从被泄露的密码列表开始,这些密码覆盖了任何真实用户群中一个不舒服的部分.
他们不使用您的服务器 。
他们使用每小时租用的GPU.
提高Argon2的成本有帮助 但你每一次合法登录都要付 而且每个候选人都要付一次 算术不在您一边:如果一个密码在被泄露的列表的前一万个条目中坐落,没有合理的参数可以保存.
根本问题是攻击者拥有他们需要的一切.
散地,盐和参数都在同一堆.
他们可以自己计算整个功能.
点子: 弄出一块 如果计算散列依赖于数据库里没有的秘密呢?
简单版本为胡椒:应用程序配置中的一种密钥,在散列前会与密码相混合.
它有帮助,并且有两个严重的问题: 它通常会随数据库一起泄露.
如果攻击者进入了服务器,环境变量就是一个了.
无法旋转 。
改变胡椒会使每道散列同时失效.
一个OPRF解决了第一个在根:秘密活在另一个服务中,而优雅的部分是这个服务从未看到密码.
OPRF是什么,没有数学 一个盲目的Pseudo-Random函数 是两个有不同寻常属性的当事方之间的计算: 你发出的密码被蒙上眼睛——数学上蒙上面具。
服务器接收到噪音 。
服务器将它的秘密密钥用于这种噪音,并返回更多的噪音.
你打开它,得到一个值 只能用钥匙和密码才能得到。
服务器没有学习您的密码 。
你没有学会它的关键。
没有人能计算出这种价值。
你和Argon2id在一起的就是这个价值 现在持有你数据库的攻击者 拥有散列,盐,参数...
而缺失。
他们不能测试一个候选人下线。
为了攻击,他们必须每次尝试一次与OPRF服务交谈——在那里你确实有费率限制,配额和日志.
他们把一场无限制的下线攻击 变成了一次可以测量的在线攻击 这是整个把戏,是巨大的。
几乎无人执行的部分: "可核查" 有个陷阱 如果 OPRF 服务器被损坏, 或者只是使用错误的密钥, 它会返回垃圾值, 你永远也不会发现 : 您将垃圾堆放, 存储, 并锁定您的所有用户 。
更糟糕的是,控制服务器的人可以用他们知道的钥匙回答.
因此,重要的变体是可核查的变体(VOPRF,RFC 9497):服务器附上DLEQ证明它使用了正确的密钥,客户端根据它所钉入的公钥验证.
下面是细节, 使一半的集成, 你会发现有装饰性: 公用钥匙必须被钉出波段。
如果你的客户端从它即将核查的同一服务器上要求它,你已经核实了什么——你要求被检查者带出自己的答案钥匙.
这是一个很容易的错误。
我做了:我的两个客户 如果整形师忽略了, 就会从服务器上取出钥匙。
它的固定方式是使它具有强制性。
任何突破,在它发生在你之前,说 没有建筑决定是免费的, 而这个有一个有三种真正的成本:
1.
您的登录取决于其他服务。
如果 PRF 不回答, 您无法验证密码 。
还有他