2016-07-05 118 views
1

我们有一项服务,用户可以注册。此流程受reCAPTCHA保护,以防止自动注册。问题是,在移动设备上,reCAPTCHA并不方便。因此我们决定注册API也会接受一些特殊的令牌而不是reCAPTCHA响应。移动设备上的验证码替换

现在的问题是如何实现这个令牌。我们的第一种方法是为移动应用程序提供一些不变的秘密,这些秘密将作为令牌发送到服务器。但是,如果黑客将请求重定向到他的服务器(通过更新API域的DNS记录并将他的证书安装为受信任的移动设备),则可以揭示此秘密。

现在我们最后的方法是在用户名+密码上计算令牌为HMAC-SHA1(我们是否需要在这里分割 - 也许只是为了使输入足够长?)。用户名将从注册输入中获取。然后服务器将通过验证散列来授权它。在他的情况下,可能会进行重播攻击,但这是可以的,因为重复的用户名将被拒绝。

这种方法是否正确?也许在移动设备上还有其他替代方案可用于验证码?

也可以从iOS(ipa文件)中获取和逆向工程应用程序,因为它将托管在Appstore中并提取密钥(和秘密)?

在android的情况下,这是可能的 - 有没有办法来防止它?

回答

0

我们决定与Hawk一起去不通过电线发送凭据。它将用于iOS,因为它不应该对应用程序进行逆向工程并获得密钥。对于Android,我们将使用Android的一些reCAPTCHA库。

0

您发现了缺点:您仍然使用不会为同一用户更改的令牌。在你的用例(注册)中没问题,但是可能会有另一个用例不起作用(例如密码恢复功能)。在这种情况下,可能的黑客可能会为任何用户生成有效令牌,这是您要求的用户名)。

我的解决办法是:

  • 创建的算法(在两个移动应用程序和后端),其采用了“公共标志”,并创建了一个“秘密令牌”,解决了验证码。它可能是一个简单的SHA1哈希(我不推荐),公共令牌和盐之间的组合,用户ID和公共令牌等等。
  • 在您的API上创建一个端点,生成公共和秘密令牌。将秘密令牌存储在您的后端并将公共令牌返回给客户端(移动应用程序)。
  • 然后,您的应用程序应该询问公共令牌,生成秘密令牌并将其发送到API。该API验证秘密令牌已经存储在您的数据库中,如果是这种情况,那么captcha就解决了。

一个改进将使存储的秘密标记在X秒后过期。

希望它有帮助!