嘿,首先,让我说,我不是在询问 md5(md5(... 之类的东西,已经有关于它的主题。
我的问题是这样的:
我们允许我们的客户在本地存储他们的密码。自然,我们不希望它们存储在计划文本中,因此我们在存储和/或发送之前在本地对它们进行 hmac 处理。现在,这很好,但如果这就是我们所做的一切,那么服务器将拥有存储的 hmac,并且由于客户端只需要发送 hmac,而不是纯文本密码,攻击者可以使用来自服务器的存储哈希访问任何人的帐户(当然,在灾难性的情况下,有人会获得对数据库的这种访问权限)。
因此,我们的想法是通过 hmac 对客户端上的密码进行一次编码,将其发送到服务器,然后通过 hmac 对其进行第二次编码,并将其与存储的两次 hmac 化密码进行匹配。这将确保:
- 客户端可以将密码存储在本地,而无需将其存储为纯文本
- 客户端可以发送密码而不必(过多)担心其他网络方
- 服务器可以存储密码,而不必担心有人从服务器窃取密码并使用它进行登录。
自然,所有其他事情(强密码、双盐等)也适用,但与问题并不真正相关。
实际的问题是:这听起来像一个可靠的安全设计吗?我们是否忽略了以这种方式做事的任何缺陷?可能有这样的安全模式吗?
附录:我们不想在客户端以纯文本形式本地存储密码的原因是因为令人遗憾的是,许多人仍然对多个服务使用相同的密码,因此获得“真实”密码会更大用户的安全漏洞,而不是让他的哈希被盗。