api - 如何使用 HMAC 使 API 安全?
问题描述
我正在尝试设计一个 API 端点,在那里我使用 HMAC 验证请求的真实性。
我了解我需要向客户提供API_KEY
和API_SECRET
.
我的问题是:
- 应该
API_SECRET
源自API_KEY
在服务器上使用一些秘密盐吗? - 我应该存放在
API_SECRET
某个地方吗?我知道我需要它来验证请求,但我担心将它留在数据库中是 db hack 会暴露所有API_SECRET
s. - 有一个
API_KEY
和一个有什么意义API_SECRET
?API_KEY
类似于用户名吗?
解决方案
API_SECRET 是否应该使用服务器上的一些秘密盐从 API_KEY 派生?
不,密钥是公共信息,秘密应该使用加密安全的 PRNG 随机生成。如果秘密是从密钥派生的,那么任何发现派生方法的人都可以为他们发现的任何密钥派生秘密!
我应该将 API_SECRET 存储在某处吗?
是的。您还将如何使用它来验证 HMAC 签名?
您可以通过存储使用保存在数据库之外的密钥加密的秘密来添加额外的保护层,尽管更完整的黑客也能够发现它。
您不能像使用密码那样对秘密进行哈希处理,因为您需要将其作为 HMAC 的输入来验证签名,因此您需要某种可逆加密。
拥有 API_KEY 和 API_SECRET 有什么意义?API_KEY 是否类似于用户名?
广泛地说,是的。对于 HMAC,您只需要一个共享密钥。但是,您需要知道尝试使用哪个共享密钥来验证请求。API_KEY 为您提供了一种查找请求声称由其签名的秘密的方法,然后您可以通过使用您自己的秘密副本计算签名并与提供的签名进行(恒定时间)比较来验证请求.
推荐阅读
- mbtiles - Load vector tiles from folder instead than from MBTiles file
- ios - UINavigationBar overlapping status bar when open project in xcode 11
- javascript - waht 是 vscode 显示的 javascript 文档中尖括号的含义
- c# - 优化 C# 代码以计算嵌套循环中的出现次数
- c# - 无法解析类型“BackEnd.Models.UserContext”的服务
- c# - Unity 2019.2.5f1 中的最低 API 级别列表缺失
- python-3.x - pyenv 在 macOS Mojave 上安装 3.8.0b4
- c# - 迭代 Treeview 集合以更新编号方案的最佳方法是什么?
- json - 从前端收到的 Json 在后端变为“null”
- textures - updateAndRelease:GLConsumer 未附加到 OpenGL ES 上下文