【问题标题】:Verify Android user is human (without a CAPTCHA)验证 Android 用户是人类(没有验证码)
【发布时间】:2012-10-08 22:30:54
【问题描述】:

我有一个应用程序,用户可以在其中添加评分,我不希望他们必须注册才能做到这一点,但我也不希望机器人很容易玩弄评分。

有没有一种方法可以让我合理地(不一定是 100%,但我不想使用反应式启发式方法)确保我的用户是人类? 不需要任何类型的验证码/登录/其他操作。通常我会说这是不可能的,但由于我的应用程序在 Android 上运行,我认为我们可以做得比没有好。

Gmail 地址。

我的第一个想法是从AccountManager 获取他们的 gmail 地址,但我看不到验证他们是否拥有该电子邮件地址的方法 - 即机器人只能将虚构的电子邮件发送到我的服务器,所以我不认为这行得通(而且我不想让他们使用他们的谷歌帐户验证我的应用程序;他们不太可能这样做)。

GCM

我的下一个想法是使用 Google 的 Cloud Messaging。我可以从设备获取云消息 ID,将其发送到我的服务器,将随机云消息从服务器发送回设备,然后将该消息发送回服务器。我认为这至少验证了他们确实拥有带有 gmail 帐户的 Android 设备,这已经足够了。

短信

当然,我可以给他们发短信,但这需要花钱,而且要保持无缝意味着我需要获得阅读他们消息的权限,而我真的很想避免这种情况(尤其是评级是一项可选功能) .

Android 许可服务器

也许可以使用Licensing Verification Library 获得 Google 的签名保证,即用户从市场上下载了它,但由于我的应用程序的性质,我无法将其投放市场。

设备ID、EMEI、电话号码等

我当然不能使用这些。机器人可以编造它们!

所以 GCM 看起来是最好的(也是唯一的)选择。谁能想到别的?

【问题讨论】:

  • 在你的apk中放一个私钥,从你的服务器下载一个随机文本,加密后发回,你就会知道它来自你的apk。你的 GCM 虽然可能也可以工作
  • 如果机器人可以从反编译的 APK 中获取私钥,也是一样的。
  • 啊,我喜欢私钥的想法。显然,只要付出足够的努力就可以破解它,但我可以让它变得困难。
  • 我想这可能是答案!不过它才刚刚发布:android-developers.blogspot.co.uk/2013/01/…

标签: android captcha bots spam google-cloud-messaging


【解决方案1】:

当您控制通信的双方时,您可以执行以下操作:

流程

  1. 应用程序:从服务器请求一次性秘密令牌。
  2. 服务器:创建一次性秘密令牌和跟踪 ID,并将两者发送到应用程序,同时使用跟踪 ID 跟踪秘密令牌。
  3. 应用程序:使用一次性秘密令牌对投票进行加密(有关加密,请参见下文)
  4. 应用程序:向服务器发送加密消息和跟踪 ID。
  5. 服务器:使用 tracking-id 查找秘密令牌,确保它尚未被使用并使用秘密令牌解密投票。

加密

您可以使用任何对称加密技术。一个非常简单的例子是在应用端使用秘密令牌对您的消息(即投票)进行异或运算。在服务器端 XOR-ing 再次使用相同的秘密令牌再次给出明文消息。

只要攻击者不知道您的加密方法,此方法就是安全的。如果知道他当然可以模拟应用程序所做的请求,但它适用于每种方法,所以你可能应该使用比简单 XOR-ing 更好的东西。

【讨论】:

  • 其实它不需要人,但它确实需要你的应用程序。如前所述,它不能被 Bot/Script 直接向您的服务器发送请求来伪造。
  • 啊,和njzk2的建议一样。几乎只是“使用应用程序中包含的密钥签署请求。”。我认为其他任何东西都不会增加任何安全性。
  • 它增加了安全性,因为密钥不包含在应用程序中,因此对 APK 的反编译不会泄露它。通过使用一次性代币,您可以避免同一个人进行多次投票——如果这是一个问题的话。
  • 不,基本上你的方案是“应用程序包含一个秘密”。您的秘密是算法,njzk2 是密钥,但从安全角度来看,它们之间基本上没有区别。
【解决方案2】:

随机显示一些弹出窗口并将其关闭按钮放置在不同的位置,因此用户必须关闭它们。

使用拖放 API 要求用户将按钮拖放到屏幕上的某个区域,然后提交评分。您可以随机放置按钮。

您可以在多个地方拖动按钮,但您可以指示用户放入正确的按钮。

【讨论】:

  • 听起来像是传统验证码的蹩脚版本。我试图避免用户输入。
  • 我认为 OP 并不担心机器人会自动发送他的 Android 应用程序以发送虚假评论。我认为他担心 PC 上运行的机器人会通过 HTTP 将评论发布到他的服务器,假装评论是从他的应用程序发送的。
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多