12306圖片驗證12小時內被破解

虎嗅網發表於2015-03-17

03 月 16 日上午,12306 網站更新了自己的驗證碼形式,將原有的驗證碼從英文字元變換到 8 張小圖片,使用者必須根據問題提示來點選選中正確的圖片,然後才能預定車票。緊接著,各路媒體開始發稿,《12306 官網放大招:啟用圖片驗證碼所有搶票軟體將失效》《12306 官網推出全新圖片驗證碼搶票軟體將失效》等新聞層出不窮。作為一個程式設計師,看到這樣的標題,十分困惑這些媒體是怎麼用上帝視角這麼直接斷定搶票軟體將全部失效的,可以想象一大波刷票公司正準備捋起袖子幹活就直接聽到 12306 宣佈自己勝利了。當然,我們反對一切的黃牛黨,本文只是談談驗證碼技術。

重技術的驗證碼是一場拉鋸戰

當我們談論驗證碼時,不免地提到兩個人。第一個是電腦科學之父、人工智慧之父艾倫.圖靈,圖靈對整個電腦科學的貢獻和意義在此就不用展開,之前所以提到他,是因為他提出的“圖靈測試”,這一理論第一次提到將電腦和人區分開。第二個必須提到的是卡內基梅隆大學的路易斯·馮·安,他在 2002 年第一次將扭曲的文字用於區別人和計算機,就是我們現在普遍見到的英文字元驗證碼,後來他將驗證碼公司 Re-CAPTCHA 賣給了 google。

現在 12306 同樣也用了扭曲的英文字元,但是卻抵擋不住黃牛黨和刷屏軟體機器識別,是因為在這近十年電腦科學技術的發展,OCR(Optical Character Recognition,光學字元識別)等技術發展的已經十分成熟,識別扭曲英文字元並非難事,根據現有實驗報告統計及真實調查,普通的驗證碼的破解率基本在 75% 以上。說到這裡我們看看百度和騰訊是怎麼解決的。

11111.jpg

騰訊將驗證碼圖片背景直接貼上真實圖片做干擾,而且顏色採取的近似值。

22222.jpg

被稱為百度神獸的九宮格漢字驗證碼,利用中文的博大精深,在防刷上有較大的提升,但是對人的使用者體驗上就略差了。

12306 的驗證碼出發點是安全?使用者體驗?

那麼,我們來談談 12306 的圖片驗證碼到底是個什麼鬼。12306 所採用的圖片式驗證碼的驗證形式,並不是什麼首創,早在一些遊戲網站上也採用過這樣的驗證形式,請看下圖。

143922wqop5coyqqpi1cq9.jpg

這把人都能嚇懵的驗證碼還真出現過,而且很不幸的是,上了一陣子之後就被破解了。

現在 12306 推出的圖片驗證碼,首先從使用者體驗上來講,並沒有比之前的文字驗證碼好用多少。雖然使用者不再依靠鍵盤輸入,但是面對小且密集的 8 張圖片,選出“所有”正確的圖片,那必須把所有圖片仔細看一遍,這一過程帶來的不確認型其實是同使用者分辨G和 9 和心裡過程是一樣的。不信你瞅瞅下面哪些是郵票?重要的是這一過程中帶來很大的不確認性,心理負擔略重。

444444.jpg

使用者體驗這個標準,不好衡量,我們再來談談安全性。從一開始變成圖片驗證形式,事情就不會像今天新聞標題說的那樣,“刷票軟體將全部失效“(我本著好奇的態度,搜了一下相關新聞,基本上從 2012 年起,每次 12306 更換比較明顯的驗證碼,媒體都是這樣報導的),為什麼呢?前面我們講到成熟的 OCR 技術導致英文字元驗證碼很難起作用,事實上,影像識別的發展也是趨於成熟。所以,12306 的圖片驗證碼被迅速破解也不是什麼難事,反而將門檻降低。

下面的具體破解舉例引用知乎使用者王貓貓在問題“如何評價 12306 的最新版驗證碼?”下的回答。

555555.jpg

(此圖來自知乎使用者王貓貓的回答

直接將圖片處理後丟入 google、百度的識圖介面,返回的數值讓人驚訝(第二張圖居然能精準識別到是沙縣小吃?)。後來根據王同學提供的程式碼,我進行了下一步的處理工作,再次利用第三方軟體識別中文字元,然後將字元與圖片字元進行匹配,之後選擇圖片。整個測試圖片大概 200 張(只是模擬了登入,沒有去刷掉一整車票),通過率在 85% 左右。所以,僅僅是技術愛好者動用一些公用介面就輕鬆能識別圖片類容,而且一旦識別後,還可以將這張出現過的圖片存庫,再次出現就更加快速準確的定位了。暫且不談影像識別和機器學習這樣高大上的破解方法了。

圖片驗證碼之所以不安全,是因為目前的圖片識別技術也是相當的成熟。12306 這些圖片如果是人工標記,無疑是將自己擺到一個愚公移山的悲壯位置;如果是機器識別,也一樣是可以被識別內容,即用圖片內容的識別作為驗證核心將毫無意義。

從 12306 這次更新來看,12306 的驗證思路,還是在玩已經過時的技術,對驗證的視野和理解並不是很透徹,才會落到上線不到一天就被破解的尷尬局面。當然,12306 有面對黃牛的進行創新的勇氣是可嘉的,但是方向走錯了,進行購票流程上的全面優化才能讓問題得到最終的解決,將賭注放在驗證碼身上,目前看來不太現實。

走在前面的依然是 Google

那麼,驗證安全的終極奧義是什麼呢?我們可以回顧一下去年的關於 google 的 No-CAPTCHA(No-Capthcha 是 Re-Capthcha 的子專案)的文章,google 提出了一個概念叫 human behavior analysis,大意是將使用者的行為做為判斷人與計算機的準則。這個理念提出的意義在於,不再依靠圖靈測試即單一的答案來判斷人機,而是通過使用者一系列的上網行為來確定訪問者是人,還是機器。但是從 google 目前的前端程式碼層和具體流程來看,目前只是試探性的的發展,如果這個理念能夠實際操作並完善,那麼驗證碼的安全性將提高的一個史無前例的高水平,至少破解門檻不會低到僅僅呼叫一下公共介面就瞬間破解。

相關文章