移动设备上的验证码替换
Captcha substitution on mobile devices
我们有一项用户可以注册的服务。此过程受 reCAPTCHA 保护,以防止自动注册。问题是在移动设备上 reCAPTCHA 并不方便。因此我们决定注册 API 也将接受一些特殊的 令牌 而不是 reCAPTCHA 响应。
现在的问题是如何实现这个token。我们的第一种方法是为移动应用程序配备一些恒定的秘密,这些秘密将作为 token 发送到服务器。但是如果黑客将请求重定向到他的服务器(通过更新 API 域的 DNS 记录并将他的证书安装为受信任的移动设备),这个秘密就会被泄露。
现在我们的最终方法是在用户名+密码上将令牌计算为 HMAC-SHA1(我们是否需要此处密码 - 也许只是为了使输入足够长?)。用户名将从注册输入中获取。然后服务器将通过验证哈希来授权它。在他的情况下,可以进行重放攻击,但没关系,因为重复的用户名将被拒绝。
这种做法正确吗?也许在移动设备上还有其他替代验证码的方法?
考虑到应用程序将托管在 Appstore 中并提取密钥(和秘密),是否可以从 iOS(ipa 文件)获取应用程序并对其进行反向工程?
在 android 的情况下,这是可能的 - 有没有办法阻止它?
您发现了缺点:您仍然拥有一个不会因同一用户而改变的令牌。在您的用例(注册)中没问题,但可能还有其他用例没有用(例如密码恢复功能)。在这种情况下,可能的黑客可能会为任何用户生成有效令牌,因为您正在询问用户名).
我的解决方案是:
- 创建一个算法(在移动应用程序和您的后端上)采用 "public token" 并创建 "secret token",从而解决验证码问题。它可能是一个简单的 SHA1 哈希(我不推荐)、public 令牌和盐、用户 ID 和 public 令牌等之间的组合...
- 在您的 API 上创建一个生成 public 和秘密令牌的端点。将秘密令牌存储在您的后端,并将 return public 令牌存储到客户端(移动应用程序)。
- 然后您的应用程序应该请求 public 令牌,生成秘密令牌并将其发送到 API。 API 验证秘密令牌已存储在您的数据库中,如果是这样,则验证码已解决。
一项改进是使存储的秘密令牌在 X 秒后过期。
希望对您有所帮助!
我们决定 Hawk 不通过网络发送凭据。它将用于 iOS 应该不可能对应用程序进行反向工程并获取密钥的地方。对于 Android,我们将为 Android 使用一些 reCAPTCHA 库。
我们有一项用户可以注册的服务。此过程受 reCAPTCHA 保护,以防止自动注册。问题是在移动设备上 reCAPTCHA 并不方便。因此我们决定注册 API 也将接受一些特殊的 令牌 而不是 reCAPTCHA 响应。
现在的问题是如何实现这个token。我们的第一种方法是为移动应用程序配备一些恒定的秘密,这些秘密将作为 token 发送到服务器。但是如果黑客将请求重定向到他的服务器(通过更新 API 域的 DNS 记录并将他的证书安装为受信任的移动设备),这个秘密就会被泄露。
现在我们的最终方法是在用户名+密码上将令牌计算为 HMAC-SHA1(我们是否需要此处密码 - 也许只是为了使输入足够长?)。用户名将从注册输入中获取。然后服务器将通过验证哈希来授权它。在他的情况下,可以进行重放攻击,但没关系,因为重复的用户名将被拒绝。
这种做法正确吗?也许在移动设备上还有其他替代验证码的方法?
考虑到应用程序将托管在 Appstore 中并提取密钥(和秘密),是否可以从 iOS(ipa 文件)获取应用程序并对其进行反向工程?
在 android 的情况下,这是可能的 - 有没有办法阻止它?
您发现了缺点:您仍然拥有一个不会因同一用户而改变的令牌。在您的用例(注册)中没问题,但可能还有其他用例没有用(例如密码恢复功能)。在这种情况下,可能的黑客可能会为任何用户生成有效令牌,因为您正在询问用户名).
我的解决方案是:
- 创建一个算法(在移动应用程序和您的后端上)采用 "public token" 并创建 "secret token",从而解决验证码问题。它可能是一个简单的 SHA1 哈希(我不推荐)、public 令牌和盐、用户 ID 和 public 令牌等之间的组合...
- 在您的 API 上创建一个生成 public 和秘密令牌的端点。将秘密令牌存储在您的后端,并将 return public 令牌存储到客户端(移动应用程序)。
- 然后您的应用程序应该请求 public 令牌,生成秘密令牌并将其发送到 API。 API 验证秘密令牌已存储在您的数据库中,如果是这样,则验证码已解决。
一项改进是使存储的秘密令牌在 X 秒后过期。
希望对您有所帮助!
我们决定 Hawk 不通过网络发送凭据。它将用于 iOS 应该不可能对应用程序进行反向工程并获取密钥的地方。对于 Android,我们将为 Android 使用一些 reCAPTCHA 库。