验证码真的能防止盗号吗?

验证码的意义是增加不知道你的密码的人用计算机暴力破解你的密码的难度,它的确防不住你题目说明中提及的第二种情况,也就是盗号者已经知道了你的密码。

所谓暴力破解,就是在只知道你的用户名的前提下,一个一个去试可能的密码。因为这一过程非常机械,所以一般人都会选择写一个程序来做,虽然缓慢的网速或网站会拖慢它的速度,但哪怕它只能每秒试一次,每天也能试上八万多次,那些用生日当密码的人撑不过两个礼拜。如果有选择性地生成这些可能的密码(比如只选择能拼成单词或汉语拼音的字母组合),能攻击的人群就更广了。

而验证码就是针对这一攻击方法里面「写一个程序」这一环节来对抗它的。验证码的学名叫做「全自动区分计算机和人类的公开图灵测试」,Completely Automated Public Turing test to tell Computers and Humans Apart,简称 CAPTCHA(原创研究:这个罗嗦的名字大概只是为了凑出 CAPTCHA — capture you 这个谐音而硬凑出来的,因为「图灵测试」的意图本来就是「区分计算机和人类」)。它的作用就是验证输入密码的人其实是个能从那张图里面读出数字的人,而不是一个无法理解图像的脚本程序。验证码通常以扭曲的文字方式出现,是因为让计算机去识别这些文字非常困难。

不过鉴于目前的图像识别技术已经足以匹敌绝大多数扭曲字符的验证码,所以其他形式的 CAPTCHA 也陆续出现,比如问用户一个常识性的问题,要用户把几张颠倒的图片全都调正,或者从一些猫的图片里找出哪一张是狗——总之是一些计算机很难做到的事情。这样一来暴力破解的方法基本上就废了,除非去找血汗工厂人肉破解 CAPTCHA(Google「captcha job」可以看到这样的网站)。

除了 CAPTCHA 之外,网站还可以利用其他方式来增加暴力破解的难度,比如输入错误的密码需要多等几秒钟,或短时间内连续输入若干次错误的密码就会导致帐号被锁等等。

而如果要防范你题目说明中的第二种情况,普遍的方法是「两步认证」,也就是除了密码之外,你还需要另外别的什么来证明你是输入密码的人。常见的方法包括:给你在网站上注册的手机发一个随机数,让你输入此数字;让你输入某个随身设备按照只有它和你欲登录的网站才知道的特定规则在某个特定时间生成出来的数字(如 Battle.net authenticator);或在你使用的电脑上插入一个特定的硬件设备(如 YubiKey)。
原发布于 https://www.zhihu.com/question/30663953/answer/49209055