驗證碼(CAPTCHA)是「Completely Automated Public Turing test to tell Computers and Humans Apart」(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機仍是人的公共全自動程序。能夠防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定註冊用戶用特定程序暴力破解方式進行不斷的登錄嘗試,實際上用驗證碼是如今不少網站通行的方式,咱們利用比較簡易的方式實現了這個功能。這個問題能夠由計算機生成並評判,可是必須只有人類才能解答。因爲計算機沒法解答CAPTCHA的問題,因此回答出問題的用戶就能夠被認爲是人類。php
最早想要解決這一問題的是雅虎——做爲互聯網時代早期最重要的免費郵件提供商,他們一方面要解決用戶們天天遇到的數以百計的垃圾郵件轟炸,另外一方面,他們本身的免費郵箱,偏偏又是垃圾郵件的最愛——耗費無數資源所阻止的垃圾郵件,都來自於本身的服務器。這讓雅虎開始認真考慮如何解決人機辨識問題。前端
他們找到一位當時剛剛21歲的天才——Luis von Ahn。 而Luis Von Ahn給出的方案,就是這個讓人民羣衆微微皺眉,可是讓計算機聳肩撓頭的驗證碼 Capcha。計算機辨識技術還很落後,對於通過扭曲、污染的文字,沒法辨識。而人類卻能夠輕鬆認出這些文字。這是一個簡單而巧妙的設計,計算機先是產生一個隨機的字符串,而後用程序把這個字符串的圖像進行隨機的污染,扭曲,再顯示給顯示器前的人或者機器。凡是可以辨識這些字符的,即爲人類。程序員
防止惡意破解密碼、刷票、論壇灌水、刷頁。有效防止某個黑客對某一個特定註冊用戶用特定程序暴力破解方式進行不斷的登錄嘗試,其實是用驗證碼是如今不少網站通行的方式(好比招商銀行的網上我的銀行,騰訊的QQ社區),咱們利用比較簡易的方式實現了這個功能。雖然登錄麻煩一點,可是對網友的密碼安全還來講這個功能仍是頗有必要,也很重要。驗證碼主要是運用於登陸,註冊,評論發帖等網站模塊。安全
(1)登陸模塊:防止惡意程序採用暴力破解的方式進行不斷的登陸嘗試,來破解用戶的密碼。服務器
(2)註冊模塊:防止惡意程序進行大量的註冊,佔用網站服務器資源,發佈垃圾消息致使網站崩潰。機器學習
(3)評論發帖模塊:防止垃圾帖,廣告貼刷屏,使論壇,博客等網站沒有辦法運行。學習
(4)其餘:一些投票活動,搶購商品,搶票等地方也會使用到驗證碼,用來阻止刷票。測試
1.隨機的數字或者字母圖片,這是最原始也是最簡單的驗證碼,由於字體太正,容易被破解,如今基本已經被放棄;在當時的條件下,識別扭曲的圖形,對於機器來講仍是一個很艱難的任務,而對於人來講,則相對能夠接受。字體
2.GIF格式的隨機數字或者字母圖片,是第一種的加強版,這種驗證碼由於一直在動,因此相對上一個效果上有了較大的提高;網站
3.隨機數字+隨機大寫英文字母+隨機干擾像素+隨機位置BMP格式圖片,由於位置及干擾像素的影響,在初期對判斷仍是有些難度的,後來由於像素讀取等技術,現現在的效果就不行了;
4.隨機英文字母+隨機顏色+隨機位置+隨機長度的JPG格式圖片,對字母進行大小寫,位置,顏色,長度等進行隨機顯示,但在像素讀取技術下也甘拜下風;
5.廣告驗證碼,輸入廣告中的高亮部分的內容便可,這個仍是比較有創意的,隨機的圖片,隨機的廣告,隨機的文字,對於品牌是個挺好的宣傳手段,這種驗證碼形式基本拋棄了驗證碼自己的功能,由於其一些特性而變得極容易被「機器人」破解。根本不能保證網站的安全,惟一作的就是卡住用戶,強迫其看一下廣告;
6.問題驗證碼,主要是以問答式的形式來進行填寫,這是對以前單純顯示文字,字母,數字的難度提高,將原有的固定形式改成這種略帶互動的形式,地理問題(如圖),數學問題,常識問題等;
7.物品圖片驗證碼,這個很少說,最出名的就是如今12306採用的防刷票措施了,聽說今年的點擊成功率只有8%,又有多少人由於驗證碼錯誤搶到沒買到票啊~~;
8.手機短信驗證碼,經過發送驗證碼到手機,這也是針對真實用戶作的調整,保證用戶操做的真實性,缺點就是有信息泄漏的可能;
9.手機語音驗證碼驗證碼,這個就比較高級了,點擊「獲取語音驗證碼」,經過語音電話直接呼到用戶手機,實現電話語音播報的方式,防止網站用戶或會員用戶常常因各類問題不能接收到網站發出的短信驗證碼,爲網站帶來用戶,給網站管理者帶來更輕鬆更高效的運營,也爲用戶帶來更好的使用體驗;
10.視頻驗證碼,視頻驗證碼中隨機數字、字母和中文組合而成的驗證碼動態嵌入到MP4,flv等格式的視頻中,增大了破解難度。簡單來講,視頻驗證碼就是以視頻的形式顯示驗證碼。將視頻背景換作廣告視頻。以視頻的形式完成驗證碼的功能,而且達到廣告的效果。這樣作遠比在普通驗證碼上加廣告好得多。首先視頻原本就是視頻驗證碼的必需品,並且驗證碼是動態的不會影響視頻效果,並且不會下降視頻驗證碼的安全性和其餘特性。不會由於追求廣告效果而丟掉了抗破解性。但因爲須要較高的技術支持,此種驗證碼並未普及開。不過相信隨着技術水平的提升,視頻驗證碼會獲得普及,網站的安全性會獲得有效的提升。
11.新驗證碼時代
Google的nocaptcha vs 極驗、阿里滑動驗證碼
鵝廠從2013年開始嘗試新型驗證碼,2013年的識圖驗證碼。和12306驗證碼很像,當時的圖片是設計師畫的,最終由於圖片資源難以知足自動機對抗要求的海量數量需求而暫時沒推廣。還有2014年初版拼圖驗證碼嘗試。
新時代驗證碼須要更大的舞臺和更快的反應:摒棄了過去多年對字符的依賴,它能夠快速支持和推廣新型交互驗證碼。另外,用戶在完成操做同時,前端會收集用戶行爲數據,經過機器學習,爲線上策略輸出更準確有效的策略。
基於當前登陸賬號的歷史數據提問
爲簡單起見,破解說明主要針對是第2種類型的,先來看看網上常見的這種驗證碼的圖片:
使用目前這種方法,對驗證碼的識別基本上能夠作到100%。
經過以上步驟,您可能說了,並無發現如何取出干擾素啊!其實取出干擾素的方法很簡單,干擾素的一個重要特徵是,不能影響驗證碼的顯示效果,因此製做干擾素時它的RGB可能低於或者高於某個特定值,好比我給的例子中的圖片,干擾素的RGB各項值是不會超過125的,因此,這樣咱們就很容易去掉干擾素了。
簡單的驗證碼只有數字和字母組成,格式統一,每次出現位置固定。下面繼續深刻研究識別驗證碼,此次須要識別的目標是:驗證碼有字符和數字組成,驗證碼存在旋轉(可能左右都旋轉),位置不固定,存在字符與字符之間的粘連,且驗證碼有更強的干擾素。
咱們如下圖爲例進行講解。
第一步:二值化。把驗證碼的部分用 1 表示,背景部分用 0 表示出來,識別方法很簡單,咱們打印出驗證碼整張圖片的 RGB ,而後分析其規律便可,經過 RGB 碼,咱們很容易分辨出上面這張圖片的 R 值大於 120 , G 和 B 的值小於 80 ,因此依據這個規則咱們很容易把上面的圖片二值化。
再來看看上面的第三種驗證碼圖片
剛看上去,感受很複雜。驗證碼的圖片每次背景色都不相同,且不是單色,各個驗證碼數字的顏色每次也各不相同。貌似很難二值化,其實咱們打印出其 RGB 值很容易就發現。不管驗證數字顏色如何變化,該數字的 RGB 值總有一個值小於 125 ,因此經過以下判斷 $rgbarray['red'] < 125 || $rgbarray['green']<125|| $rgbarray['blue'] < 125 咱們就很容易分辨出哪裏是數字,哪裏是背景。
咱們可以找到這些規律的緣由是,在製做驗證碼的干擾素時,爲了使干擾素不影響數字的顯示效果,必須使用干擾素的 RGB 和數字 RGB 相互獨立,互不干擾。只要懂得這個規律,咱們就很容易實現二值化。
咱們找到的 120 , 80 , 125 等閾值,可能和實際的 RGB 有出入,因此,有時二值化後,會有部分地方出現 1 ,對於驗證碼上固定位置顯示數字,這種干擾沒有太大意義。可是對於驗證碼位置不肯定的圖片來講,在咱們切割字符時,極可能形成干擾。因此,在二值化後要進行去噪處理。
第二部:去噪處理。去噪的原理很簡單,就是把孤立的有效的值去掉,若是噪點比較高,要求的效率也比較高的話,這裏面也有不少工做要作。幸虧這裏咱們不要求這麼高深,咱們使用最簡單的方法就能夠,若是一個點爲 1 則判斷這個點的上下左右上左上右下左下右 8 個方位上數字是否爲 1 ,若是不爲 1 ,就認爲是一個燥點,直接設置爲 1 便可。
如上圖所示,咱們使用此方法很容易發現紅色方框部分的 1 爲燥點,直接設置爲 1 便可。在判斷時咱們使用了一個技巧,有時候的噪點多是兩個連續的 1 ,因此咱們計算這個點的 8 個方向上的值之和,最後咱們判斷他們的和是否小於特定的閾值。
第三部:切割字符。切割字符的方法有不少種,這裏採用最簡單的一種,先垂直方向切割成爲字符,而後在水平方向去掉多於的 0000 ,以下圖
第一步切割紅線部分,第二步切割藍線部分,這樣就能夠獲得獨立的字符了。可是像下面這種狀況
按上面的方法會把 dw 字符切割成一個字符,這是錯誤的切割,因此這裏咱們涉及到粘連字符的切割。
第四步:粘連字符切割。製做驗證碼時,規則字符的粘連很容易分割開,若是字符自己有縮放,變形就很難處理,通過分析,咱們能夠發現,上面的字符粘連屬於很簡單的方式,只是規則字符的粘連,因此處理這種狀況,咱們也使用很簡單的處理方式。當完成分割操做後,咱們不能立刻肯定分割的部分就爲一個字符,要進行驗證,驗證的關鍵因素就是,切割下來的字符的寬是否大於閾值,這個閾值的取捨標準是,一個字符不管怎麼旋轉變形都不會大於這個閾值,因此,若是咱們切割的塊大於這個閾值,就能夠認爲這是一個粘連字符;若是大於兩個閾值之和,就認爲是三個字符粘連,以此類推。知道這個規則後,切割粘連字符也就很簡單了。若是咱們發現是粘連字符塊,直接平分這個塊爲兩個或者多個新的塊就能夠。固然爲了更好的還原字符,我通常都採用平分 +1 , -1 對字符塊的部分進行適當的補充。
第五步:匹配字符。對於旋轉字符的特徵碼創建,有不少種方法,這裏就不作深刻研究了。我這裏使用的最簡單的方式,爲全部字符的全部狀況創建匹配庫,因此在我提供的代碼種增長了 study 操做,其目的就是,先有人手工識別圖片的驗證碼,而後經過 study 方法,寫入特徵碼庫。這樣寫入的圖片數據越多,驗證識別的準確行也就越高。
通過以上步驟,咱們基本上能夠識別如今互聯網上大部分的驗證碼,這裏咱們都是使用的最簡單的方法,沒有使用任何 OCR 知識。
對於識別驗證碼的程序來講,最可貴部分是驗證字符的切割和特徵碼的創建,而國內不少程序員只作驗證碼時,老是喜歡在驗證碼加不少干擾素,干擾線,影響效果不說,還達不到很好的效果;因此,要想使本身驗證碼難於本識別,只作下面兩點就夠了
只要作到這兩點,或者這兩點的變形,識別程序就很難識別。
1.https://www.juhe.cn/聚合數據
2.http://www.sxdama.com/石像網
3.http://www.dama2.com/打碼兔
4.http://www.ruokuai.com/若快
5.http://www.zhima365.com/index1.php知碼網