網站密碼加密原理(初級篇)javascript
——致CSDN們php
我原本不想寫這麼初級的文章,可是發生了CSDN這當子事情以後,我還得真得寫點入門級的文章,給大家科普科普。java
第一:什麼是密碼。通俗地講,密碼就是進入一道門的鑰匙。而之因此咱們能找到咱們要進入的門,靠的是門牌號。那麼門牌號就是用戶名。不知道我這麼講,大家能不能聽明白。鑰匙就是帶鋸齒的小鐵片,插到一個鐵作的洞洞裏,若是恰好吻合,旋轉一下,就卡擦一聲,打開了。簡單吧。打開了門,就發生了人類說不完的故事。算法
可是人類發明了鑰匙和鎖以來,歷來沒有破解不了的鎖。這也算是鎖的悲哀。數據庫
一般咱們從商店裏買來的鎖帶有3把鑰匙,而鎖廠是不能留下一個備份的。但是,如今的情形不是這樣子,CSDN給咱們每人一把鑰匙,而且很好心地爲每一個用戶保存了一個鑰匙的備份。遺憾的是,CSDN把一長串的鑰匙搞丟了,並且每把鑰匙上還有咱們的住址門牌號。CSDN實際上是鎖,鑰匙不能和鎖放在一塊兒,這是最基本的常識。鎖只知道本身的洞洞的形狀,但不該該知道鑰匙的形狀。鎖當感受有東西插入本身的身體的時候,無論這東西是真的鑰匙,仍是火柴桿,若是鎖以爲爽,就卡的開了。原理就這麼簡單。爲了保證不論是真的鑰匙,仍是火柴棍,只要鎖感受爽,就必定要打開這個原則,鎖是經過比較一串字節碼來肯定本身是否爽,這也很容易理解,真的鑰匙會觸到她的癢癢肉——李銀河老師叫它G點——還不明白就問蒼老溼。這串字節碼就是鑰匙上的鋸齒。鑰匙上的鋸齒理論上是毫無規則的。那麼,比較這個字節碼是否一致就是鎖感知鑰匙的過程。鎖總要有憑據來驗證鑰匙對不對。對於CSDN的實現來說,它們簡單地複製了一份鑰匙拴在鎖上,而後把用戶插進來的那個鑰匙和本身的進行比較。這種作法是不對的,錯就錯在:鎖若是丟了,連帶鑰匙也丟了。你見過誰家把鎖和鑰匙放一塊兒的嗎?服務器
第二:MD5。
數學家提供給咱們許多很巧妙的算法,用來解決鑰匙齒的生成問題,它們都遵循下面4個定律:session
Rule-1)若是輸入一堆東西,不論是什麼,無論多少,總對應一個固定大小的輸出(鑰匙齒)ide
Rule-2)若是輸入不一樣,那麼輸出就必定不一樣(或者在極小的機率內相同)。函數
Rule-3)若是輸入相同,那麼輸出就必定相同。
網站
Rule-4)若是輸入有一丁點不一樣,好比輸入2頭驢,其中一頭僅僅比另外一頭多了一根毛,那麼輸出就大相徑庭。
例如:
輸入一本書--->MD5--->輸出一串固定長度的數字,如132234532495435343243245
輸入一個太陽--->MD5--->輸出一串固定長度的數字,如9384845739237439254357439
輸入一個銀河系--->MD5--->輸出一串固定長度的數字,如675454365464564354656334
巧妙吧。可是從輸出,不管如何咱們也不能獲得輸入的是什麼。
其中一個算法就是MD5。MD5處理輸入的過程有人叫加密,有人叫簽名。無論怎麼稱呼,都是不能根據輸出來破解出輸入的。理論上的確存在輸入一隻狗和一隻航天飛機,獲得的輸出結果確是同樣的情形,這種特例就和你不當心用黃瓜打開了一把鎖的機率差很少。
考慮把輸入當成密碼的原文,而鎖只保存MD5的輸出結果,這樣,用戶在客戶端頁面輸入密碼以後,當即被MD5成固定長度的輸出,而後把這個輸出發送到 CSDN那裏,CSDN爲每一個用戶保存了一個密碼的MD5輸出,經過比較這個輸出,就知道是否是密碼匹配了。若是CSDN保存的是MD5的輸出。那麼這次泄密的後果會小的多。由於咱們沒法從輸出獲得輸入,也就沒法知道密碼。而存放明文密碼是嚴厲禁止的。CSDN搞的跟「受害」者似的,其實「受害」的是用戶。
第三:僅僅保存密碼的MD5的輸出仍是不夠的。
不少狀況下,不少人設置的密碼是相同的。那麼相同的密碼MD5處理獲得的輸出定長字符串就必定是同樣的(Rule-3)。這給惡意的人猜中密碼的機會。因此還須要加點佐料,讓任何的輸入都不同,這個佐料咱們稱它爲Salt——鹽,不一樣的鹽被加入到密碼裏攪拌,這樣任何的輸入就不一樣了。對於用戶名——密碼的情形,這個鹽就是隨機生成的字符串或數字而已。這樣CSDN在用戶的驗證數據庫中至少要保存密碼加了鹽以後的MD5值,固然也要保存鹽值。用戶登陸的過程就變成:
1)***用戶輸入用戶名和驗證碼,向CSDN發送登陸請求
2)CSDN檢查驗證驗,而後根據用戶名到數據庫裏找到用戶存儲的鹽返回給用戶(驗證碼錯誤是不能返回鹽的)
3)用戶輸入密碼,而後在網頁客戶端用javascript把鹽撒到用戶的密碼上,攪拌,而後MD5,獲得輸出
4)用戶發送這個輸出給CSDN——passport服務器
5)服務器把用戶提交的MD5輸出直接和數據庫中存儲的輸出值作是否相等比較,一致就經過,不一致就拒絕。
***之因此強調用戶首先輸入驗證碼,是防止模擬自動機自動登陸。遺憾的是目前CSDN的登陸流程仍然存在問題,驗證碼竟然是輸入密碼以後纔出現的。
鹽是用來保證,即便有人把用戶數據庫的資料泄密了,別人也沒法輕易猜想出密碼來。沒有鹽的加入就會致使MD5值大量一致的狀況。
若是沒有鹽,當我剛好知道本身的密碼的MD5剛好和她的密碼的MD5值同樣,而個人密碼是iloveu,那麼她的密碼必定就是iloveu。有了鹽,即便我知道她的鹽,由於MD5出來的差別大不一樣(Rule-4),因此我也沒法知道她的密碼,即便咱們的密碼是同樣的。鹽是要確保每一個用戶都是不同的。通常的隨機算法或時間函數都能實現這一點。
鹽若是泄密了,***仍然可以經過窮舉法獲得咱們的密碼。方法是***使用與咱們相同的加鹽和攪拌方法,獲得MD5值。因此就引入了一次一密的登陸加密方法,一次一密不是咱們每次都要改登陸密碼,而是咱們每次登陸以後,鹽都是要從新計算,更新——我稱這個是醬油。這給***破解咱們的密碼增長了至關大的難度。我懷疑CSDN沒有引入這個醬油,最可能是加了碘鹽。
其實,***不須要知道咱們的密碼,它們只須要截斷消息,僞造session和消息,就能冒充咱們。所以對於網上銀行一類的網站,光有鹽和醬油仍是遠遠不夠的。這就牽扯了ssl,證書,key,短信,token等等一堆的東西。網站不但要驗證咱們,咱們也要驗證網站:對於用戶,你必須是我信賴的網站;對於網站,你必須是個人用戶。
第五:但願CSDN有鹽。若是有空就把醬油也加進去吧。
http://blog.chinaunix.net/space.php?uid=26567841&do=blog&id=3047743