科普 | 什麼是雜湊演算法

買賣虛擬貨幣

咱們作為非計算機專業的人去看一些區塊鏈相關的技術資料的時候,經常會被一些討厭的術語擋在門外。這次咱們聊的雜湊就是非常重要的一個。雜湊是密碼學的基礎,理解雜湊是理解數字簽名和加密通訊等技術的必要前提。

基本含義

先來從基本定義入手。雜湊,英文是 hash ,本來意思是”切碎並攪拌“,有一種食物就叫 Hash ,就是把食材切碎並攪拌一下做成的。雜湊函式的運算結果就是雜湊值,通常簡稱為雜湊。雜湊函式有時候也翻譯做雜湊函式。

根據維基百科的定義,雜湊函式要做的事情是給一個任意大小的資料生成出一個固定長度的資料,作為它的對映。所謂對映就是一一對應。一個可靠的雜湊演算法要滿足三點。第一是安全,給定資料 M 容易算出雜湊值 X ,而給定 X 不能算出 M ,或者說雜湊演算法應該是一個單向演算法。第二是獨一無二,兩個不同的資料,要擁有不相同的雜湊。第三是長度固定,給定一種雜湊演算法,不管輸入是多大的資料,輸出長度都是固定的。但是仔細想一下,如果雜湊的長度是固定的,也就是取值範圍是有限的,而輸入資料的取值範圍是無限的,所以總會找到兩個不同的輸入擁有相同的雜湊。所以,雜湊函式的安全性肯定是個相對概念。如果出現了兩個不同輸入有相同輸出的情況,就叫碰撞,collision 。不同的雜湊演算法,雜湊位數越多,也就基本意味著安全級別越高,或者說它的”抗碰撞性“就越好。

再來說說雜湊函式的主要作用。雜湊的獨一無二性,保證瞭如果資料在儲存或者傳輸過程中有絲毫損壞,那麼它的雜湊就會變。雜湊函式的最常見的一個作用就是進行完整性校驗( Integrity Check ),完整的意思是資料無損壞。雜湊有很多不同的稱呼,有時候叫 Digest 摘要,有時候叫 Checksum 校驗值,有時候叫 Fingerprint 指紋,其實說的意思差不多,也就是說雜湊可以用來代表資料本身。例如朋友給我傳遞一份資料,傳完之後,我有一份,他手裡也有一份,如果兩份資料的雜湊值是一樣的,那麼這兩份資料的內容就是一樣的,或者說可以認為傳遞過程中資料沒有損壞,我手裡拿到的資料是完整的。

所以說,雜湊函式的基本作用就是給大資料算出一個摘要性的長度固定的字串,也就是所謂的雜湊。雜湊的作用主要是進行完整性校驗。

雜湊演算法的分類

下一步我們把雜湊函式分類,更細緻的聊聊雜湊演算法的特點。首先說雜湊演算法有很多種,例如 md5 ,sha256 等等,但是它們總體上可以分為兩大類,一類是普通雜湊,另外一類是加密雜湊,cryptographic hash function 。

業界可以找到的雜湊演算法是有很多種的。我們可以大致按照輸出的雜湊的長度來聊,雖然雜湊演算法的安全性也不單單是跟雜湊長度有關,但是一般雜湊值越長也就是越安全。例如 CRC-32 的輸出是32 bit,也就是32位的二進位制數,表示成十六進位制就是8位。MD5 演算法的雜湊是32位16進位制數,比較常見。SHA-256是256個 Bit ,十六進位制表示就是64位。這些演算法可以分成普通雜湊和加密雜湊演算法,兩種演算法之間沒有特別明顯的區別。例如本來 MD5 就是設計出來做加密雜湊的,但是後來由於計算機的發展 MD5 出現碰撞的可能性就很大了,所以目前 MD5 只能當普通雜湊用,用來做資料校驗。加密雜湊跟普通雜湊的區別就是安全性,一般原則是隻要一種雜湊演算法出現過碰撞,就會不被推薦成為加密雜湊了,只有安全度高的雜湊演算法才能用作加密雜湊。同時加密雜湊其實也能當普通雜湊來用,Git 版本控制工具就是用 SHA-1 這個加密雜湊演算法來做完整性校驗的。一般來講越安全的雜湊演算法,處理速度也就越慢,所以並不是所有的場合都適合用加密雜湊來替代普通雜湊。

在密碼學領域,有兩個演算法都是把資料做輸入,而輸出是一段誰也看不懂的資料。其中一個就是雜湊演算法,另外一個是加密演算法。注意,雜湊演算法和加密演算法是完全不同的。首先雜湊演算法的輸出長度是固定的,而加密演算法的輸出長度是跟資料本身長度直接相關的,第二,雜湊是不可以逆向運算出資料的,而加密演算法的輸出是要能夠逆向運算出資料的。關於加密演算法,我們這裡就不展開聊了。Peter 這裡主要是強調加密雜湊演算法只是被用在加密過程中,但是它本身不是加密演算法。

總之,雜湊演算法有很多種,長度越長的演算法基本認為越安全。安全度低的雜湊演算法被認為是普通雜湊演算法,主要用來做完整性校驗。安全度高的被稱為加密雜湊演算法,會被用在加密演算法中。所謂的高低都是相對概念,例如 MD5 曾經屬於加密雜湊,但是目前只能用來做安全校驗了。而從2017年開始,SHA-1 演算法生成的加密證書也會被各大瀏覽器拒絕了。目前最流行的加密演算法是 SHA-2 ,但是跟 SHA-1 不同,SHA-2 不是一種演算法,而是一系列演算法的統稱,其中就包括咱們之前提過的 SHA-256 。

實用例子

說了這麼多基礎知識,最後一部分咱們聊聊雜湊在現實中的應用。

首先一個場景是網站註冊。當我們提交使用者名稱密碼的時候,使用者名稱被會直接儲存到網站的資料庫中,但是密碼卻不是直接儲存的,而是先把密碼轉換成雜湊,儲存到資料庫中的其實是雜湊。所以,即使是公司後臺管理人員,也拿不到使用者的密碼。這樣,如果萬一公司資料庫洩露了,使用者的密碼依然是安全的。而當使用者自己登入網站的時候,輸入密碼提交到伺服器,伺服器上進行相同的雜湊運算,因為輸入資料沒變,所以雜湊也不會變,登入也就成功了。

另外一個場景是區塊鏈和加密貨幣中。比特幣地址生成的時候,就用到了 SHA-256 演算法,POW 也就是工作量證明,用的也是這個演算法。

基本上凡是涉及到密碼學的地方,都會或多或少的用到雜湊函式。

總結

關於雜湊和雜湊函式,我們就聊到這裡,下面來總結幾句。雜湊的基本作用就是提供一個資料的摘要或者指紋,通常的使用場景就是完整性校驗。雜湊演算法有很多種,一般來講雜湊越長的演算法,安全性也就越高,安全度足夠高的雜湊,或者說沒有任何人能夠成功實現碰撞的雜湊,才有資格被考慮用在加密場合,而這類的雜湊演算法也被叫做加密雜湊演算法。實際中常見的雜湊演算法有 MD5 ,SHA-1 ,和 SHA-256 等等,其中 MD5 通常用來進行資料校驗,SHA-1 曾經是加密雜湊演算法,但是目前已經被除名,也只能做為一種安全度更高的校驗演算法了。SHA-256 依然是廣泛使用的加密雜湊演算法,在比特幣生成地址以及 POW 工作量證明演算法中都會用到。

參考:

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;