驗證碼的識別和運用

来源:https://www.cnblogs.com/liumeng00wy/p/18260324
-Advertisement-
Play Games

Spring Cloud是一個相對比較成熟的微服務框架。雖然,Spring Cloud於2016年才推出1.0的release版本, 時間最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分散式系統解決方案。 Spring Cloud是一系列框架的有序集合。它利用Spri ...


驗證碼的主要目的是強制人機交互來抵禦機器自動化攻擊,為了確保伺服器系統的穩定和用戶信息的安全,越來越多的網站採用了驗證碼技術。圖片驗證碼是目前最常用的一種,本文也主要討論這種驗證碼的識別。最近在一個爬蟲項目中遇到了驗證碼,需要機器自動識別繞過。這些驗證碼大都解析度都較低,本身信息量不大。通常被加入一種或多種干擾因素:各種背景干擾,雜訊點像素,字體形變和累疊,字元位置隨機及個數不定,反色等情況。在網上調研了資料和文獻後,分別採用OCR識別和模板庫匹配方法對不同類型驗證碼進行了識別。主要過程可以分解為三個步驟:1.圖片清理,2.字元切分,3.字元識別。以下結合工作經驗和調研內容講解一些常用的驗證碼識別方法和過程。1.圖片清理圖片清理是為接下來的機器學習或模板匹配階段做準備的,指通過灰度化、二值化、干擾點清理等過程,得到比較乾凈的圖片數據
驗證碼中的噪音點通常是用來增加破解難度的隨機元素,它們可以是點、線、形狀或其他非字母數字的圖形。下麵我會描述一個典型的帶有噪音點的驗證碼的例子,並且解釋一下這些噪音是如何被加入到驗證碼中的。

以上圖片是一個對比圖,展示了一個帶噪音點的驗證碼與其乾凈版本的對比。左邊的圖片顯示了包含扭曲的字母和數字的驗證碼,周圍散佈著隨機的噪音點和線條。右邊的圖片則是同一驗證碼的乾凈版本,沒有噪音點或線條,只有清晰的字母和數字可見。這有助於理解噪音點在驗證碼中的實際效果。
為了增加識別難度,驗證碼圖像上添加了以下類型的噪音:

1.隨機點噪音:在整個圖像的背景上隨機分佈的小黑點或小白點,這些點的密度不均勻,有的地方密集,有的地方稀疏。

2.隨機線條噪音:在圖像中添加一些斜的、彎曲的或者直的細線,線條的顏色可能與字母相同或不同,但足以干擾識別。

3.扭曲和變形:字母本身可能經過扭曲處理,比如旋轉、拉伸或壓縮,使得字母的形狀變得不規則。

4.背景干擾:可能有雜色的背景,或是背景圖案,這增加了額外的識別難度。

5.模糊效果:整個圖像或部分區域可能應用了模糊效果,使得字母邊緣變得不清晰。

6.顏色變化:字母可能使用了漸變色,或者背景與字母之間的對比度較低,使得區分更加困難。

** 如何添加噪音**
在生成驗證碼時,噪音可以通過編程語言中的圖形庫來添加,如Python的PIL庫或OpenCV庫。例如,隨機點噪音可以通過在迴圈中隨機選擇圖像中的坐標並設置像素值來實現。線條噪音可以通過繪製隨機角度和長度的線條來完成。扭曲和變形則可以通過圖像變換函數實現,而模糊效果通常由圖像捲積濾波器如高斯模糊來完成。
去除噪音
驗證碼噪音的去除通常涉及圖像處理和機器學習技術,包括但不限於:

濾波:使用高斯濾波、中值濾波等技術減少隨機點噪音。
二值化:通過閾值分割將圖像轉換為黑白,有助於去除背景噪音。
形態學操作:如膨脹和腐蝕,用於清理細小的噪音點。
連通組件分析:識別和分離圖像中的獨立字元。
深度學習:使用捲積神經網路(CNNs)等模型進行特征提取和分類,以識別驗證碼中的有效信息。

艾埃巨擘 www.ai9v.cn

