天天看點

日常開發中的salt和token是什麼?Token 的作用

所謂加Salt,就是加點“佐料”。當使用者首次提供密碼時(通常是注冊時),由系統自動往這個密碼裡加一些“Salt值”,這個值是由系統随機生成的,并且隻有系統知道。然後再散列。而當使用者登入時,系統為使用者提供的代碼撒上同樣的“Salt值”,然後散列,再比較散列值,已确定密碼是否正确。   

這樣,即便兩個使用者使用了同一個密碼,由于系統為它們生成的salt值不同,他們的散列值也是不同的。即便黑客可以通過自己的密碼和自己生成的散列值來找具有特定密碼的使用者,但這個幾率太小了(密碼和salt值都得和黑客使用的一樣才行)。      
假設你的資料庫已經被黑客拿到了。
比如 md5sum("123456") = "e10adc3949ba59abbe56e057f20f883e"
如果不用 salt ,直接 md5 的話,直接在你的資料庫裡搜尋後面那個值不就能找出所有密碼是"123456"的使用者了嗎?
要知道,黑客的目的其實并不是(或者說大多數時候不是)破解某一個人的密碼,而是擷取大量的使用者名/密碼對。
好了,現在你加了鹽,但鹽是固定的,比如直接寫死在代碼裡的,這樣行不行呢?這樣也是不行的,因為黑客仍然可以通過預先計算的方式來做。比如黑客黑了你的伺服器,看到了你的代碼,知道了你的鹽是 xxx ,于是他計算:
md5sum("123456xxx") = "e087dae60e744ea80722b785a75adbb7"
然後再到你的資料庫裡搜尋,又能得到大量密碼是 123456 的使用者了。

那該怎麼辦呢?
是以,不但要加鹽,而且每個使用者的鹽還得不一樣。我看到的一種做法是,直接用每個使用者的使用者名,或者使用者名的變形來做鹽。
      

Token 的作用

Token,就是令牌,最大的特點就是随機性,不可預測。一般黑客或軟體無法猜測出來。 那麼,Token有什麼作用?又是什麼原理呢? Token一般用在兩個地方:
  • 1)防止表單重複送出、
  • 2)anti csrf攻擊(跨站點請求僞造)。

兩者在原理上都是通過session token來實作的。當用戶端請求頁面時,伺服器會生成一個随機數Token,并且将Token放置到session當中,然後将Token發給用戶端(一般通過構造hidden表單)。下次用戶端送出請求時,Token會随着表單一起送出到伺服器端。

然後,如果應用于“anti csrf攻擊”,則伺服器端會對Token值進行驗證,判斷是否和session中的Token值相等,若相等,則可以證明請求有效,不是僞造的。

不過,如果應用于“防止表單重複送出”,伺服器端第一次驗證相同過後,會将session中的Token值更新下,若使用者重複送出,第二次的驗證判斷将失敗,因為使用者送出的表單中的Token沒變,但伺服器端session中Token已經改變了。

上面的session應用相對安全,但也叫繁瑣,同時當多頁面多請求時,必須采用多Token同時生成的方法,這樣占用更多資源,執行效率會降低。是以,也可用cookie存儲驗證資訊的方法來代替session Token。比如,應對“重複送出”時,當第一次送出後便把已經送出的資訊寫到cookie中,當第二次送出時,由于cookie已經有送出記錄,是以第二次送出會失敗。

不過,cookie存儲有個緻命弱點,如果cookie被劫持(xss攻擊很容易得到使用者cookie),那麼又一次gameover。黑客将直接實作csrf攻擊。

是以,安全和高效相對的。具體問題具體對待吧。

繼續閱讀