问题描述
我正在尝试设计一个API端点,在这里我使用HMAC验证请求的真实性。
我知道我需要提供客户端API_KEY
和API_SECRET
。
我的问题是:
- 应该使用服务器上的一些秘密盐从
API_SECRET
派生API_KEY
吗? - 我应该将
API_SECRET
存储在某个地方吗?我知道我需要用它来认证请求,但是我担心将其保留在数据库中是因为数据库黑客会暴露所有API_SECRET
。 - 拥有
API_KEY
和API_SECRET
有什么意义?API_KEY
类似于用户名吗?
解决方法
是否应该使用服务器上的一些秘密盐从API_KEY派生API_SECRET?
不。密钥是公共信息,应使用加密安全的PRNG随机生成秘密。如果从密钥派生出秘密,那么发现派生方法的任何人都将能够为他们可能发现的任何密钥派生秘密!
我应该在某个地方存储API_SECRET吗?
是的。您还将如何使用它来验证HMAC签名?
您还可以通过存储用数据库外部保存的密钥加密的秘密来添加附加保护层,尽管更完整的黑客也可以发现它。
您不能像使用密码那样对机密进行哈希处理,因为您需要将其作为HMAC的输入来验证签名,因此您需要某种可逆加密。
拥有API_KEY和API_SECRET有什么意义? API_KEY是否类似于用户名?
广泛,是的。对于HMAC,您需要的只是一个共享机密。但是,您需要知道哪个共享机密才能尝试验证请求。 API_KEY为您提供了一种方法来查找请求声称由其签名的秘密,然后您可以通过使用您自己的秘密副本计算签名并与提供的签名进行(恒定时间)比较来验证请求