移动应用中的OAuth秘密
使用OAuth协议时,您需要从要委派的服务中获取一个秘密string。 如果您是在networking应用程序中执行此操作,则可以将该秘密存储在数据库或文件系统中,但是在移动应用程序(或桌面应用程序)中处理该问题的最佳方法是什么?
在应用程序中存储string显然不好,因为有人可以很容易地find它并滥用它。
另一种方法是将其存储在您的服务器上,并让应用程序在每次运行时都获取,而不是将其存储在电话上。 这几乎一样糟糕,因为您必须在应用中包含url。
我能想到的唯一可行的解决scheme是首先像往常一样获取访问令牌(最好使用应用程序内部的Web视图),然后通过我们的服务器路由所有进一步的通信,将秘密添加到请求数据并进行通信与提供者。 再说一遍,我是安全的noob,所以我真的很想听听一些有见识的人的意见。 在我看来,大多数应用程序都不会保证安全(例如,Facebook Connect似乎认为你把密码放在你的应用程序的string中)。
另一件事:我不相信秘密涉及最初请求访问令牌,所以可以完成,而不涉及我们自己的服务器。 我对么?
是的,这是我们面临的OAuthdevise的一个问题。 我们select通过我们自己的服务器代理所有的电话。 OAuth并没有完全刷新桌面应用程序方面。 没有完美的解决scheme,我发现没有改变OAuth的问题。
如果你仔细想想,问问为什么我们有秘密,主要是为了提供和禁用应用程序。 如果我们的秘密遭到破坏,那么提供商只能真正撤销整个应用程序。 由于我们必须在桌面应用程序中embedded我们的秘密,所以我们正在拧紧。
解决scheme是为每个桌面应用程序有一个不同的秘密。 OAuth不会使这个概念变得简单。 一种方法是让用户自己创build一个秘密,并将自己的密钥input到桌面应用程序中(某些Facebook应用程序做了类似的很长一段时间,让用户去创buildFacebook来设置自定义测验和废话)。 这对用户来说不是一个好的体验。
我正在制定一个OAuth授权系统的build议。 我们的概念是,使用我们自己的密钥,我们可以向我们自己的桌面客户端(每个桌面应用程序基本上都有一个)发布我们自己的委托秘密,然后在身份validation过程中,我们将该密钥发送到顶层提供商回电给我们,并与我们重新validation。 这样,我们可以撤销我们向每个桌面客户端发出的自己的秘密。 (从SSL中借用了很多这样的工作)。 这整个系统将是值得添加的networking服务,并传递到第三方networking服务的呼叫。
如果最高级别提供者提供API来生成和撤销新的委托秘密,则该过程也可以在没有委托validationcallback的情况下完成。 Facebook正在做类似的事情,允许Facebook应用程序允许用户创build子应用程序。
网上有一些关于这个问题的讨论:
http://blog.atebits.com/2009/02/fixing-oauth/ http://groups.google.com/group/twitter-development-talk/browse_thread/thread/629b03475a3d78a1/de1071bf4b820c14#de1071bf4b820c14
Twitter和Yammer的解决scheme是一个身份validation引脚解决scheme: https : //dev.twitter.com/oauth/pin-based https://www.yammer.com/api_oauth_security_addendum.html
使用OAUth 2.0,您可以将秘密存储在服务器上。 使用服务器获取一个访问令牌,然后移动到应用程序,您可以直接从应用程序调用该资源。
使用OAuth 1.0(Twitter),需要秘密来进行API调用。 通过服务器代理调用是确保秘密不被泄露的唯一方法。
两者都需要一些机制,服务器组件知道你的客户正在调用它。 这往往是在安装和使用特定于平台的机制来获得一个在您的服务器调用某种types的应用程序ID。
(我是OAuth 2.0规范的编辑)
一种解决scheme可能是将OAuth秘密硬编码到代码中,而不是一个普通的string。 以某种方式对其进行混淆 – 将其分割为段,按偏移量移动字符,旋转它 – 执行其中的任何或所有操作。 一个黑客可以分析你的字节码并findstring,但是混淆代码可能很难弄清楚。
这不是一个万无一失的解决scheme,而是一个便宜的解决scheme。
根据漏洞利用的价值,一些天才cookies可以花费更多的时间来查找你的密码。 您需要权衡这些因素 – 前面提到的服务器端解决scheme的成本,激励破解者花更多精力寻找您的密码,以及您可以实现的混淆的复杂性。
不要将秘密存储在应用程序中。
你需要有一个服务器,可以通过https (显然)的应用程序访问,并存储在其上的秘密。
当有人想要通过移动/桌面应用程序login时,应用程序将简单地将请求转发到服务器,然后服务器将附加秘密并将其发送给服务提供商。 你的服务器可以告诉你的应用程序是否成功。
然后,如果你需要从服务(脸书,谷歌,微博等)获取任何敏感信息,应用程序会问你的服务器,你的服务器只有在连接正确的情况下才会把它提供给应用程序。
除了将其存储在服务器上之外,没有其他select。 客户端没有什么是安全的。
注意
这就是说,这只会保护你免受恶意客户的侵害,而不是客户端对恶意的你,而不是客户端对付其他的恶意客户(phising)。
在浏览器中OAuth是一个比桌面/移动更好的协议。
这里有一些想法。 Google提供了两种OAuth方法…用于Web应用程序,您可以在其中注册域并生成一个唯一的密钥,并为安装的应用程序使用“匿名”密钥。
也许我在阅读中掩盖了某些东西,但似乎与安装的应用程序共享Web应用程序的唯一密钥可能比在官方安装的应用程序方法中使用“匿名”更安全。
使用OAuth 2.0,您可以简单地使用客户端stream程来获取访问令牌,然后使用该访问令牌来validation所有进一步的请求。 那么你根本就不需要秘密。
如何实现这个好的描述可以在这里find: https : //aaronparecki.com/articles/2012/07/29/1/oauth2-simplified#mobile-apps
正如其他人所提到的那样,将密钥本地存储在设备上应该没有真正的问题。
最重要的是,您始终可以依赖基于UNIX的Android安全模型:只有您的应用程序可以访问您写入文件系统的内容。 只需将信息写入应用程序的默认SharedPreferences对象。
为了获得这个秘密,必须获得Android手机的root权限。
我没有大量的OAuth经验 – 但是并不是每个请求都不仅需要用户的访问令牌,还需要一个应用程序用户密钥和密码? 因此,即使有人盗取了移动设备并试图从中提取数据,他们也需要一个应用程序密钥和秘密,以便能够实际执行任何操作。
我一直认为OAuth背后的意图是让每个有混搭的汤姆,迪克和哈利都没有必要把你的Twitter凭证存储起来。 我认为尽pipe存在局限性,但它能很好地解决这个问题。 另外,它并没有真正devise与iPhone的想法。
我同意Felixyz。 OAuth虽然比基本身份validation更好,但仍然有很长的路要走,成为一个很好的解决scheme的移动应用程序。 我一直在使用OAuth来authentication手机应用程序到Google App Engine应用程序。 您无法在移动设备上可靠地pipe理消费者密码的事实意味着默认情况下使用“匿名”访问。
Google App Engine OAuth实施的浏览器授权步骤会带您进入包含以下文字的页面:“该网站<some-site>正在请求访问您的Google帐户,以获取下面列出的产品”
YourApp(yourapp.appspot.com) – 不隶属于Google
等等
如果您使用自定义scheme来拦截callback,则可以使用您提供的callbackurl中使用的域名/主机名称中的<some-site>,这可以是Android上的任何内容。 因此,如果您使用“匿名”访问或您的消费者机密受到侵害,那么任何人都可以编写一个使用户欺骗用户访问您的gae应用程序。
Google OAuth授权页面也包含很多严重程度不等的警告,具体取决于您使用的是“匿名”,消费者机密还是公用密钥。
相当可怕的东西,普通用户谁不技术上的精明。 我并不期望在这种方式上有很高的注册完成率。
这篇博文阐明了消费者秘密如何与安装的应用程序无关。 http://hueniverse.com/2009/02/should-twitter-discontinue-their-basic-auth-api/
我也试图想出一个移动OAuth身份validation的解决scheme,并在一般的应用程序包中存储秘密。
而一个疯狂的想法打我:最简单的想法是将秘密存储在二进制文件,但不知何故混淆,或者换句话说,你存储encryption的秘密。 所以,这意味着你必须存储一个密钥来解密你的秘密,这似乎已经带走了我们的整个圈子。 但是,为什么不使用已经在OS中的密钥,即它是由操作系统定义的,而不是由您的应用程序定义的。
所以,为了澄清我的想法是,你select一个由OS定义的string,哪一个并不重要。 然后使用此string作为密钥encryption您的密码,并将其存储在您的应用程序中。 然后在运行时,使用密钥解密variables,这只是一个操作系统常量。 任何黑客窥视你的二进制文件将看到一个encryption的string,但没有密钥。
这会工作吗?
在这里,我已经回答了在移动应用程序中存储oAuth信息的安全方法
Facebook尚未严格执行OAuth,但他们已经实现了一种方法,让您不要将自己的秘密embedded到iPhone应用程序中: https : //web.archive.org/web/20091223092924/http : //wiki。 developers.facebook.com/index.php/Session_Proxy
至于OAuth,是的,我考虑得越多,就有点塞。 也许这会解决它。