
这是在政府网站的密码重置功能中找到的,您可以在其中输入您的用户名,然后它会将您带到一个屏幕,您可以在其中
- 输入新的密码
- 输入新密码的确认
- 回答一个安全问题(关于你的第一只宠物的名字)
然后提交表单,它会更改您的密码。
我的问题:
- 您如何安全地存储密码,但仍然能够进行这种验证,检查新密码是否与存储在数据库中的旧密码至少有 4 个字符不同。我正在对此进行技术解释。
- 我是否正确地说这个流程一开始似乎不安全?要更改某人的密码,您唯一需要知道的是他们的用户名和一个安全问题。

这是在政府网站的密码重置功能中找到的,您可以在其中输入您的用户名,然后它会将您带到一个屏幕,您可以在其中
然后提交表单,它会更改您的密码。
我的问题:
从数学上讲,他们可以安全地存储密码,以启用该功能但不会以明文形式存储旧密码。但仅仅因为它在数学上是可能的,并不意味着它是可能的。
在 Eurocrypt 2004 上,Michael Freedman、Kobbi Nissim 和 Benny Pinkas发表了一篇论文,该论文明确阐述了如何有效地找到两个集合的交集,而不会将任何一个集合的内容(除了交集之外)透露给以前没有它的任何人。也可以在不透露(很多)交叉口本身的情况下找到交叉口大小的估计值。
现在那是在 2004 年(并且是基于以前的工作)。因此,从那时起,该算法和相关算法都得到了改进。因此,有一些已知的技术可以在不透露任何一组的内容的情况下找出两组共有多少个字符。(在您询问的情况下,只有一组旧密码需要隐藏,因为系统被赋予了完整的新密码。)
如果我们谈论的是四个字符序列的重叠(而不仅仅是两个密码中的字符),那么一种相当安全的方法是使用Bloom Filter。布隆过滤器是一种特殊的哈希表。当将密码提供给服务时,可以将原始密码的每个四个字符的子字符串添加到布隆过滤器中,然后可以在布隆过滤器中查找新密码的所有四个字符的子字符串。
请注意,布隆过滤器设计用于当集合中有很多成员并且是概率性的。他们可以给出误报。
如果有问题的站点使用同态加密甚至布隆过滤器,我会感到震惊。他们几乎可以肯定地这样做是为了让网站的运营商(以及任何违反它们的人)都可以访问明文密码。
这听起来很糟糕,原因有很多。
注意:你没有具体说明你的位置,但我会提到我看到更多的政府和军队组织在一些地方的安全性非常糟糕。这种情况不应该发生,但偶尔会发生。
这是一个非常有趣的问题,关于如何安全地存储密码,但仍然能够进行这种验证,检查新密码是否与存储在数据库中的旧密码至少有 4 个字符不同。
如果要设计一种安全存储密码的方法,但仍允许这种验证,则可以这样做:
存储字母列表和哈希。不要存储实际密码。
这就是您可以实际跟踪使用的字母的方式,同时不存储实际密码。这仍然是一个糟糕的主意,因为如果有人可以访问数据库,那么破解密码就会变得更加容易。