一、介紹及原理
1.1 簡介
哈希算法(Hash)又稱摘要算法(Digest),它的作用是:對任意一組輸入數據進行計算,得到一個固定長度的輸出摘要。比如JAVA字符串的hashCode()就是哈希算法,輸出是固定的4字節(32位二進制數)int整數,以16進制(一位數表示為4位二進制)表示,因此表達為類似0x7a9d88e8這種八位數的形式,即32除以4等于8。當然不是所有輸出都會帶0x前綴,但是對我們看到輸出的字符串有 e、a、f 等字母就應該自然而然地想到是十六進制。
最簡單的哈希算法就是取模。
1.2 哈希算法特性
- 相同的輸入一定得到相同的輸出;
- 不同的輸入大概率得到不同的輸出。根據抽屜原理,輸入數據存在無限可能,而輸出有固定范圍,因此一定會存在不同輸入得到相同輸出的情況,即哈希碰撞,碰撞越多,算法越不可靠;
- 輸入數據(文件、字符串等)的細微變化能導致輸出的巨大變化;
- 不可以根據輸出值推導出輸入值,只能暴力破解;
- 執行效率高,哪怕輸入是長文本。
1.3 作用
哈希算法的目的就是為了驗證原始數據是否被篡改。
1.4 常見哈希算法
- SHA1
- SHA2,一系列算法的統稱,包括sha256等
- md5:現已不夠安全
二、如何解決哈希碰撞?
2.1 鏈地址法
三、應用
3.1 比較文件是否安全、完整
不如在一些官網下載軟件包,對應版本會有唯一一個哈希值,如下圖:
3.2 安全加密
比如加密用戶密碼。
不要在數據庫明文保存用戶密碼,防止內部人員或者黑客竊取。應該保存密碼的hash值,同時為了避免彩虹庫的碰撞,還應該給每個用戶密碼加不同的鹽(防止密碼相同用戶因為一個用戶密碼被破解而同時遭殃),即保存 hash(password +salt)計算后的值。
比如 HTTPS、CA 證書
3.3 區塊鏈
也可以歸為安全領域,但是值得單獨拿出來講述。
3.4 其它
這里就可以展開腦洞啦。
比如涉及到版權問題,比如圖片。根據文件內容的哈希值判斷是否是相同文件,修改文件名稱和時間沒有用,即使該文件在不同計算機間拷貝,哈希值的計算是針對文件流,即文件內容。
比如上傳大文件到百度網盤時,感覺是秒傳。
比如上傳大文件到服務端的斷點續傳(避免重復上傳)。