iT邦幫忙

2022 iThome 鐵人賽

DAY 7
1
Security

做IT必備的資安觀念!手把手帶你攻防實戰系列 第 7

Day 7 : 觀念篇 - 密碼學裡的雜湊函數是什麼?它跟加密差在哪?

  • 分享至 

  • xImage
  •  

大家好,今天要來和大家聊聊雜湊函數是什麼東西

首先我必須先跟大家聲明:「雜湊不是加密!!!
很多人都覺得雜湊是加密的一種,但其實完全不是!待各位看完這篇就會知道原因了

雜湊函數(hash function,又稱雜湊演算法)

它是用來將「不同」長度的輸入,轉換成「相同」長度的輸出,其輸出叫做「雜湊值(hash value)
(Ex: aaabbccc 雜湊出來的位元數會一模一樣,不受原文長度影響)

雜湊函數有個很大的特性:它是「單向」、「不可逆」的
所以當訊息進行雜湊後,沒辦法將它的雜湊值還原回原本的訊息
https://ithelp.ithome.com.tw/upload/images/20220922/20141088DTdxoXd1dt.png

:咦?那後續要怎麼去比對使用者輸入的值是不是正確的?
好問題,應該沒辦法?(被打
/images/emoticon/emoticon03.gif

沒有啦!做做效果嘛,當然是可以去進行比對的
只要在使用者輸入密碼後,去進行雜湊,再和資料庫裡儲存的雜湊值做比對,就能知道是不是正確的

因為對相同的內容去做雜湊,其輸出的結果必定一樣(除非你是使用不同的雜湊函數進行雜湊)


所以兩個原文只要有「一個字」不一樣,雜湊出來的結果就會差非常非常的多,因此不同的內容作相同的雜湊函數,得到相同輸出的機率非常的低

這裡我們使用SHA-256來進行示範
可以看到,就算輸入的值長度變長,其雜湊值的長度也會保持不變,但雜湊出來的結果差非常非常的多(真的是非常)

也因為雜湊是「單向不可逆」的,運算結果也都長不一樣,所以目前只能使用暴力法(brute-force)進行破解
但這樣每次都要從頭開始比對,實在是太浪費時間了,所以有人將雜湊出來的結果做成一張表,叫彩虹表(rainbow table)

前面有提到,「相同的值雜湊後都會得到相同的結果」,所以下次就可以直接查表,進行比對,藉此省下不少時間
https://ithelp.ithome.com.tw/upload/images/20220923/20141088Fh1lVtAYxk.png


但如果今天有兩個原文雜湊完,得到的雜湊值是相同的,就代表這個雜湊函數已被成功破解,使用它來進行雜湊非常的不安全,因為「其產生的雜湊值已再不是唯一值

目前常見的雜湊函數有:

  • MD5(已被破解)
  • SHA-1(已被破解)
  • SHA-256
  • SHA-384
  • SHA-512
  • Keccak(2015年已改名為SHA-3)

像現在最夯的虛擬貨幣,使用的是區塊鏈的原理,而區塊鏈就是使用雜湊函數進行運算,像比特幣(Bitcoin)選擇的是SHA-256,而以太幣(Ethereum)Keccak(SHA-3)


用途

所以,雜湊函數到底是用來幹嘛的?為什麼連虛擬貨幣也有用到?

1. 它可以用來驗證檔案內容是否正確,有沒有被hacker毀損、加料過(ex:惡意程式)

有些網站或論壇會提供原始檔案的hash值,讓你去比對自己下載的檔案hash值是不是一樣,不一樣就代表這個檔案有問題了!

那該怎麼看這個檔案的 hash 值呢?
這邊提供一個線上的雜湊工具給各位,大家有興趣可以去試試看
https://emn178.github.io/online-tools/sha256.html

它旁邊有很多種雜湊函數可以選擇,看你想試哪種的都可以
https://ithelp.ithome.com.tw/upload/images/20220923/20141088fLNXeMu9UO.png

如果想看檔案的 hash 值,就點file hash那排的雜湊函數,再拉檔案到Drop File Here就好囉!
https://ithelp.ithome.com.tw/upload/images/20220923/20141088qwqqEAOHLk.png


2. 避免重要資訊使用明文儲存(ex:使用者密碼)

大家都知道,密碼用明文儲存在資料庫裡是一件非常危險的事

:可是有些人用明文存了10幾年都沒事阿,哪有這麼誇張
那可能是它剛好運氣好沒被hacker盯上吧,但我們不能有這種僥倖的心態!
/images/emoticon/emoticon15.gif

這道理就跟建商蓋房子的時候偷工減料一樣,建商想說:「反正它一樣能幫你擋風擋雨擋太陽阿,我建材用海砂沒關係啦
如果都沒地震就算了,但一旦地震了呢?肯定是倒光光嘛,這樣會害多少無辜的人喪命,這後果你有辦法承擔?
https://ithelp.ithome.com.tw/upload/images/20220923/20141088UQVNZTMrha.jpg

所以這種事不發生就沒事,但發生了災情就會相當的嚴重,這個後果相信大家應該都不想賭吧?
因此我們要提早預防,「不怕一萬,只怕萬一


而這樣做的好處是:連系統開發方自己都不知道你的密碼
就算資料庫不小心遭到外洩,hacker 也是要費盡九牛二虎之力,才有辦法找出它的雜湊函數為何,並使用暴力法破解成功

這也是尊重使用者的表現,代表只有使用者知道自己的密碼為何


:那這樣怎麼驗證密碼有沒有輸入正確?
我上面有講,你都沒在聽!

只要在使用者輸入密碼後,去進行雜湊,再和資料庫裡儲存的雜湊值做比對,就能知道是不是正確的

但只雜湊「密碼」還是有點不安全,因為 hacker 還是有可能透過暴力法破解成功,所以延伸出一個更進階的用法,叫「加鹽

加鹽(Salt)

這個加鹽不是媽媽炒菜的那種加鹽喔!但概念有點類似,就是「加了某樣東西進去調味

什麼意思呢?在這裡的意思是指:「加點東西進去密碼裡,再對其進行雜湊
而這個東西(鹽)可以是某個隨機值,並在密碼裡的「任意固定位置」插入,使得雜湊完的結果跟使用「原始密碼」進行雜湊結果不相符
https://ithelp.ithome.com.tw/upload/images/20220923/201410882XwCendBSi.png

這樣即使 hacker 成功破解,得到的也不是「正確」的明文密碼,而是「密碼和鹽」混和的明文而已

而哪邊是鹽,哪邊是密碼,只有看過程式碼的人知道

如果 hacker 只成功破解資料庫,但沒取得程式碼,那他就只能用「猜」的方式猜鹽在哪
https://ithelp.ithome.com.tw/upload/images/20220923/20141088yshZxlJ0Vp.jpg

所以鹽最好要具有:「隨機產生、長度不固定、每個使用者皆使用不同鹽等特色在
如果想提高鹽的破解難度,鹽的長度最好長一點,且使用特殊符號,使它長的像一般的密碼

目前大部分的系統應該都是使用加鹽的方式儲存密碼(少部分除外),因為這種方式較為安全(但不是絕對安全)
萬一存鹽的資料庫也遭到破解,那就真的完拉完拉完拉 芭比Q拉
/images/emoticon/emoticon16.gif

因此會建議鹽、雜湊函數、密碼分開儲存,提高破解難度


所以,雜湊為什麼不是加密?

加密「需要」金鑰,也可以透過「解密」取得明文,是「可逆」的
而雜湊「不需要」金鑰,也沒辦法透過「逆向」回推原始的內容,是「不可逆」的

大家會這麼容易把這兩個搞混,是因為它們常常被放在一起講,或拿來做使用
所以,雜湊真的不是加密法!


以上就是今天的介紹
希望大家看完能對雜湊(hash)更加了解


上一篇
Day 6 : 觀念篇 - 密碼學裡的對稱式、非對稱式加密是什麼?
下一篇
Day 8 : 觀念篇 - 數位簽章是什麼東西?
系列文
做IT必備的資安觀念!手把手帶你攻防實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言