如何保持OAuth消费者机密安全,以及如何在受到攻击时作出反应?

这个问题是关于试图了解在像Android这样的移动平台上实现oauth所涉及的安全风险。 这里的假设是我们有一个Android应用程序,在代码中embedded了消费者密钥/秘密。

假设一个消费者的秘密已经被攻破,而黑客已经掌握了这个秘密,那么结果是什么呢?

妥协的消费者秘密假设
我是否正确地指出,这样泄露的用户秘密对用户的安全性没有任何影响,或者存储在用户正在与之交互的OAuth支持提供程序中的任何数据。 数据本身不会被黑客窃取。

黑客需要获得一个有效的用户访问令牌,这是很难得到的。

黑客可以做一个妥协的消费者的秘密?
我也正确地说明以下内容:

  • 黑客可以设置/发布模仿我的应用程序的应用程序。
  • 黑客可以吸引那些将经历OAuthstream程的用户,通过黑客OAuth舞蹈(使用被盗用的用户密钥/秘密)来获取访问令牌。
  • 用户可能会认为他正在处理我的应用程序,因为他将在授权过程中看到一个熟悉的名称(消费者密钥)。
  • 当消费者通过黑客发出请求时,黑客可以很容易地拦截访问令牌,并且与消费者秘密相结合,现在可以代表我签名请求访问我的资源。

最终用户的影响
在这个假设中

  • 黑客利用我的消费者秘密设置了一个应用程序/网站
  • 我的一个用户被骗入授权访问该应用程序/网站

以下可能发生:

  • 最终用户可能会注意到可疑的事情正在进行,并通知服务提供商(例如:Google)有关恶意应用程序
  • 服务提供商可以撤销消费者密钥/秘密

OAuth消费者(我的应用程序)影响:
我的应用程序(包含消费者密码)需要更新,因为否则我的所有客户端将无法授权我的应用程序做他们的请求(因为我的消费者的秘密将不再有效)。

委派所有OAuthstream量
尽pipe可以通过中间networking服务器委托许多OAuth交互(执行OAuth跳舞并将访问令牌发送给用户),但是还必须代理所有服务交互,因为需要消费者密钥/秘密用于签署每个请求。 这是保持消费者密钥/秘密在移动应用程序之外的唯一方法,并且存储在中间networking服务器上的更安全的地方?

备择scheme
这个代理是否有其他select? 是否有可能将消费者密码存储在中间networking服务器上,并且具有Android应用程序(已在市场上发布且已正确签名)的某种机制,可以向中间networking服务器做出安全请求以获取消费者密钥并将其存储内部在应用程序? 可以实现一个机制,中间networking服务器“知道”这是一个官方的Android应用程序,要求获取消费者的秘密,中间的networking服务器将只发放消费者的秘密,该特定的Android应用程序?

总结 :我只是冒险,并保持客户端应用程序的秘密。

代理服务器替代

唯一可以合理缓解我下面列出的问题并进行代理工作的方法是整个九码 – 将处理第三方Web服务资源的所有业务逻辑移至代理服务器,用丰富的用户界面使客户端应用程序哑terminal。 这样,恶意应用程序能够代表它执行的唯一行为将只是您的业务逻辑合法需要的。

但是,现在你又遇到了许多其他问题,不得不处理可靠性和可伸缩性问题。

长时间审议为什么简单的代理将无法正常工作

有些人遇到问题时,会想“我知道,我会自己添加一个代理服务器”,现在有两个问题。 (向Jamie Zawinski道歉)

你的假设基本上是正确的。 直到您开始考虑自己的服务器,是否保留秘密并代理客户端应用程序的调用,或者尝试确定应用程序是否合法并将其秘密。 在这两种方法中,你仍然需要解决“这个请求来自我写的一段代码”的问题吗?

让我重复一遍 – 没有办法区分特定软件运行的线路。 如果消息中的数据看起来是正确的,那么没有任何东西可以certificate它是发送该消息的另一个应用程序

在一天结束的时候,如果我正在写一个恶意程序,我不在乎是否真的知道了真正的秘密,只要我能让一个知道它的人做我的工作。 因此,如果您认为恶意应用程序可以将您的应用程序模拟到第三方OAuth服务器,为什么您确定无法将您的应用程序模拟到您的代理?

但是等等,还有更多。 您的代理服务所在的域名是您的客户和OAuth提供商的身份(由OAuth提供商向最终用户显示)。 如果一个恶意的应用程序可以使你的服务器做坏事,不仅是你的密钥被撤销,但你的公共Web身份也不再被信任。


我将从明显的开始 – 没有办法区分特定的软件运行的线路。 如果消息中的数据看起来是正确的,那么没有任何东西可以certificate它是发送该消息的另一个应用程序。

因此,任何依赖于应用程序存储的秘密的algorithm都可能被欺骗。 OAuth的优势在于,它永远不会将用户的凭据授予应用程序,而是为应用程序提供自己的临时凭据,以便用户在必要时可以撤销。

当然,这里的弱点是,一个足够好的应用程序可以让用户信任它,而不是在完成恶意事件之前撤销证书。

然而,减轻这一点的一个方法是Google采用三段式OAuth而不是标准的两段式OAuth。 在三段式OAuth中,没有预先分配的秘密,但是在每次authentication时,都会发出一个新的访问令牌密码,以及每个访问令牌。 虽然最终还是会有同样的缺点,因为糟糕的应用程序可能会从其进程中读取良好的应用程序的令牌密钥,但每次需要新的访问令牌时,都会导致用户不得不批准应用程序访问。

当然,这也意味着这对用户来说更麻烦一点。