如何防止任何人与我的服务器通信,除了我的Android应用程序

时间:2013-09-25 13:19:23

标签: java android security google-app-engine rest

我在Google应用引擎上安装了一台休息服务器,我只希望我的应用能够拨打我的服务器。

我是否可以在Google应用引擎上启用安全选项,以便实现这一目标?如果不是我能做什么?

我知道您可以通过以下方式限制对某些页面的访问,但我不确定它是否可以应用于REST调用

<security-constraint>
        <web-resource-collection>
            <url-pattern>/cron/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>admin</role-name>
        </auth-constraint>
</security-constraint>

6 个答案:

答案 0 :(得分:2)

在openssl中生成privatekey / publickey对。在应用程序分发中分发公钥。有一个名为appName的自定义http标头,并加密appname(一个唯一的常量不可预测位大号)并发送它。确保您的代码经过混淆,以便没有人能够查看appname。然后,即使有人跟踪http调用,您也在进行加密,因此appname将显示为加密值。在服务器端使用私钥解密appname。希望这会有所帮助。

答案 1 :(得分:1)

(已经有三个答案,并且在这个问题上都有不同的想法 - 所以我认为这是一个很好的问题。)

据我了解,这样做(针对谷歌)的推荐/规范方式是OATH2。谷歌已经认识到OATH2很棘手,他们尝试简单的就是云端点,以及针对Android客户端的Google Play服务。有关这方面的说明如下:

https://developers.google.com/appengine/docs/java/endpoints/consume_android#Java_Making_authenticated_calls

请注意,虽然文档强调用户身份验证,但它也支持应用程序身份验证。

我不知道(但希望)对于非端点应用程序是如何做同样的事情,所以我想这只是一个部分答案。

答案 2 :(得分:1)

简短的回答是,你不能,至少不是完全安全。

https://security.stackexchange.com/questions/826/how-can-i-securely-authenticate-the-client-application-sending-me-data

很长的答案是,你可以让黑客很难。通常,这通过在应用程序中嵌入密钥,对其进行模糊处理以及对获取密钥的代码进行模糊处理来实现。这并不能让某人找到钥匙,只是更难。

其中一个更强大的消费者系统是微软的Silverlight DRM,你可能想调查它是如何工作的:http://www.iis.net/learn/media/iis-media-services/content-protection-in-silverlight

答案 3 :(得分:1)

您可以使所有REST服务都需要访问密钥&amp;访问时的秘密。然后,应用程序可以将这些存储在配置设置下,并在发送到App Store时保留为空白。

然后,当您下载应用程序时,您可以进入配置设置并插入密钥&amp;您已为REST服务设置的秘密。 (这样可以防止任何人访问服务,因为您手动添加了使用的Key + Secret)

我建议在服务器上设置所有未经授权的访问尝试的IP日志,以便在有人通过无效访问尝试向您的网络服务发送垃圾邮件时创建黑名单。

然后最重要的是,您可以通过HTTPS完成此任务。

答案 4 :(得分:0)

选项很少:

  • 首先你可以通过IP限制。如果您的Android应用每次都获得动态IP,这不是一个好方法。
  • 其次,您可以在服务器和客户端上使用一些只有您知道的算法。服务器可以将数据发送到客户端,客户端运行该算法并修改数据。然后发送回服务器。服务器还运行该算法并检查响应。如果响应等于服务器计算的响应,则服务器知道客户端已获得授权。在这种情况下,每次从服务器发送的初始数据应该是不同的。
  • 第三,您可以使用一些公开的散列函数而不是您自己的算法。这个想法是一样的。服务器使用相同的散列函数,并检查客户端的响应是否与其计算相同。

答案 5 :(得分:0)

执行此操作的规范方法是使用SSL和客户端证书。我不确定App Engine是否支持此功能。

但是,请注意,如果您正在分发您的APK,那么您不能完全依赖与APK一起分发的任何内容 - 这是可能的(如果不太可能,取决于您是多么高调目标)提取欺骗应用程序所需的任何信息。