验证码的创建是为了避免机器检测到单词。它仅供人类阅读。使其对盲人/聋人更具可读性会增加机器能够再次理解他们的风险,从而使其效果无效。
垃圾邮件发送者确实找到了一种非常有效的方法来破解更流行的验证码。他们只是雇用廉价劳动力来阅读它们,以换取每个工作帐户的几美分。因此,有一个小行业围绕着破解 CAPTCHA 来创建数百万个帐户,然后这些帐户可用于发送更多垃圾邮件。与垃圾邮件发送者获得的金额相比,成本几乎为零。盲人/聋人可以使用类似的解决方案,他们会将 CAPTCHA 图像发送给中国或任何地方的一些廉价劳动力,他们将用正确的单词回复,盲人/聋人将能够继续。不幸的是,盲人只需要几次这项服务,而垃圾邮件发送者需要持续流动,因此这些劳动者更愿意为垃圾邮件发送者工作。(薪水更好。)不过,
ReCAPTCHA 样式还可以读出单词。一个简单的语音识别应用程序可能能够识别所说的任何内容,尽管语音识别仍需要更多优化。不过,您可能希望从这个角度工作,让应用程序改为收听声音字节。
当有可能破解验证码时,他们只会想出更好的类似验证码的方法。OCR 技术仍在改进,因此将做更多工作以使 CAPTCHA 更难。也就是说,直到 OCR 在识别单词方面变得和人眼一样好……
可以创建一个算法,尽管速度很慢。有 26 个小写字母和 26 个大写字母以及 10 个数字,想出一个算法应该不会太难。但是,对于 Serif 和 Sans-serif 字体,组合的数量需要加倍。尽管如此,如果您尝试以与 CAPTCHA 中的字母类似的方式弯曲所有字母,您应该能够检测到被 CAPTCHA 字母覆盖最多的字母。那将是最有可能的候选人。仍然需要您从图像中清除线条、污垢和其他伪影,人眼识别起来比计算机更容易。您需要以下步骤:
- 清理图像。
- 检测字母的位置。
- 对于每个字母 3a。通过检查左侧确定字母的曲线。3b。对每个可能的字母/数字进行叠加,以找到最能覆盖它的字母/数字。(这是最有可能的字母。)
- 找到单词后,请检查字典以确保它是真实单词。(除非验证码不使用真实的单词。)
即使他们可以扭曲验证码中的字母,也应该可以通过查看每个字母的左侧然后尝试对每个字母应用相同的曲线来检测他们使用的扭曲旋转。(52 个组合,加上 10 个数字,如果还使用数字。)基本上,您会尝试在每个字母周围放置一个框,然后检查哪个字母包含最少的空白。这是最有可能的信。
这不经常用于 OCR 的主要原因基本上是对速度的需要。步骤 3a/b 往往很慢,尤其是在您必须考虑字体样式的情况下。
使这个答案更大,但回复其中一个评论:
有几种方法可以清理图像。您需要一些颜色过滤、降噪和能够通过图像识别嘈杂线条的算法。DEFCON _您指出的幻灯片显示了一些简单的技术来过滤掉一些噪音。它表明,基本的图像处理工具已经可以使图像更清晰,便于机器阅读。简单的模糊会清除随机点和细线,而滤色器会过滤掉嘈杂的颜色。下一步是尝试在 CAPTCHA 中的每个字母周围放置一个框,希望系统能够识别它们的位置。我不知道任何实用的算法,但应该有办法识别它们。有可以从位图创建矢量图像的软件,因此应该有能够计算字母周围的框的软件。这个盒子很可能没有矩形角,因此您必须扭曲所有 52 个字母以匹配同一个盒子。斜体或粗体应该' 不会有太大的不同,因为这些风格只是额外的扭曲。不过,Serif 或 Sans-serif 确实有所不同。衬线字体往往有更多的尖峰和装饰。幸运的是,有一些算法可以将一个盒子转换为任何其他具有四个角的图形。
常规的 OCR 应用程序会假设字母大多是直的,并且只会检查一些热点以找到匹配项。因此,他们有时会因为噪音而弄错。要破解 CAPTCHA,您需要更敏感的匹配,最好将 CAPTCHA 字母图像与 52 个字母之一的图像“异或”,然后计算黑白点的数量以计算比率。假设白色=1 和黑色=0,XOR 的结果应该是几乎黑色的最佳匹配。
我认为一些垃圾邮件发送者已经找到了一些有用的算法来破解 CAPTCHA,但对他们来说,将这些算法保密只会让他们继续做生意。
另一条评论,更多文字。:-)
分割会是一个问题,但也不是不可能解决的。它只是极其复杂。但是当你清理了图像时,应该可以计算出两条线。一行触及每个字母的底部,另一行触及顶部。但是,好的 CAPTCHA 不会再将字母放在同一行上,但那些不太好的 CAPTCHA 可以通过遵循这些行来破解。(猜猜?ReCAPTCHA 将字母放在两行之间!)在两行中,您知道第一个字母将从左侧开始,因此您可以尝试在那里叠加所有 52 种可能性,直到找到匹配项。找到一个后,向右移动第二个。直到你读完所有的信。有两条线引导您,您不需要一个完整的盒子。
字母倾向于使用宽度和高度之间的恒定比率。使用两行,您可以计算整个字母的高度,从而很好地估计匹配的宽度。
尽管如此,对于我糟糕的数学技能来说,制定正确的算法来计算这一切还是有点过分了。你需要一位专业的数学家来破解这个算法。