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

问题描述 投票:0回答:1

我正在构建其他开发人员应该可以访问的 REST API。为了对客户端进行身份验证,我决定使用 HMAC-SHA256 请求签名以及 API 密钥秘密密钥

所以认证的过程是这样的:

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

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

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

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

我在这里找到了一些有关安全性和妥协影响的信息:使用 HMAC-SHA1 进行 API 身份验证 - 如何安全地存储客户端密码? 但仍然没有关于存储的有用信息。

rest api hmac
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.