我們在使用網際網路的過程中,可以看到網站往往會通過驗證碼來辨別用戶是否是機器人,驗證碼實際上就是人類和計算機的一場戰爭。但有時候你會發現,驗證碼也是讓人感到十分無奈。驗證碼嚴重扭曲到不能通過人眼來識別,有的太過於花樣,驗證碼隱藏太深,看起來卻十分的吃力。
隨著電腦信息技術的飛速發展,有效圖像識別技術已經被開發出來,但目前大部分網站使用的文本驗證碼還是有用的。尖端的圖像識別技術需要花費大量時間金錢成本,黑客們是不會用它們來破解你的博客、窺探你中午打算吃什麼的。只有那些涉及機密、金錢利益的網站,比如網上銀行、購物網站等受到了較大的威脅。為了防止財產損失,這些網站紛紛推出了各種進化版的驗證碼。主流的驗證碼都是靜態圖片,有些網站推出了動態的驗證碼,令機器人很難捕捉,同時動畫效果能夠增加網頁的美觀程度。很多大型的購物網站要求發送手機簡訊驗證碼,確保操作用戶是本人。又或者是問用戶一個常識性的問題,比如「牛奶和汽油哪個可以喝?」——總之就是一些機器不會、但是人類可以輕易做到的事。
12306購票網站曾經因為更換了一種「超難」的圖形驗證碼而在各媒體報紙上大出風頭。大家都知道,節日期間的火車票很難買,而眾多搶票軟體更是火上澆油,令網絡購票變得更加艱難、混亂。為了攔截住那些違反公平的搶票軟體,12306網站推出了這種讓人大呼「坑爹」的驗證碼系統:系統要求想買票的用戶在一堆圖片裡找出目標物體,比如便利貼、漢堡、玉米等常見事物,雖然很多人在不習慣的情況下覺得有點難,但這對於想鑽空子的機器程序來說,更是難如上青天。
驗證碼也很年輕
一開始,網絡上是沒有驗證碼的。那時想要在論壇上發帖,只需輕輕敲一下回車鍵。然而,那個時代卻沒有大家以為的那麼平靜,當時的黑客也十分猖狂:他們編寫了一種能夠大量、重複編寫信息的程序,偽裝成人類用戶,肆無忌憚地朝網絡上傾倒大量的、無意義的「殭屍」信息,垃圾郵件、垃圾廣告、垃圾評論到處亂飛。論壇被灌水,有用的信息很快會被淹沒,很多網站的正常運營遭到破壞。除此之外,還有數之不盡的程序機器人使用不斷嘗試的方法惡意破解密碼、惡意刷票,從中獲取非法的利益。強而有力的程序機器人如同霸王龍一樣橫行霸道,網絡世界一片狼藉,眼看著就要失控了。
其中,受影響最大的當屬電子郵件的提供商:他們的用戶每天收到數以百計的垃圾郵件轟炸,嚴重地影響了正常的工作;更要命的是,這些垃圾郵件還是用他們的免費郵箱發出的。他們不可能一一審查郵件,因為那既不尊重隱私,工作量也太大。難道就沒有任何手段約束程序機器人了嗎?當時最有實力的郵件提供商Yahoo(雅虎)公司決定下狠勁改善這個問題。很快,雅虎的負責人聯繫到了當時卡內基梅隴大學一位21歲的學生,他叫路易斯·馮·安(Luis von Ahn)。
路易斯是一個計算機天才,17歲進入卡內基梅隴大學,在大學時期,他憑藉良好的表現獲得了導師曼紐爾·布魯姆(Manuel Blum)的賞識,他的傲人履歷也很可能是雅虎向他伸出橄欖枝的原因。
在研究過程序機器人的「工作手法」之後,他給出了一個獨特的方案:在用戶進行操作之前,就將那些機器人從正常用戶裡揪出來。大家都知道圖靈測試的目的是將機器偽造成人類,而路易斯的方案就是「反」過來:通過簡單的方法將試圖偽裝成人類的程序機器人鑑定出來。
好了,現在大家來想想,有什麼是人類能夠輕易做到,而機器不可能的呢?
數學題?機器做得比人類出色多了;
寫一篇洋洋灑灑保證書保證「我是人類」?機器絕對寫得又快又好;
畫一幅畫?拜託,誰有空每次在論壇發一次貼就畫一次畫?而且說真的,機器畫畫也絕對比人類強;
曬出自己和電腦屏幕上的信息合影的照片?哪有那麼多工作人員有空一個個審核呢。
路易斯發現,人類可以用肉眼很輕易地識別圖片裡的文字信息,而機器就不能。當時的計算機辨識技術還很落後,對於那些鑲嵌在圖片中的、被扭曲過、汙染過的文字無法辨識,而人類只需要稍稍皺眉就可以識別出來。路易斯在導師布魯姆的幫助下很快設計了一個程序,它先是產生一個隨機的字符串,比如smwm,然後對這串字符進行隨機的扭曲、重疊、汙染,再顯示給要進行操作的用戶。只要能夠識別這個變形了的smwm的,就是人類。
這個設計方案後來被命名為「CAPTCHA」,這是「Completely Automated Public Turing test to tell Computers and Humans Apart」首字母的縮寫,意思是「全自動區分計算機和人類的圖靈測試」,雖然看上去很誇張,但實際上還是挺簡單易懂的。它的中文譯名就是大家熟知的「驗證碼」啦。
人人都來當校對
21歲的路易斯·馮·安發明了驗證碼後真是名利雙收,但他享受了掌聲和鮮花後冷靜了下來,為一件「小事」感到耿耿於懷:全世界的網民每天要輸入驗證碼接近2億次,假設每次花費10秒,那麼算下來每天要花費50萬小時。這個時間如果能利用起來,那將會有多大的力量啊。
路易斯將目光投向了舊書攤。資訊時代來臨之際,很多古舊的書籍報紙需要整理成電子版,但是電腦掃描辨識時常常出錯,因為這些舊資料常常不可避免地有著字跡模糊、褪色、汙損的情況。路易斯比任何人都清楚電腦在辨識文字上有多笨拙。唯一的方法是人工核對。但這樣的工作顯然不是一個人或者一個公司可以勝任的,為什麼不讓網民們來幫忙呢?
說幹就幹的路易斯很快開工了:他掃描了一些過期的舊報紙,將掃描得到的圖片在計算機的分析下拆開成單詞片段,再將這些單詞作為驗證碼發送給用戶。有人要問了,先前的那些驗證碼,系統是知道答案的,但這些書籍拆下來的單詞,系統自己也搞不清楚答案,那怎麼知道用戶的判斷結果對不對呢?
路易斯用一貫簡潔優美的思路解決了這個問題,並將它起名為reCAPTCHA(意思是「二次驗證碼」):他讓用戶一次性辨識兩個單詞,其中一個是系統生成的真正的驗證碼,另外一個是從舊報紙上截下來的單詞。如果用戶輸對了第一個驗證碼,那麼輸對第二個單詞的機率也很高。
看了上面這個圖,大家是不是感覺到了一點不妥呢?沒錯,掃描出來的圖片和真正的驗證碼長得那麼不像,reCHAPTCHA這個項目又人所皆知,用戶一眼就能看出來右邊那個「345」是假的驗證碼。很多認真的用戶會樂意為辨識古書籍獻出一份力,但並不是每個人都那麼樂於助人,那些愛搗蛋的用戶很可能會故意輸入錯誤的單詞。
為了防止惡意搗亂、提高答案的可信程度,路易斯後來還要對兩個驗證碼進行加工,讓它們成為「孿生子」:下面左邊的這個morning,就是從舊報紙裡截取出來的,是不是跟右邊的overlooks長得很像呢?如果用戶分不清那個是真驗證碼,哪個是「假驗證碼」,他們會更配合工作。路易斯還將同一個未知的單詞輸送給多個用戶,如果所有用戶辨識的結果一致,都是「morning」,那麼就認為這個單詞被「搞掂」了。
用這一個方法,在短短幾個月時間內,路易斯讓網民們幫忙完成了紐約時代130年來所有舊報紙的存檔電子化——這原本可是個讓人望而生畏的大工程啊。reCAPTCHA很快被Google收購,現在已經成為了Google旗下的一項免費服務:任何人都可以申請將reCAPTCHA用在自己的網站上,你不僅可以為你的網站建立一個防止垃圾信息的堡壘,還讓你的用戶們得以參與到完善人類電子圖書館的豐功偉業中來。