該方法的優點是:原理簡單直觀;可以針對不同網站定製優化;對於扭曲的字母和數字識別率較高。缺點是:開發量大,需要定製開發;需要收集大量的字元圖片庫;字元變化很多的情況,匹配次數增加速度下降;對於字元有粘連的圖片識別率低;5. 支持向量機 支持向量機通俗來講是一種二類分類模型,其基本模型定義為特征空間上的間隔最大的線性分類器,其學習策略便是間隔最大化,最終可轉化為一個凸二次規劃問題的求解。實際應用上,往往遇到的是非線性可分得情況,因此通過核函數把低維向量映射到更高維空間,使得樣本滿足線性可分。 驗證碼識別問題實際上是其中單個字元識別問題,而在字元可窮舉的情況下,比如只有英文字元和數字,單個字元識別問題其實是一個分類問題。一個英文字母或數字表示一類,而驗證碼中切分後得到的單個字元需要被機器自動分到某一類。一般情況下,把單個字元的灰度圖片轉成整形數組,數組的每一個元素表示圖片的一個像素,即一個特征維度。我們切分得到的圖片大小為10x16=160像素,即有160個特征,當特征數量多且特征之間關係不明確時,採用支持向量機分類比較合適。 LIBSVM 是臺灣大學林智仁(Lin Chih-Jen)副教授等開發設計的一個簡單、易於使用和快速有效的SVM模式識別與回歸的軟體包,他不但提供了編譯好的可在Windows系統的執行文件,還提供了源代碼,方便改進、修改以及在其它操作系統上應用。該軟體還有一個特點,就是對SVM所涉及的參數調節相對比較少,提供了很多的預設參數,利用這些預設參數就可以解決很多問題;並且提供了交互檢驗(Cross Validation)的功能。主要參數使用:多類別(C-SVC=0),radial basis function(kernel_type=2),訓練和預測代碼如下。對於 這樣輕微變形的驗證碼,有字母和數字共36個類別,收集訓練樣本共778個字元圖的情況下,單字元預測準確率接近100%:

labels = [] samples = []for ch in captchaTemplate.keys(): for table in captchaTemplate[ch]: labels.append(ord(ch)) samples.append(map(lambda e:e/255., table)) problem = svm_problem(labels, samples) model = svm_train(problem, '-t 2 -c 500')print len(samples) data = map(lambda e:e/255., list(Image.open(TESTFILE).getdata(TESTFILE))) y = ord('z') prediction = svm_predict([y,], [data,], model)print prediction

