Jav*_*ier 21 security hash android facebook facebook-graph-api
在使用Facebook开发Android应用程序时,您需要将应用程序的密钥哈希上传到他们的站点.有了这个,他们声称他们能够验证他们的服务器的调用实际上是从您的应用程序.
我已经读过这个问题Facebook如何验证移动应用程序,但它并没有真正提供实际的实现.我试过查看facebook库的源代码,但无法弄明白.
从Android应用程序发送哪些数据,以及可以在服务器中针对此哈希验证的加密?facebook实施的方法是否安全?
如果是,并且它可以在任何服务器中实现,我可以使用它来验证我的服务器我的应用程序没有使用不同的代码重新编译(这往往经常发生:()
我目前正在以这种方式实现这个想法:
Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
for (Signature sig : sigs) {
verifyInServer(sig.hashCode());
}
Run Code Online (Sandbox Code Playgroud)
其中verifyInServer是伪代码,用于针对具有签名存储值的服务器进行的检查.它现在已经工作但我不确定它是否安全,而且我宁愿检查一个密钥哈希(它的公开)而不是这个签名数据(我不确定它是否是私有的,而不是由于它的欺骗用户).
@ Zbysek的答案可能是正确的,因为Facebook应用程序很可能是实际执行验证的应用程序.如果没有这个应用程序的源代码,很难确定,但我们可以通过检查Facebook API库项目的源代码来推断一些事情,特别是在AuthorizationClient和Session类中编码的登录过程.
首先,客户端验证Facebook应用程序本身是否已正确签名.这是预料之中的,因为您不希望将您的登录凭据提供给冒充Facebook 的虚假应用程序.这是在NativeProtocol类中完成的(Facebook对于不推荐使用的方法,也在类中完成).这是API中唯一提到的签名,因此如果有其他验证,它们可以由Facebook应用程序本身完成,也可以在服务器中完成.
Session.open()最终创建一个AuthorizationClient尝试一系列可能的处理程序.其中一个(第一个使用,如果SessionLoginBehavior允许)是Facebook应用程序本身(例如,有KatanaLoginDialogAuthHandler,但还有其他).
这些AuthHandler对象最终用于tryIntent()调用startActivityForResult()以调用Facebook应用程序本身.
那么,总结一下,登录过程:
startActivityForResult().这是一个关键部分,因为以startActivityForResult()(但不是以那些开头的startActivity())开始的活动可以getCallingActivity()用来知道其调用者的身份(包和类名).
因此,Facebook应用程序可以轻松地使用此信息查询PackageManager,获取您的应用程序的签名,将该数据与应用程序ID一起传递给服务器,并验证它们是否匹配.由于Facebook应用程序本身已签名,您的应用程序可以信任此结果.
我承认这是所有的猜测,但看起来似乎有道理,鉴于我们所知道的:)
不幸的是,这也意味着这种机制不太可能被复制用于保证真实性.除非你是Facebook或谷歌(谷歌播放服务有类似的签名验证功能,例如地图),或者可以某种方式确保你的第二个应用程序也可用于每个设备.
它是通过SDK调用的原生Facebook应用程序,通过Android操作系统内置的API验证应用程序的签名- 它检查是否匹配哈希.当应用程序由私钥签名时,哈希是一种公钥.
可以使用JS SDK登录用户而不是本机应用程序,然后哈希将不会被验证(可以欺骗).无论如何,他们认为这是非问题,因为在这种情况下,用户将看到他登录的应用程序并且无论如何都需要允许访问(登录流程通过FB服务器并显示应用程序名称).你不能在Facebook cookie中欺骗uid.
一个人也可能会弄乱Facebook natve应用程序,让它看到非签名的应用程序,因为其他一些签名的人知道另一个的哈希(但如果可能,这将是相当艰巨的任务,一个人需要破解它,改变它和它只适用于已安装修改后的原生FB应用程序的系统).
| 归档时间: |
|
| 查看次数: |
1714 次 |
| 最近记录: |