security - OAuth 1.0a,2 足 : how do you securely store clients' credentials (keys/secrets)?

标签 security api authentication oauth 2-legged

OAuth 1.0a 凭证需要以明文形式(或以明文形式检索的方式)存储在服务器上,至少在进行 2 腿身份验证时,我是否正确?假设您使用的是 HTTPS 或其他 TLS,这不是比使用用户名和加盐 + 哈希密码安全性低得多吗?有没有一种方法可以存储这些凭据,以便安全漏洞不需要撤销所有凭据?

<小时/>

更详细地说:我正在实现一个 API,并希望使用 OAuth 1.0a 来保护它。 future 可能会有很多不同的 API 客户端,但到目前为止唯一一个不需要敏感的用户数据,所以我打算使用“两条腿”OAuth。

据我了解,这意味着我为每个 API 客户端生成一个消费者 key 和一个共享 key 。对于每个 API 请求,客户端都会提供使用者 key 以及使用共享 key 生成的签名。 secret 本身不是通过线路发送的,我绝对理解为什么这比直接发送用户名和密码更好。

但是,据我了解,消费者和提供者都必须显式存储消费者 key 和共享 secret (如果我错了,请纠正我),这似乎是一个重大的安全风险。如果攻击者破坏了包含消费者 key 和共享 secret 的提供商的数据存储,则每个 API 客户端都将受到损害,重新保护系统的唯一方法就是撤销每个 key 。这与密码相反,密码(理想情况下)永远不会以可逆的方式存储在服务器上。如果您对密码进行加盐和散列处理,那么攻击者将无法仅通过破坏您的数据库来侵入任何帐户。

我所做的所有研究似乎只是通过说“像处理任何敏感数据一样保护凭证”来掩盖这个问题,但这似乎很荒谬。违规行为确实会发生,虽然它们可能会暴露敏感数据,但它们不应该允许攻击者冒充用户,对吗?

最佳答案

你是对的。然而,oAuth 允许您代表用户登录,因此目标服务器(您从中访问数据的服务器)需要信任您提供的 token 。

当您是用户键入的 secret 的接收者时,密码哈希值是很好的选择(顺便说一句,这就是当 oAuth 向用户呈现登录/接受窗口以随后生成 token 时发生的情况) )。这就是“明文”部分发生的地方(用户以明文形式输入密码)。

您需要有一个等效的机制,以便服务器能够识别您; oAuth 提供的是提供密码以外的东西的能力 - 一种有限的授权形式,用于代表他登录。如果泄漏,那么您需要使其无效。

您可以以或多或少复杂的方式存储这些 secret ,最终您仍然需要向服务器提供“明文”版本(但是,该服务器可能会使用哈希来存储它以进行检查) ,因为它只需要验证您以纯文本形式呈现的内容(经过哈希处理后)是否与它们存储的哈希相对应)

关于security - OAuth 1.0a,2 足 : how do you securely store clients' credentials (keys/secrets)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11299444/

相关文章:

javascript - 使用密码连接数据库的最佳方式是什么?

api - 如何通过VK api上传视频

ios - 像 Facebook-App 一样登录

java - 如何使用HttpURLconnection进行身份验证

spring - 使用 Spring Security Rest Plugin 使 Grails Controller 操作具有公共(public)访问权限

安卓反破解,到底值不值?

java - 使用基于 Grails JAX-RS 插件的 RESTful API 上传文件

api - REST 风格的 API : Modelling a collection of resources that have access to another resource

c# - 如何将 Windows 身份验证凭据从客户端传递到 Web API 服务

.net - ServiceStack session ID 是否足够安全?