什麼是salt,token

前言:

  在JavaWeb平常實踐中,註冊功能是必不可少的,但一直用明文的方式去將密碼持久化進數據庫是很是不安全的,所以我找到了解決方法,那就是加密。

  而目前常見的就是md5加密,在以往的那些年md5加密確實很是實用,但依舊有破解的方法(有人說md5加密是不可逆的怎麼可能破解),答案就是海量數據的抓取的匹配,讓md5有變得不那麼安全,所以,鹽值md5加密出現了,下面就給你們說說什麼是salt,以及在作安全認證時常常碰到的token是什麼東西

 

一,什麼是salt

所謂加Salt,就是加點「佐料」。當用戶首次提供密碼時(一般是註冊時),由系統自動往這個密碼里加一些「Salt值」,這個值是由系統隨機生成的,而且只有系統知道。而後再散列。而當用戶登陸時,系統爲用戶提供的代碼撒上一樣的「Salt值」,而後散列,再比較散列值,已肯定密碼是否正確。   
這樣,即使兩個用戶使用了同一個密碼,因爲系統爲它們生成的salt值不一樣,他們的散列值也是不一樣的。即使黑客能夠經過本身的密碼和本身生成的散列值來找具備特定密碼的用戶,但這個概率過小了(密碼和salt值都得和黑客使用的同樣才行)。html

假設你的數據庫已經被黑客拿到了。 好比 md5sum("123456") = "e10adc3949ba59abbe56e057f20f883e" 若是不用 salt ,直接 md5 的話,直接在你的數據庫裏搜索後面那個值不就能找出全部密碼是"123456"的用戶了嗎? 要知道,黑客的目的其實並非(或者說大多數時候不是)破解某一我的的密碼,而是獲取大量的用戶名/密碼對。 好了,如今你加了鹽,但鹽是固定的,好比直接寫死在代碼裏的,這樣行不行呢?這樣也是不行的,由於黑客仍然能夠經過預先計算的方式來作。好比黑客黑了你的服務器,看到了你的代碼,知道了你的鹽是 xxx ,因而他計算: md5sum("123456xxx") = "e087dae60e744ea80722b785a75adbb7" 而後再到你的數據庫裏搜索,又能獲得大量密碼是 123456 的用戶了。 那該怎麼辦呢? 因此,不但要加鹽,並且每一個用戶的鹽還得不同。我看到的一種作法是,直接用每一個用戶的用戶名,或者用戶名的變形來作鹽。 數據庫

 

二,Token的做用

 

Token,就是令牌,最大的特色就是隨機性,不可預測。通常黑客或軟件沒法猜想出來。安全

那麼,Token有什麼做用?又是什麼原理呢?服務器

Token通常用在兩個地方:cookie

  • 1)防止表單重複提交、session

  • 2)anti csrf攻擊(跨站點請求僞造)。xss

二者在原理上都是經過session token來實現的。當客戶端請求頁面時,服務器會生成一個隨機數Token,而且將Token放置到session當中,而後將Token發給客戶端(通常經過構造hidden表單)。下次客戶端提交請求時,Token會隨着表單一塊兒提交到服務器端。
而後,若是應用於「anti csrf攻擊」,則服務器端會對Token值進行驗證,判斷是否和session中的Token值相等,若相等,則能夠證實請求有效,不是僞造的。
不過,若是應用於「防止表單重複提交」,服務器端第一次驗證相同事後,會將session中的Token值更新下,若用戶重複提交,第二次的驗證判斷將失敗,由於用戶提交的表單中的Token沒變,但服務器端session中Token已經改變了。post

上面的session應用相對安全,但也叫繁瑣,同時當多頁面多請求時,必須採用多Token同時生成的方法,這樣佔用更多資源,執行效率會下降。所以,也可用cookie存儲驗證信息的方法來代替session Token。好比,應對「重複提交」時,當第一次提交後便把已經提交的信息寫到cookie中,當第二次提交時,因爲cookie已經有提交記錄,所以第二次提交會失敗。
不過,cookie存儲有個致命弱點,若是cookie被劫持(xss攻擊很容易獲得用戶cookie),那麼又一次gameover。黑客將直接實現csrf攻擊。加密

因此,安全和高效相對的。具體問題具體對待吧。url

相關文章
相關標籤/搜索