大家好,今天要來和大家聊聊雜湊函數是什麼東西
首先我必須先跟大家聲明:「雜湊不是加密!!!」
很多人都覺得雜湊是加密的一種,但其實完全不是!待各位看完這篇就會知道原因了
它是用來將「不同」長度的輸入,轉換成「相同」長度的輸出,其輸出叫做「雜湊值(hash value)
」
(Ex: aaa
和 bbccc
雜湊出來的位元數會一模一樣,不受原文長度影響)
雜湊函數有個很大的特性:它是「單向」、「不可逆」的
所以當訊息進行雜湊後,沒辦法將它的雜湊值還原回原本的訊息
:咦?那後續要怎麼去比對使用者輸入的值是不是正確的?
好問題,應該沒辦法?(被打
沒有啦!做做效果嘛,當然是可以去進行比對的
只要在使用者輸入密碼後,去進行雜湊,再和資料庫裡儲存的雜湊值做比對,就能知道是不是正確的
因為對相同的內容去做雜湊,其輸出的結果必定一樣(除非你是使用不同的雜湊函數進行雜湊)
所以兩個原文只要有「一個字
」不一樣,雜湊出來的結果就會差非常非常的多,因此不同的內容作相同的雜湊函數,得到相同輸出的機率非常的低
這裡我們使用SHA-256
來進行示範
可以看到,就算輸入的值長度變長,其雜湊值的長度也會保持不變,但雜湊出來的結果差非常非常的多(真的是非常)
也因為雜湊是「單向不可逆」的,運算結果也都長不一樣,所以目前只能使用暴力法(brute-force)
進行破解
但這樣每次都要從頭開始比對,實在是太浪費時間了,所以有人將雜湊出來的結果做成一張表,叫彩虹表(rainbow table)
前面有提到,「相同的值雜湊後都會得到相同的結果」,所以下次就可以直接查表,進行比對,藉此省下不少時間
但如果今天有兩個原文雜湊完,得到的雜湊值是相同的,就代表這個雜湊函數已被成功破解,使用它來進行雜湊非常的不安全,因為「其產生的雜湊值已再不是唯一值」
目前常見的雜湊函數有:
像現在最夯的虛擬貨幣,使用的是區塊鏈的原理,而區塊鏈就是使用雜湊函數進行運算,像比特幣(Bitcoin)
選擇的是SHA-256
,而以太幣(Ethereum)
是Keccak(SHA-3)
所以,雜湊函數到底是用來幹嘛的?為什麼連虛擬貨幣也有用到?
有些網站或論壇會提供原始檔案的hash值,讓你去比對自己下載的檔案hash值是不是一樣,不一樣就代表這個檔案有問題了!
那該怎麼看這個檔案的 hash 值呢?
這邊提供一個線上的雜湊工具給各位,大家有興趣可以去試試看
https://emn178.github.io/online-tools/sha256.html
它旁邊有很多種雜湊函數可以選擇,看你想試哪種的都可以
如果想看檔案的 hash 值,就點file hash
那排的雜湊函數,再拉檔案到Drop File Here
就好囉!
大家都知道,密碼用明文儲存在資料庫裡是一件非常危險的事
:可是有些人用明文存了10幾年都沒事阿,哪有這麼誇張
那可能是它剛好運氣好沒被hacker盯上吧,但我們不能有這種僥倖的心態!
這道理就跟建商蓋房子的時候偷工減料一樣,建商想說:「反正它一樣能幫你擋風擋雨擋太陽阿,我建材用海砂沒關係啦
」
如果都沒地震就算了,但一旦地震了呢?肯定是倒光光嘛,這樣會害多少無辜的人喪命,這後果你有辦法承擔?
所以這種事不發生就沒事,但發生了災情就會相當的嚴重,這個後果相信大家應該都不想賭吧?
因此我們要提早預防,「不怕一萬,只怕萬一
」
而這樣做的好處是:連系統開發方自己都不知道你的密碼
就算資料庫不小心遭到外洩,hacker 也是要費盡九牛二虎之力,才有辦法找出它的雜湊函數為何,並使用暴力法
破解成功
這也是尊重使用者的表現,代表只有使用者知道自己的密碼為何
:那這樣怎麼驗證密碼有沒有輸入正確?
我上面有講,你都沒在聽!
只要在使用者輸入密碼後,去進行雜湊,再和資料庫裡儲存的雜湊值做比對,就能知道是不是正確的
但只雜湊「密碼」還是有點不安全,因為 hacker 還是有可能透過暴力法
破解成功,所以延伸出一個更進階的用法,叫「加鹽」
這個加鹽不是媽媽炒菜的那種加鹽喔!但概念有點類似,就是「加了某樣東西進去調味」
什麼意思呢?在這裡的意思是指:「加點東西進去密碼裡,再對其進行雜湊」
而這個東西(鹽)可以是某個隨機值
,並在密碼裡的「任意固定位置
」插入,使得雜湊完的結果跟使用「原始密碼
」進行雜湊結果不相符
這樣即使 hacker 成功破解,得到的也不是「正確
」的明文密碼,而是「密碼和鹽
」混和的明文而已
而哪邊是鹽,哪邊是密碼,只有看過程式碼的人知道
如果 hacker 只成功破解資料庫,但沒取得程式碼,那他就只能用「猜」的方式猜鹽在哪
所以鹽最好要具有:「隨機產生、長度不固定、每個使用者皆使用不同鹽等特色在」
如果想提高鹽的破解難度,鹽的長度最好長一點,且使用特殊符號
,使它長的像一般的密碼
目前大部分的系統應該都是使用加鹽的方式儲存密碼(少部分除外),因為這種方式較為安全(但不是絕對安全)
萬一存鹽的資料庫也遭到破解,那就真的完拉完拉完拉 芭比Q拉
因此會建議鹽、雜湊函數、密碼
分開儲存,提高破解難度
加密「需要」金鑰,也可以透過「解密」取得明文,是「可逆」的
而雜湊「不需要」金鑰,也沒辦法透過「逆向」回推原始的內容,是「不可逆」的
大家會這麼容易把這兩個搞混,是因為它們常常被放在一起講,或拿來做使用
所以,雜湊真的不是加密法!
以上就是今天的介紹
希望大家看完能對雜湊(hash)更加了解