如何以及在何处存储基于HMAC签名的REST API的密钥

时间:2018-03-04 18:37:22

标签: rest api hmac

我正在构建应该可供其他开发人员使用的REST API。为了验证客户端,我决定使用 API密钥密钥来使用HMAC-SHA256请求签名。

因此,身份验证的过程如下所示:

  1. 与请求正文一起,客户端发送包含 API密钥的标题和使用某些数据生成的签名(请求正文/日期/等)+ 密钥
  2. 服务器接收请求并检查 API密钥是否有效且未撤销
  3. 服务器从某处获取密钥并按照与客户端相同的algorythm生成签名
  4. 如果两个签名(从客户端收到并在服务器上生成)都相同,则请求已通过身份验证
  5. 这里的一切都非常简单明了。但问题是: 我应该在哪里以及如何存储密钥,并且它应该是所有客户的唯一客户,还是每个客户的不同

    我已经阅读了很多文章,其中有很多关于如何实现这种请求身份验证的好例子,但没有一个说明我应该如何在数据库中存储密钥 - 或者位于服务器FS的某个文档中。据我了解,不应加密 API密钥密钥。因为第一个用于识别或撤销客户端,第二个应该可以快速访问服务器以创建和比较签名。

    回到问题的第二部分,它应该是所有用户中唯一的密钥还是每个用户的私有密钥?如果它是唯一的一个密钥,将它隐藏在服务器上很简单,例如在环境变量中。但如果它应该在客户端受到损害呢?在这种情况下,我应该更改密钥,它将阻止我的所有其他客户端的API ......

    我在这里找到了一些有关安全性和妥协影响的信息:Using HMAC-SHA1 for API authentication - how to store the client password securely? 但仍然没有关于存储的有用信息。

1 个答案:

答案 0 :(得分:0)

我认为您应该为每个用户存储私有密钥。针对每个用户存储的密钥,应该使用AES或DES加密对其自身进行加密。 有了这个,为了拥有完全访问权限,攻击者就需要访问数据库和应用程序代码。 要针对该用户存储加密的秘密密钥,可以使用单个密钥进行加密和解密。