前兩天的文章分別介紹了編碼以及加密,還有一個概念也總是會被拿出來討論,也就是雜湊(Hashing),這三者都有各自的優缺點,而在實際上應用的時候也常常會用到不只一種概念。例如,昨天提到的 HTTPS 就使用到雜湊進行數位簽章,再透過非對稱式加密進行傳輸。因此常常會讓人搞不清楚他們的具體概念以及區別,那就先來講講雜湊是什麼吧!
Hashing 就是將我們所輸入的內容透過雜湊演算法轉換成固定長度(根據使用的 雜湊函數(Hash function) 決定)的輸出值(稱為哈希值)的過程。通常會被應用在資料結構、安全性或是對於資料進行驗證等方面。常見的雜湊函數有MD5、SHA-1、SHA-256等,以下是透過SHA-256進行轉換的例子:
以下為輸入的原文
Hello,world!
Hello,ithome!
透過SHA-256轉換後的結果分別如下(想自己玩看看可以去這個網站)
8bbd729be7e17f9f9ce0e8dea3ae8c016f9ca78a1c90b67eb17c6a108c363d86
8c44eba433e500097b6be7fc787f099dd8e9da3189e6749113414e31615ee6e6
從上面兩個例子可以看出,依據SHA-256這個雜湊函數轉換成的雜湊值,不管原文的內容長短,都會固定轉成256bit
的雜湊值。
計算速度快:為了確保系統在處理大量數據時能夠保持良好性能,並且不影響到安全性。
防竄改性(tamper-resistant):只要在原始的數據中進行更動,就算可能只是一個字元的變化,雜湊出來的值會是完全不同的,而只要透過驗證雜湊值是否相符就可以確認這個資料是否有經過變動。這也就是密碼學中的理想狀態,被稱為雪崩效應
(avalanche effect),以下是關於雪崩效應的一段敘述,引用自維基百科:
雪崩效應是指當輸入發生最微小的改變(例如,反轉一個位元)時,也會導致輸出的不可區分性改變(輸出中每個位元有50%的機率發生反轉)。合格密碼中,無論金鑰或明文的任何細微變化都必須引起密文的不可區分性改變。
防碰撞性(collision-resistant):是指在雜湊函數中,如果很難找到兩個不同的輸入訊息經過雜湊後產生相同的雜湊值,則該雜湊函數被認為具有防碰撞性。不過根據鴿籠原理(Pigeonhole Principle),只要輸入字串的可能性大於固定長度輸出的可能性,必定會出現碰撞的情形,因此可以透過使用強防碰撞性的算法,或是增加雜湊值長度等方法來加強。
就像昨天的文章所描述的,加密就像是透過鑰匙將文件鎖進提箱裡一樣,只要擁有密鑰的人,都可以透過密鑰得知文件的內容是什麼,這是一個可逆的過程,透過密鑰可以完成文件的加密以及解密。而雜湊則不同,可以試著想看看以下場景:
小明吃膩了外食,今天想要親自下廚,剛好昨天有跟上中華一番的直播台,於是小明決定效仿阿Q煮一道彈跳甲魚湯。按照食譜準備了甲魚、酸梅以及哈密瓜以後,小明就跟著步驟完成了彈跳甲魚湯的料理,如下圖所示,看起來好像很厲害(?
雜湊就像是料理的過程,將食材料理完後,無法再將這個料理恢復成原本食材的樣子,能夠驗證的只有同樣的文件(食材)按照這個雜湊函數(食譜)進行雜湊(料理)後,呈現的雜湊值(完成品)會是一樣的,這裡將廚藝白痴的情況排除在外。而雖然可以知道雜湊值(完成品)的樣子,可是無法據此推論出完整的配方是什麼,是一個不可逆
的過程。
p.s. 雖然有Rainbow table可以對照,不過這個是夠過預先計算大量可能的常見明文並加以雜湊來儲存結果的,並不是使用逆向推算的結果唷!
加密的主要目的是為了將機密文件進行保密,並確認只有特定的人可以看到這些機密文件的內容。而雜湊主要是用來驗證資料的完整性以及比對內容是否一致。
密碼在資料庫中的儲存:為了考量到用戶的資安問題,現在大部分的網站對於用戶密碼的儲存,都是將用戶密碼透過雜湊後將雜湊值存進資料庫中,並不會直接使用明文儲存,避免內部人員外流用戶密碼或是遭到駭客攻擊後密碼都直接外洩。這也是為什麼每次忘記密碼的時候,系統都會透過傳送驗證信讓我們重設密碼,而不是告訴我們原本的密碼是什麼,因為他們也不知道~
文件下載的驗證:有些網站會對於下載的文件提供雜湊值,使用者可以對於下載的文件進行驗證,避免下載的檔案版本可能遭到竄改或是損壞。例如:Ubuntu的下載網頁
點進去後有教學告訴你該如何進行驗證。
電子證書的驗證:法務部網站也有提供對於律師證書進行雜湊值比對,以驗證其證書是否是真實的,使民眾對於律師的信任能夠提升。
數位簽章:透過 HTTPS 協定傳送訊息前,先將訊息透過雜湊後產生雜湊值,再使用私鑰對於雜湊值進行加密,最後與原始訊息一起進行傳輸,接收方收到後就可以使用公鑰將訊息解密後,自己同時也將原始訊息進行雜湊,將兩者進行比對以確認正確性。
今天介紹了雜湊的一些特性,以及雜湊跟加密的區別,希望這三天的文章能讓跟我一樣分不清楚編碼、加密以及雜湊的人可以比較釐清他們之間的關係,那就明天見啦!
Hashing Algorithms and Security - Computerphile
雪崩效應
What is the significance of the avalanche effect in hash functions?
MDN