4

我在 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>
4

6 回答 6

2

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

于 2013-09-25T15:05:01.480 回答
1

(Three answers already, and all with different ideas then my own on this matter - so a good question I think.)

It was my understanding that the recommended/canonical way of doing this (for google) is OATH2. Google has recognized that OATH2 is tricky, and one of their attempts to simply it is cloud endpoints, along with Google Play Services for Android clients. The instructions for this are here:

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

Note that while the docs emphasize User authentication, it also supports app authentication.

What I don't know (but would like to) is how to the same thing for a non-endpoints app, so I guess this is just a partial answer.

于 2013-09-25T16:23:36.573 回答
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

于 2013-09-25T21:05:57.040 回答
1

您可以使所有 REST 服务在访问时都需要访问密钥和秘密。然后,应用程序可以将这些存储在配置设置下,并在运送到应用程序商店时留空。

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

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

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

于 2013-09-26T22:41:36.263 回答
0

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

但是请注意,如果您正在分发 APK,那么您不能仅仅依赖随 APK 分发的任何内容——这是可能的(如果不太可能,取决于您作为目标的知名度)提取欺骗应用程序所需的任何信息。

于 2013-09-25T14:11:28.723 回答
0

有几个选项:

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