忘记密码:“新密码必须与以前的密码至少有 4 个字符”

信息安全 密码 重设密码
2021-08-20 10:08:33

有关密码验证,请参见此处

这是在政府网站的密码重置功能中找到的,您可以在其中输入您的用户名,然后它会将您带到一个屏幕,您可以在其中

  • 输入新的密码
  • 输入新密码的确认
  • 回答一个安全问题(关于你的第一只宠物的名字)

然后提交表单,它会更改您的密码。

我的问题:

  1. 您如何安全地存储密码,但仍然能够进行这种验证,检查新密码是否与存储在数据库中的旧密码至少有 4 个字符不同。我正在对此进行技术解释。
  2. 我是否正确地说这个流程一开始似乎不安全?要更改某人的密码,您唯一需要知道的是他们的用户名和一个安全问题。
3个回答

从数学上讲,他们可以安全地存储密码,以启用该功能但不会以明文形式存储旧密码。但仅仅因为它在数学上是可能的,并不意味着它是可能的。

同态加密

在 Eurocrypt 2004 上,Michael Freedman、Kobbi Nissim 和 Benny Pinkas发表了一篇论文,该论文明确阐述了如何有效地找到两个集合的交集,而不会将任何一个集合的内容(除了交集之外)透露给以前没有它的任何人。也可以在不透露(很多)交叉口本身的情况下找到交叉口大小的估计值。

现在那是在 2004 年(并且是基于以前的工作)。因此,从那时起,该算法和相关算法都得到了改进。因此,有一些已知的技术可以在不透露任何一组的内容的情况下找出两组共有多少个字符。(在您询问的情况下,只有一组旧密码需要隐藏,因为系统被赋予了完整的新密码。)

布隆过滤器

如果我们谈论的是四个字符序列的重叠(而不仅仅是两个密码中的字符),那么一种相当安全的方法是使用Bloom Filter布隆过滤器是一种特殊的哈希表。当将密码提供给服务时,可以将原始密码的每个四个字符的子字符串添加到布隆过滤器中,然后可以在布隆过滤器中查找新密码的所有四个字符的子字符串。

请注意,布隆过滤器设计用于当集合中有很多成员并且是概率性的。他们可以给出误报。

可悲的是,显而易见的答案是正确的

如果有问题的站点使用同态加密甚至布隆过滤器,我会感到震惊。他们几乎可以肯定地这样做是为了让网站的运营商(以及任何违反它们的人)都可以访问明文密码。

这听起来很糟糕,原因有很多。

  1. 密码的存储方式可以以明文形式快速检索,因此可以与新密码进行比较。
  2. 密码的存储显然不是使用单向哈希。
  3. 如果存储这些密码的系统遭到破坏,攻击者随后将有权访问所有组织成员的实际密码。
  4. 在安全问题中使用昵称是不好的,因为对许多人来说这是公共信息而不是秘密。
  5. 您没有指定,但如果密码重置过程不使用带外验证方法(如电子邮件或短信,两者都有自己的问题)来验证有效用户更改密码但直接允许访问任何请求更改非常糟糕的密码的攻击者。

注意:你没有具体说明你的位置,但我会提到我看到更多的政府和军​​队组织在一些地方的安全性非常糟糕。这种情况不应该发生,但偶尔会发生。

这是一个非常有趣的问题,关于如何安全地存储密码,但仍然能够进行这种验证,检查新密码是否与存储在数据库中的旧密码至少有 4 个字符不同。

如果要设计一种安全存储密码的方法,但仍允许这种验证,则可以这样做:

  1. 获取密码中的所有字母,并按字母顺序对它们进行唯一排序。对它们进行排序并删除重复项很重要,否则您将保存完整的密码。
  2. 安全地散列密码(PBKDF2 或 crypt)。
  3. 存储字母列表和哈希。不要存储实际密码。

    • 原始密码:thisisareallyaweseompaSSw0rd!!!
    • 存储的字母:!0Sadehilmoprstwy
    • 存储哈希:(Sha512 哈希)

这就是您可以实际跟踪使用的字母的方式,同时不存储实际密码。这仍然是一个糟糕的主意,因为如果有人可以访问数据库,那么破解密码就会变得更加容易。