03月16日上午,12306網(wǎng)站更新了自己的驗證碼形式,將原有的驗證碼從英文字符變換到8張小圖片,用戶必須根據(jù)問題提示來點擊選中正確的圖片,然后才能預定車票。緊接著,各路媒體開始發(fā)稿,《12306官網(wǎng)放大招:啟用圖片驗證碼所有搶票軟件將失效》《12306官網(wǎng)推出全新圖片驗證碼搶票軟件將失效》等新聞層出不窮。作為一個程序員,看到這樣的標題,十分困惑這些媒體是怎么用上帝視角這么直接斷定搶票軟件將全部失效的,可以想象一大波刷票公司正準備捋起袖子干活就直接聽到12306宣布自己勝利了。當然,我們反對一切的黃牛黨,本文只是談?wù)勻炞C碼技術(shù)。
重技術(shù)的驗證碼是一場拉鋸戰(zhàn)
當我們談?wù)擈炞C碼時,不免地提到兩個人。第一個是計算機科學之父、人工智能之父艾倫.圖靈,圖靈對整個計算機科學的貢獻和意義在此就不用展開,之前所以提到他,是因為他提出的“圖靈測試”,這一理論第一次提到將電腦和人區(qū)分開。第二個必須提到的是卡內(nèi)基梅隆大學的路易斯·馮·安,他在2002年第一次將扭曲的文字用于區(qū)別人和計算機,就是我們現(xiàn)在普遍見到的英文字符驗證碼,后來他將驗證碼公司Re-CAPTCHA賣給了google。
現(xiàn)在12306同樣也用了扭曲的英文字符,但是卻抵擋不住黃牛黨和刷屏軟件機器識別,是因為在這近十年計算機科學技術(shù)的發(fā)展,OCR(Optical Character Recognition,光學字符識別)等技術(shù)發(fā)展的已經(jīng)十分成熟,識別扭曲英文字符并非難事,根據(jù)現(xiàn)有實驗報告統(tǒng)計及真實調(diào)查,普通的驗證碼的破解率基本在75%以上。說到這里我們看看百度和騰訊是怎么解決的。
騰訊將驗證碼圖片背景直接貼上真實圖片做干擾,而且顏色采取的近似值。
被稱為百度神獸的九宮格漢字驗證碼,利用中文的博大精深,在防刷上有較大的提升,但是對人的用戶體驗上就略差了。
12306的驗證碼出發(fā)點是安全?用戶體驗?
那么,我們來談?wù)?2306的圖片驗證碼到底是個什么鬼。12306所采用的圖片式驗證碼的驗證形式,并不是什么首創(chuàng),早在一些游戲網(wǎng)站上也采用過這樣的驗證形式,請看下圖。
這把人都能嚇懵的驗證碼還真出現(xiàn)過,而且很不幸的是,上了一陣子之后就被破解了。
現(xiàn)在12306推出的圖片驗證碼,首先從用戶體驗上來講,并沒有比之前的文字驗證碼好用多少。雖然用戶不再依靠鍵盤輸入,但是面對小且密集的8張圖片,選出“所有”正確的圖片,那必須把所有圖片仔細看一遍,這一過程帶來的不確認型其實是同用戶分辨G和9和心里過程是一樣的。不信你瞅瞅下面哪些是郵票?重要的是這一過程中帶來很大的不確認性,心理負擔略重。
用戶體驗這個標準,不好衡量,我們再來談?wù)劙踩浴囊婚_始變成圖片驗證形式,事情就不會像今天新聞標題說的那樣,“刷票軟件將全部失效“(我本著好奇的態(tài)度,搜了一下相關(guān)新聞,基本上從2012年起,每次12306更換比較明顯的驗證碼,媒體都是這樣報道的),為什么呢?前面我們講到成熟的OCR技術(shù)導致英文字符驗證碼很難起作用,事實上,圖像識別的發(fā)展也是趨于成熟。所以,12306的圖片驗證碼被迅速破解也不是什么難事,反而將門檻降低。
下面的具體破解舉例引用知乎用戶王貓貓在問題“如何評價 12306 的最新版驗證碼?”下的回答。
(此圖來自知乎用戶王貓貓的回答)
直接將圖片處理后丟入google、百度的識圖接口,返回的數(shù)值讓人驚訝(第二張圖居然能精準識別到是沙縣小吃?)。后來根據(jù)王同學提供的代碼,我進行了下一步的處理工作,再次利用第三方軟件識別中文字符,然后將字符與圖片字符進行匹配,之后選擇圖片。整個測試圖片大概200張(只是模擬了登錄,沒有去刷掉一整車票),通過率在85%左右。所以,僅僅是技術(shù)愛好者動用一些公用接口就輕松能識別圖片類容,而且一旦識別后,還可以將這張出現(xiàn)過的圖片存庫,再次出現(xiàn)就更加快速準確的定位了。暫且不談圖像識別和機器學習這樣高大上的破解方法了。
圖片驗證碼之所以不安全,是因為目前的圖片識別技術(shù)也是相當?shù)某墒臁?2306這些圖片如果是人工標記,無疑是將自己擺到一個愚公移山的悲壯位置;如果是機器識別,也一樣是可以被識別內(nèi)容,即用圖片內(nèi)容的識別作為驗證核心將毫無意義。
從12306這次更新來看,12306的驗證思路,還是在玩已經(jīng)過時的技術(shù),對驗證的視野和理解并不是很透徹,才會落到上線不到一天就被破解的尷尬局面。當然,12306有面對黃牛的進行創(chuàng)新的勇氣是可嘉的,但是方向走錯了,進行購票流程上的全面優(yōu)化才能讓問題得到最終的解決,將賭注放在驗證碼身上,目前看來不太現(xiàn)實。
走在前面的依然是Google
那么,驗證安全的終極奧義是什么呢?我們可以回顧一下去年的關(guān)于google的No-CAPTCHA(No-Capthcha是Re-Capthcha的子項目)的文章,google提出了一個概念叫human behavior analysis,大意是將用戶的行為做為判斷人與計算機的準則。這個理念提出的意義在于,不再依靠圖靈測試即單一的答案來判斷人機,而是通過用戶一系列的上網(wǎng)行為來確定訪問者是人,還是機器。但是從google目前的前端代碼層和具體流程來看,目前只是試探性的的發(fā)展,如果這個理念能夠?qū)嶋H操作并完善,那么驗證碼的安全性將提高的一個史無前例的高水平,至少破解門檻不會低到僅僅調(diào)用一下公共接口就瞬間破解。