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