[一步步學數據結構與算法 20]-哈希算法(上)

帶着問題來學習:
1.如何防止數據庫中的用戶信息被脫庫?
2.你會如何存儲用戶密碼這麼重要的數據嗎?僅僅 MD5 加密一下存儲就夠了嗎?
3.在實際開發中,我們應該如何用哈希算法解決問題?

一、什麼是哈希算法?

1.定義
將任意長度的二進制值串映射成固定長度的二進制值串,這個映射的規則就是哈希算法,而通過原始數據映射之後得到的二進制值串就是哈希值。
2.如何設計一個優秀的哈希算法?
①單向哈希:
從哈希值不能反向推導出哈希值(所以哈希算法也叫單向哈希算法)。
②篡改無效:
對輸入敏感,哪怕原始數據只修改一個Bit,最後得到的哈希值也大不相同。
③散列衝突:
散列衝突的概率要很小,對於不同的原始數據,哈希值相同的概率非常小。
④執行效率:
哈希算法的執行效率要儘量高效,針對較長的文本,也能快速計算哈希值。

二、哈希算法的常見應用有哪些?

7個常見應用:安全加密、唯一標識、數據校驗、散列函數、負載均衡、數據分片、分佈式存儲。
1.安全加密
①常用於加密的哈希算法:
MD5:MD5 Message-Digest Algorithm,MD5消息摘要算法
SHA:Secure Hash Algorithm,安全散列算法
DES:Data Encryption Standard,數據加密標準
AES:Advanced Encryption Standard,高級加密標準
②對用於加密的哈希算法,有兩點格外重要,第一點是很難根據哈希值反向推導出原始數據,第二點是散列衝突的概率要小。
③在實際開發中要權衡破解難度和計算時間來決定究竟使用哪種加密算法。
2.唯一標識
通過哈希算法計算出數據的唯一標識,從而用於高效檢索數據。
3.數據校驗
利用哈希算法對輸入數據敏感的特點,可以對數據取哈希值,從而高效校驗數據是否被篡改過。
4.散列函數
散列函數中用到的哈希算法更加關注散列後的值能不能平均分佈,以及散列函數的執行快慢。

三、思考

1.如何防止數據庫中的用戶信息被脫庫?你會如何存儲用戶密碼這麼重要的數據嗎?
①使用MD5進行加密
②字典攻擊:如果用戶信息被“脫庫”,黑客雖然拿到的是加密之後的密文,但可以通過“猜”的方式來破解密碼,這是因爲,有些用戶的密碼太簡單。
③針對字典攻擊,我們可以引入一個鹽(salt),跟用戶密碼組合在一起,增加密碼的複雜度。
④除了hash+salt,現在大多公司都採用無論密碼長度多少,計算字符串hash時間都固定或者足夠慢的算法如PBKDF2WithHmacSHA1,來降低硬件計算hash速度,減少不同長度字符串計算hash所需時間不一樣而泄漏字符串長度信息,進一步減少風險。
2.現在,區塊鏈是一個很火的領域,它被很多人神祕化,不過其底層的實現原理並不複雜。其中,哈希算法就是它的一個非常重要的理論基礎。你能講一講區塊鏈使用的是哪種哈希算法嗎?是爲了解決什麼問題而使用的呢?
區塊鏈是一塊塊區塊組成的,每個區塊分爲兩部分:區塊頭和區塊體。
區塊頭保存着 自己區塊體 和 上一個區塊頭 的哈希值。
因爲這種鏈式關係和哈希值的唯一性,只要區塊鏈上任意一個區塊被修改過,後面所有區塊保存的哈希值就不對了。
區塊鏈使用的是 SHA256 哈希算法,計算哈希值非常耗時,如果要篡改一個區塊,就必須重新計算該區塊後面所有的區塊的哈希值,短時間內幾乎不可能做到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章