我有一个预先存在的 iOS 和 Android 应用程序,我正在对其进行更新,其中包括 RESTful 服务 API 和用于用户身份验证的 Facebook 登录。该应用程序的总体流程是:
我的应用程序已经很受欢迎并且已经有多个克隆,我想阻止这些克隆能够使用我的 RESTful API(我确信当我发布更新时他们会尝试这样做)。我们假设克隆是聪明的,使用与我的应用程序相同的 Facebook 访问令牌(如果可能的话),并且遵循与我的应用程序类似的调用 API 的模式和频率。
是否有办法确保或几乎确保对我的服务的调用仅来自我的应用程序,而不是克隆?
提前致谢!
您可以通过在请求中包含签名并验证它来完成此操作。
应用程序端:
做类似的事情:
signature = md5( md5(url + data) + MY_RANDOM_KEY)
将
signature
附加到数据或网址等发送调用到 REST api(照常)
服务器端:
从正文/网址中提取
signature
(并将其从那里删除)。计算你认为应该是什么:
signature_should_be = md5( md5(url + data) + MY_RANDOM_KEY)
[请记住,你已经从 url/data 中删除了 signature
,以便你获得处于原始哈希前状态的 url/数据]验证
signature
和 signature_should_be
是否相等这样做,再加上 SSL,应该可以使您的 API 足够安全。
您可以按照 Tommy Crush 的建议进行操作,并在您的应用程序中添加一个秘密。但如果你面对的是聪明的对手,这可能就没用了。攻击者可以反编译您的应用程序或尝试简单地对您的签名算法进行逆向工程。
重要的是要记住,应用程序中存储的任何内容都应被视为已经受到损害,因为攻击者可以反编译您的应用程序并随心所欲地搜索您的代码并从中提取他/她想要的任何内容。您不能依赖应用程序中的任何内容在应用程序中保持安全,因为攻击者可以将其从您的应用程序提取到他们的应用程序中。
需要注意的是,您正在尝试使用 OAuth 进行身份验证,但这并不是目的。它只是用于授权,与身份验证不同。授权只是让您访问资源,但不会告诉您谁访问了它,这就是您面临的问题。要将您的用户验证为真正的用户(或尽可能接近),您需要为您的服务添加登录服务 - 例如滚动您自己的 OAuth 服务器或类似的服务。然后您可以决定谁可以访问该资源,在本例中是您的 RESTful API :) 如果这比其价值更多的工作,那么汤米的计划是一个很好的选择:)
对 Twitter 和 Facebook 等 Restful API 进行身份验证的事实上的解决方案是 OAuth 机制。 您可以在这里找到更多详细信息:http://en.wikipedia.org/wiki/OAuth。
大多数带有外部库的语言都支持 OAuth。 例如,在 Android 上有 https://github.com/wuman/android-oauth-client 库。
正如Tommy Crush所建议的,提到的方法可以防止传输的数据被随意篡改。如果黑客想要攻击,他只能使用脚本或者其他方式发送完全相同的http数据。如果服务器限制完全相同数据的请求,将大大增强服务器API的安全性。