【问题标题】:How and where to store secret key(s) of your REST API with HMAC based signing使用基于 HMAC 的签名如何以及在何处存储 REST API 的密钥
【发布时间】:2018-03-04 18:37:21
【问题描述】:

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

所以认证过程是这样的:

  1. 客户端连同请求正文一起发送标头,其中包含他的 API 密钥 和使用某些数据(请求正文/日期/等)+ 密钥生成的签名
  2. 服务器接收请求并检查 API 密钥 是否有效且未被撤销
  3. 服务器从某处获取密钥,并通过与客户端相同的算法生成签名
  4. 如果两个签名(从客户端接收并在服务器上生成)相同,则请求通过身份验证

这里的一切都非常清晰和简单。但问题是: 我应该在哪里以及如何存储那个密钥,它应该是所有客户的唯一一个,还是每个客户都不同

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

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

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

【问题讨论】:

  • 你到底是怎么解决的?

标签: rest api hmac


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2015-08-03
    相关资源
    最近更新 更多