[Security] 雜湊不是加密,雜湊不是加密,雜湊不是加密。

在標題上連續寫三次,實在是因為太多人把雜湊當加密看待,不只是錯得離譜,還有可能會害到客戶。

不曉得聽了多少次,就算持續在各個地方導正,還是會有很多人把雜湊和加密混在一起,認為雜湊就是加密,但其實這兩者的本質差很大,有多大?無法形容的大。

讓我們先來了解什麼叫加密 (Encryption):

在密碼學中,加密(英語:Encryption)是將明文資訊改變為難以讀取的密文內容,使之不可讀。只有擁有解密方法的對象,經由解密過程,才能將密文還原為正常可讀的內容。

如同這句話所說的,加密是用來將重要資料保護起來,不能讓其他人看到,只能由指定的,你允許看的人才能看到正常的內容,其他人看到的則是不知所云的內容。因此,如何讓指定的人才能看到是加密的重點,為了要讓加密過的資料能夠還原,必須要有一套解密的流程,但最終目的是讓資料是可以還原的 (Restorable),至於加密與解密的流程,則是交由加解密演算法 (Encryption/Decryption Algorithm) 處理,而且也依解密的關鍵 (Key) 不同而分成對稱式加解密演算法 (Symmetric Algorithm) 以及非對稱式加解密演算法 (Asymmetric Algorithm),差別只在於取得金鑰 (Key) 的方法而己。

然而,不是所有的資料都需要經由加解密處理,有些資料是不應該被還原的,只需要經由一道程序去驗證你得到的資料是正確的即可,這種需求的只要目標是確認資料的特徵 (Attribute),而不是資料的本身,像是有人傳給你一個檔案,但如何知道檔案在中間沒有被任何人竄改過,就需要由開始傳遞的那個人 (基本上都是原創者) 提供檔案的摘要 (Digest),不需要全部的檔案內容,只要依照一道程序去計算拿到的檔案和一開始傳遞給你的人所提供給你的摘要是一致的,這樣就可以確認在檔案傳送過程中沒有被任何人改過 (因為改過的話,會得到不同的摘要,目前的演算法已做到只動一個 byte 也會產生不同的摘要值),這也是為什麼像一些知名的軟體要在官方下載點提供一些檢查碼 (也就是摘要值) 的原因,只要使用相同的摘要計算程序,就可以拿到相同的摘要值。

了解了摘要的用意後,就可以來看雜湊 (Hashing) 的定義了。

由一串資料中經過雜湊演算法(Hashing algorithms)計算出來的資料指紋(data fingerprint),經常用來識別檔案與資料是否有被竄改,以保證檔案與資料確實是由原創者所提供。

雜湊是一個由資料本體中計算出資料摘要的技術,它所得到的資料只能證明在計算當下,針對資料本體所得到的特徵,日後如果要檢驗資料本體是否有被異動,只要用相同的計算方式重新針對資料跑一次,若得到了相同的特徵,表示資料沒有被改動過,但它無法得到資料本體,也就是無法由摘要或特徵去反算出本體的長相,就像是你知道帥哥或正妹的特徵,但是沒辦法完全對應到某個帥哥或某個正妹一樣。

而雜湊的這個特性,相當適合用在密碼 (Password) 的保護上,因為密碼基本上只有那個使用者才知道,在第一次建立使用者帳戶時,系統只要依照使用者所輸入的密碼,計算出摘要值並儲存起來後,只要下一次使用者再次輸入密碼,如果密碼 (資料本體) 和當初輸入的密碼不同時,那麼產生出的摘要值一定也會不同,從而判斷是否為同一個使用者,因此基於雜湊所建立的密碼系統,理論上是不會被破解的,因為無法由摘要值去反推回使用者真正的密碼。但是,目前也有很多手法在試圖破解,例如暴力破解法、彩虹表法等,對於較弱的雜湊系統也有相當的威脅,不可不慎。

雜湊雖然無法回推資料本體,但就驗證資料正確性而言,仍然有很多研究在於如何讓雜湊演算法在不同的資料上產生相同的摘要值,這個現象稱為碰撞 (Collision),雜湊演算法的破解是以是否會產生碰撞為主,若能夠讓一個雜湊演算法輸入不同的資料而能產生相同的摘要的話,表示該雜湊演算法已經被破解而不安全,因此目前像 MD4, MD5, SHA1 這些演算法都已經被研究出碰撞的方法,原則上是不能再使用了,要替換成較高強度如 SHA-2 系列與 SHA-3 系列的雜湊演算法。

在保護密碼的技術上,加密與雜湊確實是為了同一個目的:保護資料而設計,但加密是可逆的,雜湊是不可逆的,因此請不要再把雜湊當加密了,雜湊本身基本上不具加密功能,它只能算是具有確認資料正確性的功能,只是因為密碼多半是記憶在人的腦袋,因此除非未來有技術能夠將人腦的記憶直接輸出,否則人腦目前還是無法破解的 (當然讓人自己講出來的那種就...)。