1. 程式人生 > >雜湊(Hash)演算法

雜湊(Hash)演算法

一、什麼是 Hash 演算法

雜湊演算法(Hash Algorithm),又稱雜湊演算法,雜湊演算法,是一種從任意檔案中創造小的數字「指紋」的方法。與指紋一樣,雜湊演算法就是一種以較短的資訊來保證檔案唯一性的標誌,這種標誌與檔案的每一個位元組都相關,而且難以找到逆向規律。因此,當原有檔案發生改變時,其標誌值也會發生改變,從而告訴檔案使用者當前的檔案已經不是你所需求的檔案。

Hash 演算法能將將任意長度的二進位制明文對映為較短的二進位制串的演算法,並且不同的明文很難對映為相同的 Hash 值。

也可以理解為空間對映函式,是從一個非常大的取值空間對映到一個非常小的取值空間,由於不是一對一的對映,Hash 函式轉換後不可逆,意思是不可能通過逆操作和 Hash 值還原出原始的值。

雜湊方法的主要思想是根據結點的關鍵碼值來確定其儲存地址:以關鍵碼值K為自變數,通過一定的函式關係h(K)(稱為雜湊函式),計算出對應的函式值來,把這個值解釋為結點的儲存地址,將結點存入到此儲存單元中。檢索時,用同樣的方法計算地址,然後到相應的單元裡去取要找的結點。通過雜湊方法可以對結點進行快速檢索。雜湊(hash,也稱“雜湊”)是一種重要的儲存方式,也是一種常見的檢索方法。

二、Hash 演算法有什麼特點

Hash 值又稱為指紋或者摘要,具有以下特點:

  • 正向快速:給定明文和 Hash 演算法,在有限時間和有限資源內能計算得到 Hash 值。
  • 逆向困難:給定 Hash 值,在有限時間內很難逆推出明文。
  • 輸入敏感:原始輸入資訊發生任何變化,新的 Hash 值都應該出現很大變化。
  • 衝突避免:很難找到兩段內容不同的明文,使得它們的 Hash 值一致。

三、Hash 演算法有哪些

常見 Hash 演算法有 MD5 和 SHA 系列,目前 MD5 和 SHA1 已經被破解,一般推薦至少使用 SHA2-256 演算法。

下面我們來看具體寫一個 Hash 函式需要注意些什麼,首先要明白 Hash 函式是把一個大範圍對映到一個小範圍,目的往往是為了節省空間,使得資料容易儲存,另外 Hash 函式也會應用於查詢上。

四、Hash 演算法碰撞

稍微想一下就可以發現,既然輸入資料長度不固定,而輸出的雜湊值卻是固定長度的,這意味著雜湊值是一個有限集合,而輸入資料則可以是無窮多個,那麼建立一對一關係明顯是不現實的。所以“碰撞”是必然會發生的,所以一個成熟的雜湊演算法會有較好的抗衝突性,同時在實現雜湊表的結構時也要考慮到雜湊衝突的問題。

比如“666”經過 Hash 後是“fae0b27c451c728867a567e8c1bb4e53”,相同 Hash 演算法得到的值是一樣的。比如 WiFi 密碼如果是 8 位純數字的話,頂多就是 99999999 種可能性,破解這個密碼需要做的就是提前生成好 0 到 1 億數字的 Hash 值,然後做 1 億次布林運算(就是 Bool 值判斷,0 或者 1),而現在普通 I5 四核 CPU 每秒能到達 200 億次浮點數計算,做 1 億次布林運算也就是秒級別的時間就破解了。

所以密碼儘量不要用純數字,因為根本沒有任何安全性。

五、加鹽防碰撞

對數字內容進行 Hash 運算,獲取唯一的摘要值來指代原始完整的數字內容,利用 Hash 函式的抗碰撞性來確保內容未被篡改。

常用於使用者名稱和密碼來確保使用者資訊保安,為了防止攻擊會採用加鹽的方法,就是原來的明文加上一個隨機數之後的 Hash 值,Hash 值和鹽會儲存在兩個地方,只要不是同時洩漏就很難被破解。