我有一个使用HMAC的Web服务来验证已签名的请求。在这种情况下,为我的服务的每个调用者分配了一个密钥(密码)。用户当然会获得该密钥,但我还需要将密钥存储在我的数据库中,以便我的服务可以验证每个请求的签名。
因此,我确实需要以可以检索和使用它的形式将密码存储在数据库中。我不能使用仅在数据库中存储密码的盐渍哈希的最佳实践。
我可以加密密钥但是我需要在某处存储加密密钥。对于安全的RESTful Web服务而言,这是一种相当常见的方案,因此亚马逊(AWS)和Microsoft(Azure)等公司必须解决此问题。
在这种情况下,最佳做法是什么?
答案 0 :(得分:3)
密码应该存储在数据库中的唯一时间是,如果需要密码来连接某些其他系统。如果只需要检查某个其他实体提供的凭据,则应该存储密码的散列。
即使有必要使用密码与另一方联系,如果您需要一些其他凭据来执行此类访问(例如某人登录您的系统,然后您代表他们登录另一个系统),这是可取的实际存储使用提供的密码的哈希加密的外部密码(但不是与存储在数据库中的哈希相同的哈希值)。如果有多个凭据可用于登录您的服务器,请为远程密码存储单独的加密密钥副本,并使用每个可接受的凭据进行加密。
答案 1 :(得分:1)
如果你真的需要密码(例如,为了连接到另一个系统),我建议放在远离其他信息的地方。也许是另一个数据库,文件系统上的加密文件等。如果有人获得您的主数据库,他们就不能保证也会收到相关密码。
可能很明显,但您希望使用其他密钥加密密码的位置(以便不太可能以某种方式获得对主数据源的访问权限的人也可以访问密码数据存储)。 / p>
答案 2 :(得分:0)
听起来您的方案的最佳做法是使用公钥加密。