用生成模型為自己生成密碼,無懼暴力破解
全文共 4126字,預計學習時長 8分鐘
機器學習和深度學習模型在工業各個領域都得到了廣泛運用,網路安全領域也不例外 。最新相關的例子就是PassGAN,這個深度學習模型可以生成密碼,因而提高了暴力破解(Brute-Force Attacks)的效率。
本文會引用這個概念,並以此為例,解釋生成模型和判別模型的區別;同時也會突出強調深度學習相對其他傳統機率模型在處理高維度資料時的優越性。
判別模型 vs 生成模型
由生成模型和判別模型構成的機器學習/深度學習等眾多模型有著眾所周知的分類法,每個模型都有各自的特徵。但剛入門的資料科學家極易產生混淆。事實上這完全可以理解,畢竟運用情況不同,名稱會產生誤導。直覺上讀者可能會覺得判別模型無非就是區分各種型別的資料或生成新的資料,當然,這無可厚非。但並不意味著生成模型就不能當作分類器來使用,正如其名字所暗示的那樣。
兩者最根本的區別在於模型是如何學習的。簡單來講,生成模型會學習資料生成的方式,然後對未曾見過資料進行分類,而判別模型只會學習每個類之間的差異(邊界)。
舉個更具體的例子,想象一下:我們收集了很多有關人或動物的塗鴉。現在想建立一個模型,可以將塗鴉當作資料輸入再作為反饋輸出,不論它看起來更像人還是動物。
有趣的是,生成模型會先學習怎麼畫人或者動物的塗鴉,在遇到沒見過的塗鴉時,它會先畫一個人和一個動物,再與輸入影像進行比對。
與此同時,判別模型會學習每個資料類別之間的細微差距,比如說,動物的尾巴、人類的姿勢、形狀等等。遇到新模型,在沒有學習繪畫的條件下判別模型會根據這些資訊對兩個類別進行區分,很簡單對吧?
雖然程式設計師們一般傾向於使用判別模型因為它簡單,生成模型也有自身優勢,同樣開始越來越流行。特別是在資料缺失或者探測異常值的時候,生成模型就非常好用。畢竟我們的目的是生成新資料,而這一點判別模型是做不到的。事實上,生成模型能夠生成真實內容也是前不久才實現的。(見下圖)
生成模型生成的面部影像:David Foster. “生成式深度學習”
可能性
我們儘可能避免使用數學術語,但要想把生成模型和判別模型解釋清楚,就免不了會涉及一些數學概念。
假設手頭有Y標記的觀測指標X。從機率學角度來看,判別分類器會根據P(Y|X)的條件機率建模。也就是說,已知觀測指標X,出現Y類資料的機率是多少?別把P(A, B)的條件機率和聯合機率混淆了,聯合機率是指A和B同時發生的機率。另一方面,生成模型會直接根據P(X)發生的機率建模,簡單來說,首先獲取觀測指標X的機率是多少?要注意在此模型中,不一定非得用標籤,但如果想執行分類,可以使用標籤來對P(X|Y)進行定義。
簡化後的生成模型
為了在實戰中理解生成模型,我們來想象一個極簡單的場景:只存在於二維空間的生成模型。這個模型的靈感來源是大衛∙福斯特(David Foster)所著的《生成式深度學習》(Generative Deep Learning),強烈推薦閱讀!
請思考以下在二維空間中由Pdata所產生的一些黑點::
生成模型的任務是要生成一個看起來像是由Pdata生成的新的點X=(x, y)。所以我們構建一個名為Pmodel的Pdata估值,其可能的情況就是橙色區域內生成的點很可能是連續隨機分佈模型,而區域外不會再生成新的點,如下圖所示。
回到剛才裡對生成模型的介紹,我們剛建立了一個能辨識建立資料點的模型!雖然非常簡單,但你剛開發了一個生成模型!
現在我們深入一些,觀察模型在遇到真實的Pdata分佈時表現如何。注意,Pdata的初始版本表示內陸地區樹的分佈機率(如下地圖所示)。大致上黑點也就是土地中會長樹的區域,機率幾乎一樣,但不可能長在水裡。
值得注意的是,雖然Pmodel是Pdata高度簡化的版本,但它仍保留了原始分佈的主要機制。透過從Pmodel 中A, B, C三個點進行取樣,能明顯看出我們的模型仍需改善。Pdata不能直接生成C點,而A B兩點很難與真實點區分開,這就是生成模型所應達到的效果。生成與已有資料不同的新資料,哪怕它們看起來像是由同一個規則生成的。
機率論vs深度學習方法
這一部分,我們將透過例項探索深度學習為何對生成模型的快速發展作出了巨大貢獻。但首先有必要提及一些機率論方法,這樣就有比較的標準了。
最大似然估計
最大似然估計是一種統計方法,可用於計算引數,比如模型生成資料是最大值的機率。乍一聽可能有些雲裡霧裡的,我們可以結合上文的例子來理解。
假設上文的橙色區域是機率密度函式,簡單來說就是任意樣本空間(圖上的x, y軸)的一個點,作為輸出資料這個函式應該給出0到1的任意值。一般來說,用機率密度函式計算出所有點的總和應該都為1。回到剛才的例子,黑點會統一分佈在橙色區域內,機率是一個常量,而出現在該區域外的機率為0。其數學表示式如下:
繼續,已知θ是4個引數{θ1, θ2, θ3, θ4}的集合,用似然函式L(θ| x) 解答此問:
已知點x的引數,求實際值的機率。
讀者可能會思考,這些引數是幹什麼用的?實際上,這些引數來源於統計學一個很有名的領域——引數建模。換言之,就是用有限引數的集合來表示機率的分佈。在本例中可以透過4個引數來對機率分佈區域進行建模,左上角的點(θ1, θ2),和右下角的點(θ3, θ4)。還有一個更真實的例子就是高斯分佈,它有兩個引數:平均值μ, 和標準方差σ。
更準確地講,似然函式表示式如下:
其含義為由機率密度函式計算出的 x 的機率用引數θ表示。
現在我們手頭若有多個資料點Xn = {x1, x2, …, xn},其似然表示為:
不過這個公式的運算有點麻煩,我們可以將它轉換成對數的表示方式,其結果為總和,區分起來也更容易一些。
注意,只有自然對數單調遞增時才可能將其轉換成對數形式。簡單地講,y隨著x的增加而增加,故最大值沒有變化。
瞭解了上面的資訊,最初的概念——最大似然估計,理解起來就好多了。或者簡單來說,就是找到與資料集X最匹配的引數θ。等於說這些引數最有可能用來對生成X的機率分佈進行建模。其正式表達為:
以上資訊足夠說明如何使用最大似然估計建模,但是這些還只停留在理論層面,筆者所舉的例子也不過是為了將其視覺化,便於理解。在接下來的部分,我們將利用前文提到的知識開發一個有用的生成模型。
用樸素貝葉斯生成密碼
再來想象一個場景,假設你正絞盡腦汁地想一個密碼,這時候你想到建立生成模型為自己生成密碼!
首先建立一個列表,每一項都是密碼中需要包含的元素:
文字:pass, café, bingo, hyper, leet, hackerman, ninjia, babe
數字:1234, 1111, 777, 000, 0101, 2019, 2018, 1,2, 10, 123
特殊符號:!,@,$,%,*,_
大寫字母:A, E, T, P
根據密碼需要遵循的規則定義標準格式:
大寫字母+文字+數字+特殊符號
基本上每個密碼都可以利用這4個特徵來編排,順序一樣:大寫字母、文字、數字和特殊符號。全部從上述列表中取值。
使用這種方法,一共可以有8*11*6*4 = 2112種組合方法!當然,只從每個特徵隨機選擇一個值放到密碼裡就可以了,但這樣的話密碼就會很難記,所以每次都避免輸入隨機密碼。相反,如果能參考之前使用過的密碼就比較理想了。用行話來講,就是應該有一個更偏好特定元素的Ppass分佈。
首先,從自己之前使用過的密碼中收集30組格式相同的密碼。
下圖是從資料庫前10組密碼中提取的元素:
提個問題:密碼中包括x的機率是多少?
回憶一下,密碼 x 是由4個特徵定義的。這就類似上文介紹的地圖上的一個點,但這次不是座標 x,y ,本例有4個維度,x1,x2,x3,x4。
一般來說,這個問題的答案就是x1,x2,x3,x4同時發生的機率,即:
用鏈式法則可以將其擴充到條件機率。表示式如下:
要繼續使用樸素貝葉斯模型,我們必須先做出強有力的假設,每個特徵與其它特徵之間都是獨立的。也就是說,大寫字母的值與文字和數字的值無關。這個假設夠簡單了,該方法也由此得名。或許表示式會看得更清楚:
理解了這一點,使用鏈式法則得出的公式可以簡化為:
等等,既然已知值的分佈可以被看作是一個範圍,那麼在描述最大似然估計時,機率密度函式就會由具有4個引數的分佈引數集引數化。在這種情況下,機率又是如何進行引數化的呢?
因為資料集中包含離散值,如果讀者願意從更抽象的角度來理解,有限集合裡所包含的元素可以使用多項分佈,其結果就是多項樸素貝葉斯。在這種情況下,我們可以簡單地給模型中每個特徵的各個值都分配一個引數,那麼總共會得到8+11+6+4-4=25 個引數。
-4是為了補償每個特徵最後一個值,算上它是為了使總和為1,但其實並不需要計算。
另外,要在多項分佈裡算出最大似然估計,我們只需要用每個特徵的值出現的次數除以觀察的總次數就可以了,公式如下:
特徵引數的最大似然估計值
現在我們已經計算出了每個特徵的最大似然估計值,就可以從每個特徵取值,組合到一起,得到新密碼!下圖是我們透過這個模型組合出來的10個密碼:
注意,模型生成了資料庫中原本沒有的密碼!(Ahyper777!,Apass10$...)
在下面的Google Colab連結中,你可以找到更多關於生成樸素貝葉斯模型的相關程式碼。
傳送門:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2657674/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 密碼生成密碼
- javascript隨機生成字串,可以用來生成隨機密碼JavaScript隨機字串密碼
- 生成密碼函式密碼函式
- python 無監督生成模型Python模型
- JS生成隨機密碼JS隨機密碼
- SSH實踐生成密碼密碼
- 無線Wifi密碼之暴力破解篇(WPA)WiFi密碼
- 使用 bcrypt 函式生成密碼函式密碼
- Linux 生成隨機密碼Linux隨機密碼
- 複雜密碼生成工具apg密碼
- 使用mkpasswd生成隨機密碼隨機密碼
- 生成式模型模型
- Linux 隨機生成密碼mkpasswdLinux隨機密碼
- 案例四:Shell指令碼生成隨機密碼指令碼隨機密碼
- 密碼生成常見的編碼規則密碼
- ruby指令碼,隨機生成複雜密碼指令碼隨機密碼
- linux 生成隨機密碼,uuidLinux隨機密碼UI
- 批量生成卡號密碼的php程式密碼PHP
- Linux下三個密碼生成工具Linux密碼
- 關於oracle18位密碼生成Oracle密碼
- 生成模型與判別模型模型
- ReplitLM: 開原始碼生成模型的新突破原始碼模型
- mybatis-generator-修改原始碼生成自己想要的程式碼MyBatis原始碼
- Linux 生成複雜密碼並且檢查密碼強度Linux密碼
- 根據字元型別和密碼長度隨機生成密碼字元型別密碼隨機
- 3種生成高強度密碼的方法密碼
- 使用命令列生成高強度密碼命令列密碼
- PHP生成隨機密碼的幾種方法PHP隨機密碼
- Cruddiy:無程式碼Bootstrap CRUD生成器boot
- Linux使用者登入密碼的生成Linux密碼
- 生成goldengate使用者的密碼暗文Go密碼
- Linux下三個有用的密碼生成工具Linux密碼
- 如何在 Linux 生成複雜密碼並且檢查密碼強度Linux密碼
- PowerDesigner: 利用sql指令碼檔案逆生成模型SQL指令碼模型
- 用ABAP 生成二維碼 QR Code
- 關於用java生成驗證碼Java
- 應用:隨機生成驗證碼隨機
- 使用GhostDoc為程式碼生成註釋文件