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