我经常使用验证码来保护表单。到目前为止,我出于显而易见的原因,仅在服务器端检查用户输入的验证码解决方案。
对于所有其他表单字段,我在客户端上进行javascript验证,因为这样更快,更用户友好; (当然我在服务器端进行第二次检查),但对于验证码字段,我只是检查它是否已填写。
我的问题: 使用验证码代码的哈希密钥(例如MD5)进行客户端JavaScript验证是否安全?使用哈希键执行此操作不会向机器人显示验证码本身,并且应该非常安全,对吧?
但也许我对这个想法完全错了...... 感谢您的见解!
答案 0 :(得分:5)
足够安全我会说,但这可能有助于OCR机器人检查他们是否正确无需在服务器上运气并冒失去当前验证码的风险(因为如果提供的答案不正确,服务器会使代码无效并且不会给你第二次机会再次尝试使用相同的验证码。)
假设OCR机器人无法确定验证码的最后一个字母是小写L还是“1”数字?在没有客户端验证的传统验证码中,机器人只是试试运气,如果它猜错了服务器记录故障并重新发送一个完全不同的验证码,那么OCR必须重新开始。
现在想象一下上面的场景,但是通过客户端验证,这里的机器人有一种方法来验证他们是否有正确的答案而不通知服务器,所以在这种情况下,如果机器人不确定,它会尝试所有反对哈希的可能性,只提交正确的答案。基本上,这使机器人能够在不告诉服务器的情况下犯错,而无需重新开始。
最后,我没有准确的数字,但即使每次使用不同的盐,取决于可能的数量(如4个字母数字字符,不区分大小写),可能会强制执行每一种可能性合理的时间,甚至没有进行OCR。为了缓解这个问题,你应该使用散列的多次迭代,这样在计算上很难尝试所有可能的答案。
答案 1 :(得分:1)
听起来很可行,但是你应该考虑使用长而随机的盐来防止基于预先计算的简单攻击。
更正式地说,您必须发送图像,长随机盐和哈希值。然后,在客户端,您将计算与salt连接的输入文本的哈希值,并将结果与哈希值进行比较。
由于长期随机盐,攻击者预先计算的集合必须非常大,以反映所有可能的盐值。
另外,忘记MD5,因为它被认为是不安全的。使用更强大的哈希函数。
另请注意,这只会是增强用户体验(不需要在错误的验证码的情况下发布页面),但绝对不能这样做客户端即可。实际验证必须在服务器上完成。