当前位置: 首页 > 知识库问答 >
问题:

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

鲍健柏
2023-03-14

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

所以认证的过程看起来是这样的:

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

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

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

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

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

共有1个答案

微生新霁
2023-03-14

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

 类似资料:
  • 我有一个CA提供的jks密钥库,用于对JAR签名。但是,我希望通过HTTPS托管一些内部应用程序,因此需要创建一个SSL证书,以便通过HTTPS加密数据。然而,为了避免浏览器中的不可信证书/未知主机警告,我想知道是否可以使用用于签名JAR的jks密钥库也对我的CSR进行签名,以便创建SSL证书。 到目前为止,我已经设法做到了以下几点: > 使用Java keytool生成证书和私钥对以创建JKS文

  • 我正在我的RESTful API项目中试验认证方法,我非常喜欢生成HMAC-SHA256签名作为认证方法的想法。 客户通过几个简单的步骤创建签名: 并将其与他的“用户名”一起添加到请求标头中(例如)。 在服务器端,我尝试以相同的方式重新创建它: 只要我将用户的密钥以纯文本的形式存储在我的数据库中,所有这些都可以正常工作: 我们都知道这是绝对不可接受的,所以我试图简单地用散列并存储散列字符串: 我现

  • 消息签名 import hmac digest_maker = hmac.new(b'secret-shared-key-goes-here') with open('lorem.txt', 'rb') as f: while True: block = f.read(1024) if not block: break

  • 问题内容: 我使用的是Mysql,我假设最好将用户的个人信息以及他们的登录名和密码分成两个不同的表,然后在两个表之间进行引用。 注意 :为弄清楚我的帖子,我了解保护密码(哈希,盐等)的技术。我只知道,如果我遵循生活中其他部分的做法(投资,数据备份甚至是个人存储),那么在最坏的情况下(包括表或火灾),将信息分散在表之间可能会保护您其他数据。 问题答案: 不要存储密码。如果它曾经位于磁盘上,则可能被盗

  • 编辑:问题是我使用十六进制编码的字符串作为键,我应该使用原始字节。如何从openssl命令中获取原始字节? ---原问题--- 我正在尝试按照以下说明创建签名iam请求:https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html. 它基本上是说要产生签名密钥和签名,您需要遵循以下步骤: 我创建了以下外壳脚