rest - 使用基于 HMAC 的签名如何以及在何处存储 REST API 的 key

标签 rest api hmac

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

所以认证过程是这样的:

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

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

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

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

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

    最佳答案

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

    关于rest - 使用基于 HMAC 的签名如何以及在何处存储 REST API 的 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49098943/

    相关文章:

    rest - REST可发现性和HATEOAS是否暗示您可以更改URI?

    java - Java中将字符串数组解析为Arraylist

    Php Magento Api Rest 创建客户密码问题 :

    azure - 使用 REST API 向 Azure 服务总线队列或主题发送消息

    c# - ruby 中的 hmac-sha1 不同于 C# HMACSHA1

    objective-c - 如何通过json api更新服务器数据库上的数据?

    api - BigCommerce 对从一个 API key 或商店进行的 API 调用次数有任何限制吗?

    api - Spring RestTemplate 与 Jersey Rest Client 与 RestEasy 客户端

    api - 使用可点击的机器人命令发送 Telegram 消息

    security - 带时间窗的 HMAC