如何使用 HMAC 确保 API 安全?

How do you make an API secure using HMAC?

我正在尝试设计一个 API 端点,我在其中使用 HMAC 验证请求的真实性。

我明白我需要提供客户端API_KEYAPI_SECRET

我的问题是:

Should API_SECRET be derived from API_KEY using some secret salt on the server?

没有。密钥是 public 信息,机密应使用 cryptographically-secure PRNG 随机生成。如果秘密是从密钥派生的,那么发现派生方法的任何人都能够为他们发现的任何密钥派生秘密!

Should I be storing API_SECRET somewhere?

是的。您还将如何使用它来验证 HMAC 签名?

您可以通过存储使用保存在数据库外部的密钥加密的秘密来添加额外的防护层,尽管更完整的黑客也能够发现它。

您不能像使用密码那样对秘密进行哈希处理,因为您需要将其作为 HMAC 的输入来验证签名,因此您需要某种可逆加密。

What is the point of having an API_KEY and an API_SECRET? Is the API_KEY analogous to a username?

大体上,是的。对于 HMAC,您所需要的只是一个共享密钥。但是,您需要知道 哪个 共享密钥以尝试验证请求。 API_KEY 为您提供了一种方法来查找请求声称由其签名的秘密,然后您可以通过使用您自己的秘密副本计算签名并执行 (constant-time ) 与提供的签名的比较。