这个问题的答案API 机密可以以纯文本形式存储还是可以解密?让我有些不安。我正在努力思考如何以明文形式存储密钥是安全的。
这就是我想象的基于 API 访问密钥/密钥的系统的工作方式:
- 客户端获取请求文本并应用 HMAC 函数
secretKey
,导致signature
- 客户端添加
signature
和accessKey
请求(有效地作为身份验证标头)并发送到服务器 - 服务器
accessKey
从请求中提取并查找对应的serverSecretKey
- 服务器获取请求文本并应用服务器版本的 HMAC 函数
serverSecretKey
,导致serverSignature
- 服务器
signature
比较serverSignature
;如果它们匹配,很好,我们很好 - 我们知道客户端同时拥有有效的访问密钥和有效的密钥
所以在我继续之前,如果上述内容不正确,那么这个问题的其余部分或多或少将毫无意义 - 所以请让我知道上述对 API 访问/密钥的理解是否有效:-)
假设我的理解是有效的——我的问题又回到了密钥是如何存储的——它必须以明文形式存储才能使上述系统正常工作。
那么,如果攻击者获得了对我的数据库的访问权限,该数据库拥有我所有客户的 API 访问密钥和密钥,会发生什么?难道他们不能轻松地使用他们喜欢的任何访问/密钥组合,并愉快地冒充任何客户吗?
我从bcrypt
-ed 密码的角度来看这个。如果攻击者使用大量bcrypt
-ed 密码访问数据库,他们需要做大量工作才能使该数据库对他们有价值,因为暴力破解一组bcrypt
-ed 密码的计算成本很高。这感觉比将秘密 API 密钥以明文形式存储在某个数据库中要安全得多。
看起来 API 访问密钥/密钥组合实际上只提供了防止篡改消息的保护(因为在上面的步骤 #1 和 #2 中计算的数字签名与密钥相关联)并且并没有真正提供任何保证客户就是他们所说的那个人。我看不出它如何提供与bcrypt
-ed 密码相当的安全级别。
我在这里想念什么?