該方法的優點是:無需設計快速的圖像匹配演算法;只要圖片切分方法合適,對於扭曲傾斜的字母和數字識別率也較高;並且可以針對不同類型的驗證碼做定製優化。缺點是:支持向量機原理比較複雜,無法直觀解釋,需要瞭解支持向量機等機器學習方法。6. 神經網路 以上驗證碼識別都依賴於字元切分,切分的好壞幾乎直接決定識別的準確程度。而對於有字元粘連的圖片,往往識別率就會低很多。目前驗證碼識別最先進的是谷歌在識別“街景”圖像中門牌號碼中使用的一套的演算法。該演算法將定位、分割和識別等幾個步驟統一起來,採用一種“深度捲積神經網路”(deep convolutional neural network)方法進行識別,準確率可以達到99%以上。谷歌拿自有的reCAPTCHA驗證碼做了測試,結果發現,對於難度最大的reCAPTCHA驗證碼,新演算法的準確率都達到 99.8%,這可能也好於大多數人為驗證。 驗證碼作為一種輔助安全手段在Web安全中有著特殊的地位,瞭解驗證碼識別的方法和原理,不僅有利於繞過驗證碼抓取網站內容,而且有利於設計更安全合理的驗證碼。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ‍ 寫在開頭 點贊 + 收藏 學會 需求背景 從第三方採購的vue2 + ElementUI實現的雲管平臺,乙方說2011年左右就開始有這個項目了(那時候有Vue了嗎,思考.jpg)。十幾年的項目,我何德何能可以擔此責任。裡面的代碼經過多人多年迭代可以用慘不忍睹來形容,吐槽歸吐槽 ...
  • 摘要:本文深入探討了Nuxt 3的組件開發與管理,從基礎概念、安裝配置、目錄結構、組件分類與開發實踐、生命周期與優化,到測試與維護策略。詳細介紹了Nuxt 3的核心特點,如伺服器端渲染(SSR)、靜態站點生成(SSG)以及與Vue生態系統的無縫集成。文章以Nuxt 3為基礎,指導開發者如何高效構建高... ...
  • 問題分析 當我們需要用摺疊面板的時候,往往會考慮element-ui的el-collaspe,然而大多數時候原生預設的樣式並無法拿來就用。我們往往會自定義組件的樣式,或者在預設的基礎上進行修改。最近在Vue項目中進行組件修改的時候,無意間某個文件自動設置成了scoped(應該是插件自動化生成的結構代 ...
  • 前言 眾所周知,在vue2的時候使用一個vue組件要麼全局註冊,要麼局部註冊。但是在setup語法糖中直接將組件import導入無需註冊就可以使用,你知道這是為什麼呢?註:本文中使用的vue版本為3.4.19。 關註公眾號:【前端歐陽】,給自己一個進階vue的機會 看個demo 我們先來看個簡單的d ...
  • CSS 屬性計算過程 你是否瞭解 CSS 的屬性計算過程呢? 有的同學可能會講,CSS屬性我倒是知道,例如: p{ color : red; } 上面的 CSS 代碼中,p 是元素選擇器,color 就是其中的一個 CSS 屬性。 但是要說 CSS 屬性的計算過程,還真的不是很清楚。 沒關係,通過此 ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 前端常用的截圖保存的方法 利用 Blob 對象和 URL.createObjectURL:可以將截圖數據轉換為 Blob 對象,然後使用 URL.createObjectURL 方法生成一個臨時的 URL,將這個 URL 賦值給 <a> 標簽的 ...
  • 主要對面向過程編程與面向對象編程進行對比,介紹了軟體危機的背景,講解了面向對象編程設計思想的由來,對面向對象方法學:OOA-OOD-OOP進行簡單介紹。 ...
  • 表格配置屬性說明文檔 頁面添加引用: import BaseTable from ‘@/components/BaseTable/index.vue 1、grid-edit-width 表格操作欄寬度 例如:grid-edit-width:250 2、gridOtherConfig 屬性 說明 示例 ...
一周排行
    -Advertisement-
    Play Games
  • 問題 有很多應用程式在驗證JSON數據的時候用到了JSON Schema。 在微服務架構下,有時候各個微服務由於各種歷史原因,它們所生成的數據對JSON Object屬性名的大小寫規則可能並不統一,它們需要消費的JSON數據的屬性名可能需要大小寫無關。 遺憾的是,目前的JSON Schema沒有這方 ...
  • 首先下載centos07鏡像,建議使用阿裡雲推薦的地址: https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spm=a2c6h.25603864.0.0.59b5f5ad5Nfr0X 其實這裡就已經出現第一個坑了 centos 07 /u ...
  • 相信很多.NETer看了標題,都會忍不住好奇,點進來看看,並且順便準備要噴作者! 這裡,首先要申明一下,作者本人也非常喜歡Linq,也在各個項目中常用Linq。 我愛Linq,Linq優雅萬歲!!!(PS:順便吐槽一下,隔壁Java從8.0版本推出的Streams API,抄了個四不像,一點都不優雅 ...
  • 在人生的重要時刻,我站在了畢業的門檻上,望著前方的道路,心中涌動著對未來的無限憧憬與些許忐忑。面前,兩條道路蜿蜒伸展:一是繼續在職場中尋求穩定,一是勇敢地走出一條屬於自己的創新之路。儘管面臨年齡和現實的挑戰,我仍舊選擇勇往直前,用技術這把鑰匙,開啟新的人生篇章。 迴首過去,我深知時間寶貴,精力有限。 ...
  • 單元測試 前言 時隔多個月,終於抽空學習了點新知識,那麼這次來記錄一下C#怎麼進行單元測試,單元測試是做什麼的。 我相信大部分剛畢業的都很疑惑單元測試是乾什麼的?在小廠實習了6個月後,我發現每天除了寫CRUD就是寫CRUD,幾乎用不到單元測試。寫完一個功能直接上手去測,當然這隻是我個人感受,僅供參考 ...
  • 一:背景 1. 講故事 最近在分析dump時,發現有程式的卡死和WeakReference有關,在以前只知道怎麼用,但不清楚底層邏輯走向是什麼樣的,藉著這個dump的契機來簡單研究下。 二:弱引用的玩法 1. 一些基礎概念 用過WeakReference的朋友都知道這裡面又可以分為弱短和弱長兩個概念 ...
  • 最近想把ET打表工具的報錯提示直接調用win系統彈窗,好讓策劃明顯的知道表格哪裡填錯數據,彈窗需要調用System.Windows.Forms庫。操作如下: 需要在 .csproj 文件中添加: <UseWindowsForms>true</UseWindowsForms> 須將目標平臺設置為 Wi ...
  • 從C#3開始,拓展方法這一特性就得到了廣泛的應用。 此功能允許你能夠使用實例方法的語法調用某個靜態方法,以下是一個獲取/創建文件的靜態方法: public static async Task<StorageFile> GetOrCreateFileAsync(this StorageFolder f ...
  • 在Windows 11下,使用WinUI2.6以上版本的ListView長這樣: 然而到了Win10上,儘管其他控制項的樣式沒有改變,但ListViewItem變成了預設樣式(初代Fluent) 最重大的問題是,Win10上的HorizontalAlignment未被設置成Stretch,可能造成嚴重 ...
  • 前言 周六在公司加班,幹完活後越顯無聊,想著下載RabbiitMQ做個小項目玩玩。然而這一下就下載了2個小時,真讓人頭痛。 簡單的講一下如何安裝吧,網上教程和踩坑文章還是很多的,我講我感覺有用的文章放在本文末尾。 安裝地址 erlang 下載 - Erlang/OTP https://www.erl ...