【问题标题】:How to secure webservice so that only my android app can use my webservice如何保护网络服务,以便只有我的 android 应用程序可以使用我的网络服务
【发布时间】:2013-05-15 02:04:36
【问题描述】:

我们已经构建了一个 Android 应用程序,它从 Android 向我的 PHP 服务器发送 HTTP 请求。作为响应,Web 服务将 JSON 对象发送到 android 应用程序以显示结果。

喜欢其中一项服务就像

http://mydomain.com/test/weather.php?lat=13.4332&long=80.454

由于我不是 android 专家,所以想从 PHP 端处理 web 服务的安全性。

如何保护我的网络服务调用,以便只有我的应用可以使用我的网络服务。我不希望有人解密 apk 并获取 web 服务 URL 并在自定义输出数据后使用它。

我怎样才能做到这一点?请给我任何好的例子。

【问题讨论】:

标签: php android web-services


【解决方案1】:

如果可以的话,您应该在您的应用程序中使用 HTTPS,这可以解决许多安全问题。 为此,创建一个自签名服务器 SSL 证书并使用 Android SDK 中的 keytool 部署在您的 Web 服务器上。然后创建一个自签名客户端并将其部署在您的应用程序中作为资源包含在您的应用程序中的自定义密钥库中(keytool 也将生成它)。将服务器配置为要求客户端 SSL 身份验证并仅接受您生成的客户端证书。 oReilly : Application Security for the Android Platform 或者 如果它只是您的客户端和服务器,您可以(并且应该)使用 SSL 而无需购买任何东西。您控制服务器和客户端,因此每个人都应该只信任一个证书,一个属于另一个证书,并且您不需要为此目的的 CA。PHP 可以通过 POST 或 GET 从您的站点甚至 Internet 浏览器接收数据.用于执行此操作的方法之一是 curl。 你必须在你的 PHP 中验证通过 POST 或 GET 接收到的信息,这种语言有很大的能力解决这些“问题”;看看PHP官方文档的这一部分。

假设您正在构建一个登录系统:您还可以在登录页面中添加一个隐藏元素,其中包含只能发生一次的唯一密码,将此密码保存在会话中,因此,登录脚本在会话中查找这段代码,与发布到脚本的内容相比,应该相同。

而且,如果您想获取访问者的 IP 地址:

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

你想看这里:Encrypt data within mobile app and send to web serviceWeb services: how prevent illegal accesses

【讨论】:

【解决方案2】:

确保您在 POST 请求中请求一个额外的字段来检查发件人的 ID。在此字段中,您可以使用哈希序列,例如由 md5 算法生成的序列。

因此,在您的 Android 应用程序中,您将使用标识符和通用字符串生成哈希字符串,如下所示:

$identifier='Here comes an understandable unique Id for your App user';
$common_sequence='Here comes random sequence, the same to be used server-side';

$hash_sequence=crypt($identifier . $common_sequence);

在您的 POST 中,您有 2 个字段:

  • 哈希序列
  • 用户ID

在您的服务器中,您可以重新生成 hash_sequence,因为您已经拥有 common_sequence 以及 userId。检查它们是否匹配。

然而,这个解决方案有一些弱点,特别是可以多次使用 hash_sequence 的事实。您可以考虑在生成序列中插入一个时间因子,例如 yyyymmddHHmm,这样序列每分钟都会改变。

Crypt() 是一个在 PHP 中生成 hash_sequence 的函数。但是,您需要一种在您的应用程序中生成类似序列的方法。在这种情况下,一个简单的 MD5 哈希可能就足够了,而且必须有一个 Android Dev 语言原生的 MD5 生成器。

祝你好运,

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2023-03-25
相关资源
最近更新 更多