facebook如何使用密钥哈希validation应用程序的真实性?

在使用Facebook开发Android应用程序时,您需要将应用程序的密钥哈希上传到其网站。 有了这个,他们声称他们能够validation他们的服务器的调用实际上是从您的应用程序。

我已经读过这个问题Facebook如何validation移动应用程序,但它并没有真正提供实际的实现。 我试过查看facebook库的源代码,但无法弄明白。

从Android应用程序发送哪些数据以及可以在服务器中针对此哈希validation的加密? facebook实施的方法是否安全?

如果是,并且它可以在任何服务器中实现,我可以使用它来validation我的服务器我的应用程序没有使用不同的代码重新编译(这往往经常发生:()


我目前正在以这种方式实现这个想法:

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures; for (Signature sig : sigs) { verifyInServer(sig.hashCode()); } 

其中verifyInServer是伪代码,用于针对具有签名存储值的服务器进行的检查。 它现在已经工作了,但我不确定它是否安全,而且我宁愿检查一个密钥哈希(它的公共)而不是这个签名数据(我不确定它是否是私有的,而不是可以欺骗的用户 )。

Solutions Collecting From Web of "facebook如何使用密钥哈希validation应用程序的真实性?"

它是通过SDK调用的原生Facebook应用程序,通过Android操作系统内置的APIvalidation应用程序的签名 – 它检查是否匹配哈希。 当应用程序由私钥签名时,哈希是一种公钥。

可以使用JS SDK登录用户而不是本机应用程序,然后哈希将不会被validation(可以欺骗)。 无论如何,他们认为这是非问题,因为在这种情况下,用户将看到他登录的应用程序并且无论如何都需要允许访问(登录流程通过FB服务器并显示应用程序名称)。 你不能在Facebook cookie中欺骗uid。

一个人也可能会弄乱Facebook natve应用程序让它看到非签名的应用程序,因为其他一些签名的人知道另一个的哈希(但如果可能的话,这将是相当艰巨的任务,需要破解它,改变它和它只适用于已安装修改后的原生FB应用程序的系统)。

@Zbysek的答案可能是正确的,因为Facebook应用程序很可能是实际执行validation的应用程序。 如果没有这个应用程序的源代码,很难确定,但我们可以通过检查Facebook API库项目的源代码来推断一些事情,特别是在AuthorizationClientSession类中编码的登录过程。

  1. 首先,客户端validationFacebook应用程序本身是否正确签名。 这是预料之中的,因为您不希望将您的登录凭据提供给冒充Facebook的虚假应用程序。 这是在NativeProtocol类中完成的(对于不推荐使用的方法,也在Facebook类中完成)。 这是API中唯一提到的签名 ,因此如果有其他validation,它们可以由Facebook应用程序本身完成,也可以在服务器中完成。

  2. Session.open()最终创建一个AuthorizationClient ,它尝试一系列可能的处理程序。 其中一个(第一个使用,如果SessionLoginBehavior允许)是Facebook应用程序本身(例如使用KatanaLoginDialogAuthHandler ,但还有其他)。

  3. 这些AuthHandler对象最终使用tryIntent()来调用startActivityForResult()来调用Facebook应用程序本身。

那么,总结一下,登录过程:

  • validationFacebook应用程序是否合法,
  • 最终在Facebook应用程序内调用一个Activity,
  • 调用它传递FB应用程序ID和其他一些数据,
  • 来自应用内部的活动 ,通过startActivityForResult()

这是一个关键部分,因为从startActivityForResult()开始的活动(但不是startActivity() getCallingActivity() )可以使用getCallingActivity()来了解其调用者的身份(包和类名)。

因此,Facebook应用程序可以轻松地使用此信息查询PackageManager ,获取应用程序的签名,将该数据与应用程序ID一起传递给服务器,并validation它们是否匹配。 由于Facebook应用程序本身已签名,您的应用程序可以信任此结果。

我承认这是所有的猜测,但看起来似乎有道理,鉴于我们所知道的:)

不幸的是,这也意味着这个机制不太可能被复制用于保证真实性。 除非您是Facebook或Google(Google Play服务具有类似的签名validationfunction,例如地图),否则可以确保您的第二个应用程序也可用于每台设备。