冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

想必大家最近都被12306坑爹的驗證碼刷屏了,在這緊張的搶票節奏裡,還要忍受驗證碼對智商的考驗,生活也真是不容易。

看到網站上的奇葩驗證碼,網友們紛紛獻計獻策,我個人覺得難度最大的應該是下面這種了:什麼,你一個都不認識?

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

什麼,你一個都不認識?

然而,吐槽歸吐槽,在這小小的驗證碼背後,其實有著許多有趣的故事。屏幕上的方寸之間,其實有著智力上的激烈交鋒。在驗證碼不斷髮展的背後,是一場場來勢洶洶的技術變革。而這場變革,我們每個人都身在其中。

驗證碼的起源

想必很多人都覺得12306的驗證碼“反人類”,但其實,“反人類”的驗證碼最初是用來"反機器"的

1998年,康柏電腦公司(Compaq Computer Corporation)的四位程序員馬克·李李布瑞吉(Mark D. Lillibridge),馬丁·阿巴迪(Martin Abadi),克瑞斯那·巴拉特(Krishna Bharat)和安德雷·布羅德(Andrei Broder)向美國專利局提交了一份專利。

在這份專利裡,他們提出了一種選擇性限制計算機系統訪問的辦法(Method for selectively restricting access to computer systems)。他們提出這個方法的主要目的,是為了防止腳本機器人(bot)自動向他們的搜索引擎提交網址。

在這篇專利裡,他們採用隨機生成含有字符串的圖片這一方法來生成驗證碼,並通過扭曲外觀和添加背景來避免圖片被OCR(光學字符識別)技術破解。流程圖:隨機生成字符庫→選取隨機字符串→隨機改變外觀→添加背景→提交最終效果

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

流程圖:隨機生成字符庫→選取隨機字符串→隨機改變外觀→添加背景→提交最終效果

它就是驗證碼的雛形。

區分人與機器的驗證碼

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

想必大家一定見過類似上面的驗證碼圖案。而熟悉的驗證碼技術背後,隱藏的是這樣一個很深奧的問題:

如何區分真人和機器?——即如何證明坐在電腦前的是一個活人而不是一段程序呢?

在這個問題上,一種解決方案是“圖靈測試”,即“人類向計算機提問”。而驗證碼恰好相反,是“機器提問人類解答”,因而驗證碼也被認為是“反圖靈測試”。

2003年,路易斯·馮·安(Luis von Ahn)等人提出了“全自動區分計算機和人類的公開圖靈測試”,即CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)。

這個短語,正是驗證碼的名字。

而這就引發了一個新的問題:機器人向人類提出的問題,能讓機器人解答嗎?如果機器人能夠識別驗證碼,那不是意味著這個驗證碼不再能夠驗證“人類”和“機器”了?

從這以後,各種各樣的驗證碼和驗證碼破解層出不窮,程序員們的創意和才智在這方寸之間得到了盡情的發揮。而我們,也終於有幸體驗到了買火車票之艱難。

程序員們智力的角逐

早期的驗證碼可能只是一串簡單的ASCII字符,比如黑客們用

