概括
散列密码的主要原因似乎是用户重复使用密码,因此,泄露的密码会泄露有关用户的敏感信息(参见这个问题。)
如果密码是自动生成的并且用户无法更改,是否还有充分的理由只存储密码的(加盐的)哈希值?
具体例子
我有两个组件需要进行通信,例如,设备 A 通过 HTTPS 调用 Web 服务 B。为了防止某些恶意行为者连接到 B 并冒充 A,A 提供了一个密码。我自动生成密码并将其放入 A 和 B 的配置文件中。
现在,A 显然需要纯文本密码,但 B 只需要散列(因为 B 可以对从 A 接收到的值进行散列,并将其与文件中的散列进行比较)。因此,我的安全意识直觉告诉我,我应该只将哈希存储在 B 的配置文件中,但从利弊来看,它并不那么明显:
仅在 B 上存储散列的优点:
- 在 B 的配置文件被泄露而 B 本身没有被泄露的不太可能的情况下,攻击者可以使用密码来冒充 A。(如果 B 本身被泄露,攻击者显然不再需要密码。)
仅在 B 上存储散列的缺点:
- 如果 A 中断并需要更换,我需要更改 B 上的哈希,因为我不再拥有原始密码。(或者,我需要让我的客户(在其前提 A 和 B 运行)安全地存储密码,他们可能不会这样做。或者,我需要将密码安全地存储在某个地方,这是额外的工作和责任风险我。)
我错过的任何其他优点/缺点?