不散列自动生成的密码有什么风险?

信息安全 密码 哈希
2021-08-13 10:49:33

概括

散列密码的主要原因似乎是用户重复使用密码,因此,泄露的密码会泄露有关用户的敏感信息(参见这个问题。)

如果密码是自动生成的并且用户无法更改,是否还有充分的理由只存储密码的(加盐的)哈希值?


具体例子

我有两个组件需要进行通信,例如,设备 A 通过 HTTPS 调用 Web 服务 B。为了防止某些恶意行为者连接到 B 并冒充 A,A 提供了一个密码。我自动生成密码并将其放入 A 和 B 的配置文件中。

现在,A 显然需要纯文本密码,但 B 只需要散列(因为 B 可以对从 A 接收到的值进行散列,并将其与文件中的散列进行比较)。因此,我的安全意识直觉告诉我,我应该只将哈希存储在 B 的配置文件中,但从利弊来看,它并不那么明显:

仅在 B 上存储散列的优点:

  • 在 B 的配置文件被泄露而 B 本身没有被泄露的不太可能的情况下,攻击者可以使用密码来冒充 A。(如果 B 本身被泄露,攻击者显然不再需要密码。)

仅在 B 上存储散列的缺点:

  • 如果 A 中断并需要更换,我需要更改 B 上的哈希,因为我不再拥有原始密码。(或者,我需要让我的客户(在其前提 A 和 B 运行)安全地存储密码,他们可能不会这样做。或者,需要将密码安全地存储在某个地方,这是额外的工作和责任风险我。)

我错过的任何其他优点/缺点?

1个回答

散列密码的主要原因似乎是用户重复使用密码,因此泄露的密码会泄露用户的敏感信息

这是一个不正确的说法。散列的主要原因是为了防止密码泄露,以防攻击者访问数据库(直接访问数据库或其备份)。密码是由用户创建还是由某些工具生成并不重要。

您是对的,可以通过散列“改进”弱密码。但是散列不能真正使弱密码安全。例如,如果攻击者使用 100 000 个弱密码的数据库,他/她可以轻松地测试所有这些密码,尽管使用像 Argon2 这样的“资源昂贵”散列。这就是为什么散列不应该取代密码质量检查的原因。如果用户更改密码,则应对密码进行验证以确保足够的复杂性(长度、随机性)。这同样适用于真实用户的密码和像您的“设备 A”这样的“技术”用户的密码。

在我看来,生成哈希(以防设备 A 的密码需要更新/替换)非常容易。这不仅应该在 A 受到威胁的紧急情况下进行,而且应该定期进行,例如每月一次或每 3 个月一次。管理员应该有一个工具。因此,更新密码需要几秒钟的时间。这就是为什么我看不出它有任何缺点。

TLDR:没有真正的缺点,只有优点。