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