Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 除了我的Android应用程序,我如何阻止任何人与我的服务器通信_Java_Android_Security_Google App Engine_Rest - Fatal编程技术网

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

Java 除了我的Android应用程序,我如何阻止任何人与我的服务器通信,java,android,security,google-app-engine,rest,Java,Android,Security,Google App Engine,Rest,我在谷歌应用程序引擎上安装了一个rest服务器,我只希望我的应用程序能够调用我的服务器 是否有一个安全选项,我可以打开谷歌应用程序引擎,将促进这一点?如果不是,我能做什么 我知道您可以使用以下命令限制对某些页面的访问,但我不确定它是否可以应用于REST调用 <security-constraint> <web-resource-collection> <url-pattern>/cron/*</url-patter

我在谷歌应用程序引擎上安装了一个rest服务器,我只希望我的应用程序能够调用我的服务器

是否有一个安全选项,我可以打开谷歌应用程序引擎,将促进这一点?如果不是,我能做什么

我知道您可以使用以下命令限制对某些页面的访问,但我不确定它是否可以应用于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>

/克朗/*
管理
选项很少:

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

实现这一点的标准方法是使用SSL和客户端证书。我不确定App Engine是否支持此功能


但是,请务必注意,如果您正在分发APK,那么您不能完全依赖与APK一起分发的任何东西——可能(如果不太可能,取决于您作为目标的知名度)提取欺骗应用程序所需的任何信息。

在openssl中生成私钥/公钥对。应用内分发分发公钥。拥有一个名为appName的自定义http头,并加密appName(一个唯一的常量不可指示的大位数字)并发送它。确保您的代码已模糊,因此没有人能够查看appname。然后,由于您正在加密,即使有人跟踪http调用,appname也将作为加密值可见。在服务器端,使用私钥解密appname。希望这能有所帮助。

(已经有三个答案了,而且都有不同的想法,然后是我自己的想法——我认为这是一个好问题。)

据我所知,(谷歌)推荐/规范的做法是OATH2。谷歌已经认识到OATH2是一个棘手的问题,他们试图简单地解决这个问题的一个办法就是云端点,以及谷歌为Android客户端提供的Play服务。有关说明如下:

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


我不知道(但想知道)如何为非端点应用程序实现同样的功能,所以我想这只是一个部分答案。

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

长话短说,你可以让黑客很难做到这一点。通常,这是通过在应用程序中嵌入密钥、混淆密钥以及混淆获取密钥的代码来实现的。这并不意味着某人找不到钥匙,只是更难


微软的Silverlight DRM是其中一个强大的消费系统,您可能想研究它是如何工作的:

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

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

我建议您在服务器上设置所有未经授权的访问尝试的IP日志,这样,如果有人用无效的访问尝试滥发您的web服务,您就可以创建一个黑名单


最重要的是,你可以通过HTTPS实现这一点。

不幸的是,没有可靠的方法,因为黑客拥有的东西超出了你的控制范围(他们可以分解应用程序并恢复你的算法,然后在其他软件中复制).这是否意味着如果有人监听连接并看到加密值,那么他们就可以用它来假装是我的应用程序,只需向我的服务器发送加密值,我的服务器就会对其解密,它就会工作?这是一个很好的问题。实际上,您可以为特定会话生成AES密钥。现在,使用AES密钥加密您的AppName,并使用公共RSA密钥加密AES密钥,然后发送加密的AES密钥和AppName值。您可以使用nonce来防止重播攻击。由于AES密钥仅对会话有效,并且每次登录都会更改,因此不会有人获得AppName。要防止重播攻击,请使用nonce。参考我的答案。你只需要参考一下就可以了。我的另一个答案可能令人困惑。请参考源代码。它解释了如何使用公钥和AES密钥发送和接收加密。这是小程序代码,但我想告诉您使用的逻辑。类似的方式,您可能必须为您的移动设备。