使用Android安全地将数据提交到远程服务器

时间:2011-05-05 23:54:20

标签: android

真的有点小众问题。当我说“安全”时,我不是指SSL。

基本上我一直在努力将C2DM推送消息添加到我的应用程序,在我的测试床上,这一切都正常,并且收到通知。我按照这个指南: http://blog.mediarain.com/2011/03/simple-google-android-c2dm-tutorial-push-notifications-for-android/

现在我对此一切都很好并且我完全理解它,我的问题是将设备的唯一ID传递给我的Web服务器,该服务器正在转发消息。比如说,为了将设备ID添加到我的ID数据库中,它会进行如下调用: http://www.example.com/add_id?id=unique_id_here

将ID插入我的数据库,将其添加到我可用于推送消息的设备列表中,阻止某人访问该URL以及通过提交伪造ID来填充我的数据库?有什么方法可以验证我在那里收到的数据,或者验证连接是否来自我的应用程序?

3 个答案:

答案 0 :(得分:1)

注意 现在编辑它以获得更明显的答案;我最初的答案是在最后,以防任何人发现这些想法有用

这实际上非常简单。将消息作为POST发送,并提供某种形式的数字签名。这可以像(消息+秘密)的MD5哈希一样简单。当您收到POST时,执行相同的哈希,如果哈希匹配:

  • 它来自您的应用
  • 来自某人对您的应用进行逆向工程

可悲的是,#2是不可能完全排除的,所有你能做的就是用来提高标准的obfusticate代码,并监视服务器是否有可疑活动。


旧答案

原则上没有;网络和由于隐私问题和法律规定,手机制造商通常会确保特定设备不会发送识别标头。即使这些存在,也可能是伪造的。

您需要以某种方式验证客户端。这可以通过以下几种方式之一完成:

  • 每个设备唯一的用户名/密码,作为用户的一次性配置。
  • 通过短信分发的每设备唯一ID(需要设备电话号码和应用程​​序的短信权限)
  • 来自License Manager APIs的每设备唯一ID(未经调查,但几乎肯定存在,因为每个客户都是单独许可的)

我假设伪数据只是一个问题,如果它与错误的设备相关联,并且有人破坏他们自己的数据是奇怪的,但没有问题。

答案 1 :(得分:0)

您始终可以根据请求传递一些HTTP标头。 Bathic Auth或仅为您所知的字符串

答案 2 :(得分:0)

@peter对于#2条件,我认为您可以使用JNI(java本机接口)+ javah编译.so库,您可以调用它来获取设备ID和使用特定方法加密的令牌,并验证您的Web服务器上的两个。

我认为.so本机共享库更难以反编译以获得加密方法。