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