散列算法是單向函數(shù)。他們采用任何字符串并將其變成固定長(zhǎng)度的“指紋”,該指紋無(wú)法反轉(zhuǎn)。這意味著,如果數(shù)據(jù)庫(kù)中的數(shù)據(jù)受到破壞,則黑客無(wú)法很好地獲得用戶密碼,因?yàn)橛脩裘艽a從來(lái)沒(méi)有以哈希表的形式存儲(chǔ)在驅(qū)動(dòng)器上。使用哈希的網(wǎng)站通常具有以下工作流程:
1. 用戶創(chuàng)建一個(gè)帳戶
2. 他們的密碼被散列并存儲(chǔ)在數(shù)據(jù)庫(kù)中
3. 當(dāng)用戶嘗試登錄時(shí),將其輸入密碼的哈希值與數(shù)據(jù)庫(kù)中存儲(chǔ)的密碼進(jìn)行比較
4. 如果哈希匹配,則用戶可以訪問(wèn)該帳戶。
5. 如果不是,則會(huì)發(fā)回一般錯(cuò)誤消息,例如“輸入的無(wú)效憑據(jù)”,這樣黑客就無(wú)法將錯(cuò)誤具體跟蹤到用戶名或密碼。
hash("hello")=2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hellu")=3937f988aeb57b6fd75b9c71bf17b9658ec97823bab613df438389b0c896b724
hash("danny")=668e2b73ac556a2f051304702da290160b29bad3392ddcc72074fefbee80c55a
注意:僅安全或加密哈希函數(shù)可用于密碼哈希。
令人遺憾的是,僅對(duì)密碼進(jìn)行哈希加密并不能確保安全性。
破解哈希:蠻力和字典攻擊
解密哈希的最簡(jiǎn)單方法是猜測(cè)密碼。這樣做的方法是猜測(cè)用戶密碼,對(duì)猜測(cè)值進(jìn)行哈希處理,然后將其與您要解決的實(shí)際密碼的哈希值進(jìn)行比較。如果兩個(gè)哈希值匹配,則未加密的猜測(cè)版本就是正確的密碼。
一個(gè)蠻力攻擊經(jīng)歷給予一定的字符長(zhǎng)度的每一個(gè)可能的組合。即使他們最終會(huì)100%破解任何給定的密碼,但由于此方法的計(jì)算量很大,因此很難使用該方法。使用蠻力破解某些長(zhǎng)度甚至很短的密碼可能要花費(fèi)數(shù)千年的時(shí)間。
Tryingaaa:failed
Tryingaab:failed
Tryingaac:failed
...
Tryingacb:failed
Tryingacc:success
字典攻擊使用的文件包含可能是已使用密碼的常用單詞,短語(yǔ)或密碼。還有,你可以找到數(shù)據(jù)庫(kù)是按住頂部100000最常用的密碼。攻擊會(huì)對(duì)這些密碼進(jìn)行哈希處理,然后將哈希值與密碼進(jìn)行比較以破解。對(duì)于破解普通的JoeShmo來(lái)說(shuō),這有時(shí)是一個(gè)很好的使用方法,并且肯定比使用蠻力攻擊要快。
查找表可以通過(guò)預(yù)先計(jì)算哈希值來(lái)提高破解性能,因此,當(dāng)需要猜測(cè)密碼時(shí),程序無(wú)需花費(fèi)計(jì)算時(shí)間實(shí)際對(duì)猜測(cè)值進(jìn)行哈希處理。
在下一節(jié)中,我們將研究“鹽化”,這使這些破解方法無(wú)法可靠地使用。
查找表,字典攻擊和暴力攻擊之所以可以起作用的原因是,每次密碼都以相同的方式散列。我們可以通過(guò)在哈希之前或之后在密碼前添加一個(gè)稱為salt的隨機(jī)字符串來(lái)使哈希隨機(jī)化。
hash("hello")=2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hello"+"jHjdbJShdiodb")=6f7f167a978166ee23b32c9531ce5dc23ae8fc26e412045858d938d11470831f
鹽不必是秘密的,因?yàn)楣粽卟恢利}將是什么,因此無(wú)法為其創(chuàng)建預(yù)先計(jì)算的表。
注意事項(xiàng)
·對(duì)每個(gè)哈希密碼重復(fù)使用相同的鹽
·使用短鹽
·使用奇怪的雙哈希值(例如:hash(hash(hash(‘mypass’))))在鹽里
·使用加密安全的偽隨機(jī)數(shù)生成器生成隨機(jī)鹽
·為散列的每個(gè)密碼生成一個(gè)新的隨機(jī)唯一鹽
·產(chǎn)生長(zhǎng)鹽
鹽化工作流程
存儲(chǔ)密碼:
·用CSPRNG生成超長(zhǎng)鹽
·將鹽添加到用戶密碼中并進(jìn)行哈希處理
·將鹽和哈希值保存在數(shù)據(jù)庫(kù)中
檢查密碼:
·從數(shù)據(jù)庫(kù)中獲取鹽和哈希
·將鹽添加到提交的密碼之前并對(duì)其進(jìn)行哈希處理
·比較散列。如果它們相等,則密碼正確
注意:務(wù)必總是總是哈希在服務(wù)器上。有時(shí)未啟用JavaScript,并且哈希在客戶端不起作用。另外,沒(méi)有其他人可以訪問(wèn)服務(wù)器,因此請(qǐng)確保對(duì)服務(wù)器進(jìn)行哈希處理。
上述就是關(guān)于密碼哈希指南:如何確保數(shù)據(jù)庫(kù)安全的全部?jī)?nèi)容,想了解更多關(guān)于數(shù)據(jù)庫(kù)安全的信息,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。