【问题标题】:Android Client, Http Server, How do I know client is sending data using my app? authenticationAndroid 客户端,Http 服务器,我如何知道客户端正在使用我的应用程序发送数据?验证
【发布时间】:2011-12-07 05:55:19
【问题描述】:

我有客户端/服务器数据通过所有工作正常。文本、图像等。我的用户在他们的 android 设备上创建博客类型的帖子,然后上传到我的服务器。所有这些都是使用 HTTP 多部分和输入/输出流完成的。我的问题是 - 我怎么知道客户端实际上是我的应用程序而不是某些脚本/其他黑客应用程序?

我想避免滥用情况。

  1. 恶意用户 A 创建了一个 PC 脚本,该脚本将适当的表单数据发送到我的服务器并能够向服务器发送垃圾邮件,从而创建 1000 多个恶意帖子。
  2. 恶意用户 B 创建了一个简单的 Android 应用程序,该应用程序将适当的表单数据发送到我的服务器,并且他能够向服务器发送垃圾邮件。
  3. 恶意用户 C 注册了我的服务,拥有有效的帐户和密码,并使用 PC 脚本或 Android 应用程序向服务器发送垃圾邮件。

我的一个想法是在频繁发帖时强制等待服务器端以防止垃圾邮件..

但除此之外,我如何检查向我的服务器发送数据的人是

  • 一个安卓设备和
  • 正在运行我的应用程序来发送表单数据,而不是另一个。

我想避免 SSL,因为我不想在 Verisign 注册,TRUST 并经历所有这些..

【问题讨论】:

    标签: android security


    【解决方案1】:

    如果只是您的客户端和服务器,您可以(并且应该)使用 SSL 而无需购买任何东西。您控制服务器和客户端,因此每个人都应该只信任一个证书,一个属于另一个证书,并且您不需要为此目的的 CA。

    这是高级方法。创建一个自签名服务器 SSL 证书并部署在您的 Web 服务器上。为此,您可以使用 Android SDK 中包含的 keytool。然后创建一个自签名客户端并将其部署在您的应用程序中作为资源包含在您的应用程序中的自定义密钥库中(keytool 也将生成它)。将服务器配置为要求客户端 SSL 身份验证并仅接受您生成的客户端证书。将客户端配置为使用该客户端证书来标识自己,并且只接受您在服务器上安装的一个服务器端证书。

    一步一步的回答比这里保证的要长得多。我建议分阶段执行此操作,因为网络上有关于如何在服务器端和客户端处理 Android 中的自签名 SSL 证书的资源。我的书中还有一个完整的演练,Application Security for the Android Platform,由 O'Reilly 出版。

    【讨论】:

    • 感谢 jeffsix。昨晚我继续阅读了很多关于自签名证书和密钥的内容。我已经创建了自己的证书、密钥和密钥库。今晚我要将它们集成到我的服务器和应用程序中。
    • 啊,我也买了你的电子书。。谢谢你的帮助!
    • 因为我正准备切换到 SSL。我有一个问题是,要走多远?这是一个 IM 应用程序。那么,我应该继续为每笔交易使用 SSL 吗?还是仅将其用于登录/身份验证可以吗?
    • 现在我很想将它用于与服务器的每笔交易。这样一来,我的用户传递的任何机密消息都会通过网络进行加密。这有什么巨大的缺点吗?处理 SSL 会减慢一切吗?我猜只有一种方法可以找出答案,但这是我倾向于 atm 的地方。
    • 我主张对所有事情都使用 SSL。事情会慢一点,但不会对您描述的使用模型的用户体验产生负面影响。另外,如果您只使用 SSL 进行身份验证,然后转到正常的 HTTP,您将通过(现在未加密的)链接公开会话 cookie/令牌,这可能导致会话劫持。
    【解决方案2】:

    我终于搞定了,服务器和客户端双向 ssl 身份验证。

    我使用此处的说明设置我自己的证书颁发机构 (ca) http://www.garex.net/apache/

    我按照那里的命令生成了我自己的 ca、服务器和客户端文件..

    最大的“GOTCHA”是在“创建客户端证书”部分,garex.net 链接使用 1024 大小的客户端密钥。事实证明,这是抛出异常 java.io.IOException: Wrong version of key store

    为了解决上述异常,我只需要使用 512 个大小的键。这是通过在 openssl genrsa genkey 命令中不包括“1024”参数来完成的。

    最后,我想添加一个链接,指向我最终使用的工具而不是 Portecle。我发现这里的 keytool gui 程序比 portecle 有很大的帮助并且更易于使用 - http://www.lazgosoftware.com/kse/index.html

    这个问题有点让人头疼,所以我会密切关注这个帖子。如果遇到任何障碍,请随时回复。

    【讨论】:

      【解决方案3】:

      您可以使用验证码来解决此问题。

      1. 在提交帖子之前,请向服务器请求验证码。
      2. 服务器将随机验证码图像与唯一密钥相关联,并向应用程序发送验证码和密钥。
      3. 向用户显示验证码图像。
      4. 发送帖子、用户输入的字母和您的 http 请求中的唯一键。
      5. 服务器根据唯一键验证验证码。
      6. 如果验证码验证成功,则添加帖子,否则不添加。

      这应该可以解决所有场景。

      【讨论】:

      • 这是个好建议。我认为它在我的特定应用程序中效果不佳,因为它可能有点不方便。我可以在代码中做些什么,以便服务器知道客户端是我的 android 应用程序吗?
      • 验证码是一种被广泛接受的做法。你真的应该考虑一下。除此之外,我现在想不出别的了。您可以使用共享密钥,但是如果有人知道您的密钥,他们可以轻松地向您的服务器发送垃圾邮件。
      • 嗯。该应用程序是一个聊天应用程序。因此,用户以 2、3 或 4 人为一组进行实时聊天。在其他用例中,他们的聊天是基于论坛消息的,并且讨论是公开的。对于聊天用户案例,我认为验证码可能有点多。但我不太担心黑客会发送垃圾邮件。它更像是留言板风格的讨论用例。比如这个stackoverflow讨论空间..我们这里没有验证码..嗯
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      相关资源
      最近更新 更多