【发布时间】:2012-04-29 13:20:07
【问题描述】:
我们一直在我们的 android 应用程序中实现 Facebook Android SDK,它需要将应用程序签名存储在 facebook 服务器上,以便可以验证从应用程序到 facebook 的调用。我们想将此系统用于我们自己的后端,以确保它仅被我们的应用程序使用,对此我有以下问题:
(相关类请参考https://github.com/facebook/facebook-android-sdk/tree/master/facebook/src/com/facebook/android)
- 显然,要通过匹配签名来验证调用,需要将应用的签名发送到服务器。在 sdk 中,我似乎找不到这是在哪里完成的?
- 似乎没有使用https,对吗? (Util.java)
- 难道不能嗅探签名导致整个系统毫无意义吗?
- Facebook.java 在文件底部保存 facebook 应用程序的签名。改变这一点似乎微不足道。但是,据我了解,发送 Intent 的应用程序的签名可以通过该 Intent 解决。 Android 系统对此进行管理,因此无法伪造签名。但是,在调用 url 时,Android 系统是否可以将签名添加到协议中,使其不可变?我猜不是,这让我对上述问题感到好奇。
[编辑回复nitzan & zapl]
我想要实现的目标与 facebook sdk 要求您将签名存储在他们的服务器上的原因相同;确保对我们后端的调用是从我们的应用程序发送的,而不是其他任何东西。我们不想让机器人或其他应用程序访问我们的服务器 API。 facebook sdk 具有检查 Intent 是否来自 Facebook 应用程序的方法,这是安全的,因为 Android 系统对签名和 Intent 进行了封闭管理。解决这个问题的唯一方法是运行修改后的 Android 版本,该版本允许覆盖应用程序签名,但人们构建和运行的几率可以忽略不计。但是,运行应用程序,嗅探通过非 https 协议发送的签名并构建使用此签名和 api 调用的应用程序不是。似乎使这样的系统工作的唯一方法是使用 https,而 facebook sdk 似乎没有。
请注意,我在上面描述的 Intent 验证方法与对 facebook 服务器的 url 调用不同。 Intents 用于让设备上的 Facebook 应用程序与实现 SDK 的应用程序进行通信。 Android 系统确保与传入 Intent 一起发送的 Facebook 应用程序的签名不会被伪造,因此 Facebook 应用程序->应用程序通信系统是安全的。与这个内部系统相反,我的问题是关于向外发送 url 调用到服务器的外部系统,如果签名可以在调用中不可变地发送,这将是安全的,基本上实现与 Intent 系统相同的系统。
[编辑 2]
与我们的假设相反,事实证明应用签名很容易获取。虽然应用程序需要使用开发者私有密钥进行签名,但这不会损害 Android 上应用程序的安全性,但它显然不能用于验证服务器端的 api 调用。
这会引出更多问题:
- 为什么 Facebook 实施这个系统很容易被攻破?
- 是否有任何其他已知的实现来限制服务器 api 仅访问特定的应用程序? (混淆除外)
【问题讨论】:
-
你到底想保护什么?
-
嗨,nitzan,请查看我更新的问题
-
这不安全,因为我可以修改 facebook 应用程序/api 以将任何内容返回到我想要的服务器。没有人强迫我告诉 facebook 服务器我是假的
-
@WillKru 你是怎么解决这个问题的?我面临着同样的问题/挑战,希望得到一些意见。