在使用S3-style身份验证的RESTful API中,API客户端使用HMAC-SHA1使用其密钥对请求进行签名,因此密钥永远不会通过网络传输。
然后,服务器使用客户端的密钥重复签名过程并将结果与客户端传输的签名进行比较来对客户端进行身份验证。
这很好,但这意味着服务器需要访问客户端共享密钥的明文。这与所有建议不要在数据库中以明文形式存储用户密码的建议相矛盾。据我所知,仅存储密码的盐哈希值不是选项 - 因为然后我无法验证客户端的签名。
我应该强调我的API是RESTful的,因此应该是无状态的:我宁愿避免在其他API调用之前进行登录步骤。
一个可选的解决方案是使用某些对称密钥算法加密所有用户密码。但是,服务器必须将该加密的密钥存储在某个易于访问的地方,例如源代码中。这比没有更好,但不是最佳解决方案(正如@Rook在他的答案中提到的那样,它违反了CWE-257)。
另一个解决方向可能是围绕非对称签名,但我无法想象如何将其应用于HMAC,并且找不到任何有关该主题的文章。
我错过了什么明显的东西吗?许多受人尊敬的提供商都实施了这种身份验证方案 - 他们不能全部违反常见的安全原则,对吧? 如果没有,您可以分享任何最佳实践吗?
这很好,但这意味着服务器需要访问客户端共享密钥的明文。这与所有建议不要在数据库中以明文形式存储用户密码的建议相矛盾。据我所知,仅存储密码的盐哈希值不是选项 - 因为然后我无法验证客户端的签名。
我应该强调我的API是RESTful的,因此应该是无状态的:我宁愿避免在其他API调用之前进行登录步骤。
一个可选的解决方案是使用某些对称密钥算法加密所有用户密码。但是,服务器必须将该加密的密钥存储在某个易于访问的地方,例如源代码中。这比没有更好,但不是最佳解决方案(正如@Rook在他的答案中提到的那样,它违反了CWE-257)。
另一个解决方向可能是围绕非对称签名,但我无法想象如何将其应用于HMAC,并且找不到任何有关该主题的文章。
我错过了什么明显的东西吗?许多受人尊敬的提供商都实施了这种身份验证方案 - 他们不能全部违反常见的安全原则,对吧? 如果没有,您可以分享任何最佳实践吗?