一步步學資料結構與演算法 20 雜湊演算法 上

2021-09-25 20:06:39 字數 1781 閱讀 7076

帶著問題來學習:

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 雜湊演算法,計算雜湊值非常耗時,如果要篡改乙個區塊,就必須重新計算該區塊後面所有的區塊的雜湊值,短時間內幾乎不可能做到。

一步步學資料結構與演算法 18 雜湊表 中

思路 何為乙個工業級的雜湊表?工業級的雜湊表應該具有哪些特性?結合學過的知識,我覺的應該有這樣的要求 1.支援快速的查詢 插入 刪除操作 2.記憶體占用合理,不能浪費過多空間 3.效能穩定,在極端情況下,雜湊表的效能也不會退化到無法接受的情況。方案 如何設計這樣乙個雜湊表呢?根據前面講到的知識,我會...

一步步學資料結構與演算法 10 遞迴

1.遞迴是一種非常高效 簡潔的編碼技巧,一種應用非常廣泛的演算法,比如dfs深度優先搜尋 前中後序二叉樹遍歷等都是使用遞迴。2.方法或函式呼叫自身的方式稱為遞迴呼叫,呼叫稱為遞,返回稱為歸。3.基本上,所有的遞迴問題都可以用遞推公式來表示,比如 f n f n 1 1 f n f n 1 f n 2...

一步步學ROS

最近因為看svo的 裡面用到catkin決定要好好看ros,年前學會基本操作。啟動節點 rosrun package name executable name 檢視節點 rosnode list 注 rosout 節點是乙個特殊的節點,通過 roscore 自動啟動 檢視特定節點的資訊 rosnod...