使用HMAC-SHA1进行API身份验证 - 如何安全地存储客户端密码?
在使用S3样式身份验证的RESTful API中,API客户端使用HMAC-SHA1使用其密钥对请求进行签名,因此密钥永远不会通过线路传输。
然后,服务器使用该客户端的密钥对客户端进行身份验证,以重复签名过程本身,并将结果与客户端发送的签名进行比较。
这一切都很好,但这意味着服务器需要访问客户端共享密钥的明文。面对所有建议,这反对在数据库中清除用户密码。就我所知,只存储密码的盐渍哈希不是一个选项 - 因为那时我无法验证客户端的签名。
我应该强调我的API是RESTful的,因此应该是无状态的:我宁愿在其他API调用之前避免登录步骤。
一种可选的解决方案是使用一些对称密钥算法加密所有用户密码。但是,服务器必须将密钥存储在易于访问的某个地方,例如,在源代码中。这比没有好,但不是最佳解决方案(正如@Rook在他的回答中提到的,它违反了CWE-257)。
解决方案的另一个方向可能是非对称签名,但我无法弄清楚如何将其应用于HMAC,并且找不到关于该主题的任何文章。
我错过了一些明显的东西吗?许多可敬的提供商已经实施了这种认证方案 - 它们不能都违反共同的安全原则,是吗?
如果没有,您是否有可以分享的最佳实践?
没有找到相关结果
已邀请:
3 个回复
缉康怪
惜堡沁戚
烷刨画颠离