早期也就是很早的時候,系統裏可能直接存的就是用戶的明文密碼,密碼是什麼就存什麼,而後每次校驗直接匹配就行了.後來人們開始使用哈希進行加密,獲得如今的廣泛使用的密文.算法
最簡單的基於密文的密碼存儲策略(一般多是MD5加密方式)就是我下面畫的圖:安全
哈希算法是一個單向的函數,將任意大小的數據轉換成統一長度的密文,而且沒法被反向計算.而且每一個不一樣數據經過哈希函數轉換成的結果都是不一樣的.數據結構
程序中真正比對的是密文哈希值,只有相同才被受權.不相同也不要告知究竟是用戶名錯誤仍是密碼錯誤,給出一個模糊的提示就行,防攻擊者在不知道密碼的狀況下,遍歷出可用的用戶名.函數
不是全部的哈希函數都是安全的,適用於加密的.有些哈希函數是用於哈希表這類數據結構,方便快速查找的.適用於加密的有相似於:SHA256,SHA512,RipeMD之類的哈希函數.性能
最後要說明,單純的哈希加密太容易破解了,從目前的情況看它並不安全.網站
之因此說單純的哈希加密並不安全由於破解的方式有不少,鑑於如今計算機性能(CPU發展已經到了一個瓶頸,如今普通的筆記本性能幾乎就是20年前的超級計算機)的提高以及黑客技術的進步,不少網站都提供了破解哈希的功能.下面列舉出一些經常使用的破解方式:
加密
暴力破解(這是不可阻止的破解方式之一,在給定長度的狀況下嘗試各類字符的組合,雖然效率很是低,但經過遍歷最終必定會獲得密碼,至關於把全部的可能都嘗試一遍)spa
字典攻擊(一樣是不可阻止的破解方式之一,至關於暴力破解的升級版,經過收集經常使用的單詞,詞組,密碼而後將全部的都存儲起來,根據這些更加接近的數據進行比對,碰運氣去猜)ip
查表法(預先計算密碼字典中得每一個密碼,而後把哈希值和對應密碼存儲到一個快插查詢的數據結構中,之後就查詢這個表就好了)字符串
彩虹表(這纔是大殺器,說白了就是把必定長度的明文密碼以及對應的哈希密碼都存儲下來,而後按照查表法的方式進行破解)
咱們上面說到的幾種破解方式都是基於一個最基本的原則,全部密碼都以相同的方式進行哈希加密.也就是說若是兩個帳號明文密碼相同,他們哈希後獲得的密文也是相同的.若是咱們能經過一些'小手段'讓它們不一樣,那麼破解的難度就是指數級的倍增了.
具體的作法就是在密碼中加入一段"隨機化"的字符串,而後再進行哈希化.這樣就將原來的一樣明文映射到一樣密文的規則打亂了,其中混入的'隨機'字符串就是所謂的'鹽'.
這些思想都不復雜,可是在真正的工做中大多數人仍是會犯下一些"錯誤",使咱們的料加的並很差,好比:
"鹽值"的長度過短(一般要和密文長度同樣才行)或者"鹽值"出現重複
哈希函數進行嵌套或者組合使用(很是重要的一點,別相信本身發明的某種加密方式,使用由密碼學家研究出來的標準算法)
儘可能避免使用已通過時或者低端的哈希函數,例如: MD5,SH1等,推薦SH256,SH512等等.
"鹽值"的產生並非一個隨意的rand()函數,要使用基於加密的僞隨機函數生成器,更加高度的隨機性.