|-|3|_|_()

)-(3££0”

代表“HELLO”。這個後來發展成了火星文(leetspeak),o(╯□╰)o。

後來驗證碼變成了圖片顯示字符串或者數字的形式,這也是我們最常見的驗證碼。

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

早期的驗證碼採用扭曲字符和梯度背景,然而好景不長,這樣的驗證碼很快就被破解了:

由於圖片中字符與背景顏色之間差異較大,於是程序員們可以利用算法將圖片中的每一個像素點的值提取出來,然後判斷哪些是背景部分,哪些是字符部分。這樣將字符與背景分離。

接著,將分離出來的字符與“訓練庫”——也就是存有這些字符的資料庫——裡的字符進行最終識別。而且由於英文只有26個字母,而阿拉伯數字只有10個,這樣的驗證碼識別難度也大大降低。

如果一切順利,根據上面的流程計算機能很容易地識別驗證碼,並不需要人。這個驗證碼,也就被破解了。

於是,喜聞樂見的,我們迎來了中文驗證碼,龐大的中文字符庫保證了驗證碼識別的難度(還混用了拼音):

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

而不會中文的歪果仁則開始逆向思考驗證碼識別技術並進行針對性的對抗。他們把各個字母粘連起來,這增加了算法上分隔每一個字符的難度。並且每次採用不同的字體也能增加模式匹配的難度。

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

而到了12306這個程度,考驗的就不單純是圖案識別了,還有某些抽象思維的能力——比如我得知道“紫砂壺”到底是個啥,或者至少知道它長啥樣,我才能選到正確的驗證碼圖案。這,也就是我們俗稱的“智商”……

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

然而,這樣的圖片驗證碼也並不是一勞永逸的,有人展示了用網絡上的識圖算法來機器識別12306圖片驗證碼的一種思路。原理大概是這樣的:首先將驗證碼的圖片分割成一個個單獨的圖片,然後將這些圖片上傳到機器識圖的網站上,網站會返回下面的答案。

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

接著,只需要讓機器識別出驗證碼的“問題”,也就是需要點擊的圖片是什麼“東西”——在這個例子裡是“紫砂壺”——最後讓計算機一一匹配就可以了。

並且他認為12306的這一方法其實並不靠譜,存在三個問題:

  1. 圖片過於複雜、混淆過多、條件太詭異時會擋住大部分正常用戶
  2. 容易被枚舉,題庫太弱,不如字符組合可能性多
  3. 破解門檻不一定高於字符型Captcha

對於這個分析,我舉雙手雙腳贊成。我買不到票不是智商低,而是因為我們屬於被擋住的“大部分正常用戶”,嗯,一定是這樣的。

然後現在, 鐵路總局已經表示,12306網站將調整圖形驗證碼中圖片的清晰度和分辨率,而且可能剔除根據後臺統計出來大家反映最多的和錯誤率較高的圖片驗證碼……

更多奇葩的驗證碼

當然,還有一些更奇葩的驗證碼。這些驗證碼已經變成了一種遊戲,而不是單純的為了區分人類與計算機了:

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

輸入正確的驗證碼就可以將圖片中的碼去掉

我的數學是體育老師教的,你們呢?

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

我的數學是體育老師教的,你們呢?

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

會畫畫,走遍天下都不怕……然而手殘怎麼辦?

面對越來越複雜的驗證碼,算法可能捉襟見肘,然而還有一種萬能的破解方式,那就是:人工識別(Cheap or unwitting human labor)。即將驗證碼分發給分佈式的客戶端,客戶端人肉識別,返回結果。

還有人專門開發了客戶端軟件,讓沒事幹的大學生人肉識別驗證碼賺些小錢。如果在線人數足夠多,任務下達後幾乎都是秒回的,效率也是不錯的。所以,識別好驗證碼也是一項賺錢的技能(大霧)。

驗證碼還能幹啥?

驗證碼也並非都是那麼奇葩,它也可以用來做一些非常有意義的事情。

例如:卡耐基梅隆大學的路易斯·範安等人(對,就是前面提到的造出CAPTCHA這個短語的人啦)設計了一個名叫 reCAPTCHA 的系統,來進行古籍的數字化。

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

reCAPTCHA將 OCR(光學字符識別)軟件無法識別的文字掃描圖傳給世界各大網站,用以替換原來的驗證碼圖片;那些網站的用戶在正確識別出這些文字之後,其答案便會被傳回卡耐基梅隆大學。

reCAPTCHA 在 2009 年被 Google 收購,而Google將這一技術發揚光大,不僅用來識別古籍,還用來識別Google街景的街道地址。所以,有一段時間,你會發現google 的驗證碼變成了某個門牌或者路標:

冷知識:驗證碼的前世今生——你選對12306的驗證碼了麼?

谷歌的驗證碼有時候是街景拍到的門牌號

驗證碼的未來

“反人類”的驗證碼,從始至終對抗的就不是人類,而是有著龐大計算能力卻在模式識別、抽象思維上很弱的計算機。

然而,隨著人工智能技術的進步,計算機在模式識別上也越來越強大,驗證碼也不得不走上越來越“扭曲”、“複雜“、“反人類”的不歸路。驗證碼難度的提升,本質上反應了人工智能技術的進步。

而目前,無論我們多麼吐槽12306的驗證碼,但至少,我們還能夠通過它證明我們是真人,而不是機器。這在某種程度上反應了人類在智能上的優越性,至少現在,我們還是比機器智能優越。(或許有一部分小夥伴沒法證明?)

目前,Google的算法在扭曲文本類驗證碼的識別率已經達到了99%,也就是說,這類驗證碼已經不能作為區分人類和機器的指標了,而總有一天,12306的驗證碼也會被破解,到那時,為了區分機器和人類,程序猿們又該設計出什麼樣的驗證碼呢?

驗證碼的一生,可以說正是人工智能技術不斷進步的一生。而正因為機器越來越聰明,所以人類將不得不面對更多的挑戰。或許有一天,人類的造物終將超越人類自己,人工智能終將超越人類,到那一天,驗證碼或許不復存在了,而人類又該何去何從呢?


分享到:


相關文章: