android - 算法:停止无效条目进入 python 脚本中的竞赛

标签 android python algorithm computer-science

我有一个 Android 移动应用程序,它实际上只是一个日历,您可以单击某个日期,然后会弹出一个密码。用户使用该代码参加比赛——他们点击比赛 HTML 页面的链接(实际上是 python 脚本)并输入他们的详细信息以参加比赛。有100个小奖和3个大奖。代码可以是非中奖代码,也可以为用户赢得奖品(小奖或大奖)。

因此他们将被重定向到:http://mycompetition.com/comp.py?code=ABCDEF

然后他们输入他们的年龄、代码和图像验证码(避免垃圾邮件发送者)并点击参加比赛。

我的问题:我很难想出一个算法来确保人们不会在上面的 URL 中键入并意外地为 CGI“代码”值放置一个随机代码值如果他们猜对了代码(或者他们使用机器人继续尝试),就可以赢得奖品。

你能想出什么办法来避免没有购买应用程序的人只是访问上面的 url 并输入随机代码并意外中奖吗?

我的算法/想法:
- 代码长度为 12 个字符,这使得猜测代码的可能性非常小,但仍有可能。我的数学和概率很糟糕,所以如果我在代码中使用 26 个字符和 10 个数字作为潜在字符,这是否意味着从(36 个字符 * 12 个传递长度 * 103 个奖品)中猜测正确 1 个的概率?这种概率是否只剩下 super 计算机(不是我相信任何人会把 super 计算机用于我的 comp :P)能够猜出代码?
- 不要将奖品与代码联系起来。相反,只是让 android 应用程序随机生成一些毫无意义的代码,当他们参加比赛时,我只是给他们一个随机的 1/10000(我不希望有接近 10000 个参赛作品)赢得奖品。要参加比赛,您必须输入您的年龄和代码,然后输入验证码以避免垃圾邮件发送者。
- 是否有任何您知道的更简单的算法可以避免未购买该应用的用户获得奖品?

编辑: - 每当下载应用程序时,我会查看他们的手机(无线部分)MAC 地址。在第一次运行该应用程序时,我将该 MAC 地址上传到我的服务器,其中包含我的应用程序用户的 MAC 地址列表。当/如果他们发现密码,他们会点击参加比赛并被重定向到 http://mycompetition.com/comp.py?code=RANDOMMEANINGLESSGENERATEDCODE&uniqueID=USERSMACADDRESS .在我的脚本中,我检查 uniqueID 是否在下载我的应用程序的用户列表中,如果不是,我不会继续,如果是,他们有 1/10000 的机会赢得奖品。你能看出这个算法有什么缺陷吗?

最佳答案

使用 HMAC根据您在 Android 应用程序和网站之间共享的 secret 生成代码。作为 HMAC 的文本,您可以使用一个随机值,您将其包含在结果代码中,或者使用用户独有的值,例如他们的电子邮件地址(这意味着每个用户只能有一个有效代码)。如果代码的长度很重要,您可以截断 HMAC 生成的散列,但请记住,截断的越短,暴力攻击就越实用。

只要您的用户无法发现共享 secret ,只要攻击者不得不随机猜测或尝试通过蛮力来确定 secret ,这就是安全的。但是,由于代码在用户拥有的设备上运行,因此无法阻止他们从您的应用程序中提取代码。拥有 root 手机和反汇编程序的用户可以相对轻松地完成此操作。为了解决这个问题,您可以混淆代码,并发布新版本的应用程序,在您怀疑它遭到破坏时在现场和网站上更新 key 。

最终,因为设备在用户的控制之下,所以没有办法完全阻止用户生成他们自己的代码,但是使用上面的方法,你可以让他们更难,更容易你从中恢复过来。

关于android - 算法:停止无效条目进入 python 脚本中的竞赛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7034870/

相关文章:

python - 将非整数成员值添加到 Python3 中的 IntEnum

php - 如何从 python 调用服务器中的 php 脚本

python - 如何使用 APIView 设置每个处理函数的权限?

algorithm - 从几个集合中的每一个中找到包含至少一个元素的最小集合的算法是什么

java - 带有文本叠加的Android ImageView缩放

Android:按钮双重提交

java - 模拟嵌套循环

c++ - 二进制搜索树键/值对 - 我知道值但不知道键 C++

android - Xamarin OpenCV ICvCameraViewListener

android - 让 Android Traceview 工作