什麼是密碼雜湊函式(Cryptographic hash function)?

加密雜湊函式是一種可運用於個人資料夾或密碼上並產生驗證碼的演算法,主要用於驗證特定檔案的真實性,若兩個檔案的驗證碼相同,我們就可以推測該檔案是由同一個加密雜湊函式所生成的檔案。

MD5 和 SHA-1 是兩個最常用的加密雜湊函式。

加密雜湊函式經常被指稱為雜湊函式,技術上來說這不算正確,雜湊函式是一種包含加密雜湊函式與循環冗餘校驗等其他類別演算法的集合名詞。

加密雜湊函式實際應用範例

假設你下載了最新版本的火狐瀏覽器,但基於其他原因想從其他網站下載安裝檔,但又無法確認其他陌生網站釋出的檔案是否和官網相符,這時便可以透過 SHA-1 等類似的加密雜湊函式來計算出驗證碼數值,如果兩者相同,就可以判定該陌生網站的檔案和官網釋出的版本相符。

 

加密雜湊函式是否具有可逆性?

駭客透過彩虹表(rainbow table)來推測驗證碼的明碼,而彩虹表是種列出成千上萬,甚至上百萬、上億個驗證碼和與之相對明碼值的字典。

加密雜湊函式設計用於避免透過函式生成的驗證碼遭人逆反溯回原始字符的可能性。即便如此,仍然不代表它可以完全防護檔案免於侵襲。

雖然嚴格而言,這並不是真的可以逆轉加密雜湊函式的方法,但它仍給人非常輕易能破解的錯覺。實際上,由於彩虹表無法列出所有現存的驗證碼,因此僅能用來破解安全性較低的密碼。

下面則是使用 SHA-1 加密雜湊函數與其明碼的簡化版彩虹表圖例:

彩虹表範例
明碼 SHA-1 驗證碼
12345 8cb2237d0679ca88db6464eac60da96345513964
password1 e38ad214943daad1d64c102faec29de4afe9da3d
ilovemydog a25fb3505406c9ac761c8428692fbf5d5ddf1316
Jenny400 7d5eb0173008fe55275d12e9629eef8bdb408c1f
dallas1984 c1ebe6d80f4c7c087ad29d2c0dc3e059fc919da2

 

駭客必然可以得知何者才是正確的加密雜湊函數所對應的驗證碼與明碼數值。

為增加檔案防護性,有些可儲存用戶密碼的網站在加密雜湊函式演算法數值生成後和儲存用戶密碼前執行額外功能。這個過程會產生另一個只有該網頁伺服器能夠讀取並與原始驗證碼相異的數值。

舉例來說,當密碼輸入並產生驗證碼後,這組密碼就會被拆成不同部分並重新排列存入密碼資料庫,或是字母順序相互對調。當下次需要登入驗證時,網頁伺服器就會反轉這個功能並再次生成原始驗證碼來確認用戶密碼是否正確。

當驗證碼遺失時,這些步驟就可以降低破解器成功率,因此若駭客得知了與以往不同的加密雜湊函式演算法時,即使掌握了密碼驗證碼也同樣意義不大。

 

密碼和加密雜湊函式

資料庫透過與彩虹表類似的模式儲存用戶密碼,當你輸入密碼便會生成一組驗證碼來比對你的過往歷史登入資料,若兩者相符則可以得到授權而登入。

誠如先前所提,加密雜湊函式會生成一組不可逆的驗證碼,但如果只是因為驗證碼在語言上不具任何意義,而將密碼複雜度降低並設定成像是12345的連續數列而不是12@345,這樣真的安全嗎?

下面則是兩組無法只透過查看驗證碼本身來破解的密碼

MD5 for 12345: 827ccb0eea8a706c4c34a16891f84e7b

MD5 for 12@34$5: a4d3cc004f487b18b2ccd4853053818b

乍看之下你可能會認為使用哪一組密碼都沒有關係,這前提在當駭客嘗試透過隨機猜測 MD5 驗證碼來取得密碼的時候的確可以成立,而且一般來說沒有人這樣做。但當駭客使用暴力攻擊或字典攻擊戰術時,可就沒這麼簡單了。

暴力攻擊是一種猜測密碼時會採用的戰術。在前面的例子當中,要猜到12345其實非常容易,但想猜對另一組數字就很難了。

字典攻擊就是暴力攻擊中的一個戰術,它透過從一組常見密碼清單中嘗試每一個英文單詞、數字、語句等來破解密碼,而12345剛好就是名單中的其中一個。

即使加密雜湊函式會生成破解難度高到難以猜測甚至是不可能破解的驗證碼,我們仍建議你在建立網路帳號時,提高登入密碼的複雜度。

 

關於加密雜湊函式的更多背景知識

加密雜湊函式看起來與加密有所關聯,但兩者運作方式差異甚大。

加密是將某檔案加密成為無法讀取狀態,並在解密後可正常使用的雙向過程。你可以將所有儲存的檔案加密來避免他人存取,或者將加密用於上傳或下載檔案上。

加密雜湊函式則無法透過生成一組特殊可逆的驗證碼來破解密碼,它唯一的用途就是在下載檔案、儲存密碼或從資料庫中拉取檔案時比對函式與驗證碼是否相符。

加密雜湊函式也可能在不同檔案間產出相同的驗證碼,這種情形稱之為碰撞。但發生這情況就和起初加密雜湊函式的用意背道而馳了。

碰撞發生的原因是因為加密雜湊函式會生成一組無視原字數多寡,英數混和字符長度固定的數列。

例如 MD5 加密雜湊函式會生成三個完全不同區段檔案的驗證碼827ccb0eea8a706c4c34a16891f84e7b, 1f633b2909b9c1addf32302c7a497983, 和 e10adc3949ba59abbe56e057f20f883e。

第一組是12345的驗證碼,第二則是超過700英數混和字符數列的驗證碼,最後是123456的驗證碼。這三組的原始數列長度都不同,但因為 MD5 的緣故,所產出都是固定32個字元的驗證碼。

由於只要原始數列內容有所變更,便會生成完全不同的驗證碼,因此可能生成的驗證碼數量並無相對限制。而單一加密雜湊函式可生成的驗證碼卻是有限的,我們永遠都可能遇到碰撞的情形。

這就是研發加密雜湊函式的初衷。而 MD5 生成固定長度32字元,英數混和數列,SHA-1數列長度為40字元,SHA-2 (512)則是128字元。驗證碼後的數字越大,發生碰撞的可能性就越低。