我叫雜湊不叫加密-hashing (MD5, SHA family, scrpty, bcrypt)
前言
昨天在聊到JWT的組成時有提到要將header跟payload做「雜湊」產生signature。
那到底雜湊是什麼呢?跟加密一樣嗎?
今天來了解一下!
加密
什麼是加密?
加密指的是:
將明文資訊改變為難以讀取的密文內容,使之不可讀的過程。
– 加密
我覺得加密很像是把東西加上一把鎖,有鑰匙就可以進去資料的裡面。
加密的特性:
- 可逆: 可以經過特定演算法加上必要條件(例如: 金鑰)後還原回加密前的原始資料。
分類
加密演算法一般可以分為兩類
- 對稱加密: 加解密皆使用相同金鑰
- 非對稱加密/公鑰加密: 加密會使用公鑰,解密會使用私鑰
用途
重點在於這個被加密的資料是還需要被指定的對象閱讀的,所以適合用在資料傳輸中。
雜湊
什麼是雜湊?
當我們提到雜湊時,其實是指說,將一些資料輸入到雜湊演算法,並取得經過雜湊演算法而有的新資料。
是一種從任何一種資料中建立小的數字「指紋」的方法。雜湊函式把訊息或資料壓縮成摘要,使得資料量變小,將資料的格式固定下來。該函式將資料打亂混合,重新建立一個叫做雜湊值(hash values,hash codes,hash sums,或hashes)的指紋。
– 維基百科
雜湊有幾個特性:
- 輸出固定長度
- 不可逆: 無法透過雜湊函式回算原本的輸入
- 資料壓縮
- 相同內容輸入同一雜湊函式會得到相同的雜湊值
- 不同內容輸入同一雜湊函式得到相同雜湊值極低,若出現相同會稱為「碰撞Collision」
用途
- 資料保護/驗證: 因為資料在雜湊後能得到接近唯一值,可以用來檢查資料是否被修改。
- 錯誤校正
總而言之,有些資料是不必還原的,我們僅需要透過這些資料的「特徵」以確認資料有沒有被改變。
簡介常見的加密及雜湊演算法
MD5
是一種雜湊演算法,輸入不固定長度後,可以產出固定128-bits雜湊值。
在90年代時被廣泛運用,不過在2009年,有人用了一種碰撞演算法,可以在一般電腦執行數秒即可完成的複雜度之下完成碰撞。
故2011年,此演算法在RFC6151中被禁止用作金鑰雜湊訊息鑑別碼。
除此之外,他的危險來自於:
- MD5的暴力硬解很快,
- 因為被廣泛使用,所以他的字典裡的資料所對應已經儲存了相當大量,可參考MD5 Online
SHA Family
是一系列雜湊演算法的統稱,包括SHA-0, SHA-1, SHA-2(是SHA-224, SHA-256…SHA-512的統稱), SHA-3等。
根據資料,目前SHA-0已經淘汰, 而SHA-1也已經被列為弱安全性,目前較常使用的是SHA-256。
bcrypt
可以說是專門用於密碼的慢雜湊演算法,除了可以加鹽來抵抗彩虹表攻擊外,因為他可以保證加密的速度落在一個特定範圍內,所以可以延長攻擊方的加密速度,讓暴力搜尋變得比較容易被防禦。
scrypt
記憶體依賴的雜湊演算法,目前常用於區塊鏈。
小結
大致了解演算法的種類,對於什麼情境常用到的演算法可以有些認識了。
有時候其實也是會混合使用的,比如說,可能會先將資料加密,再將資料做雜湊給對方一個雜湊值以驗證資料有沒有經過竄改等等,都是一些常用的作法。
有一個資料裡提到的結論蠻好的,引用一下:
在資安領域沒有所謂絕對的安全,你只能不斷提高攻擊者的成本,當那個成本高到攻擊者無法負荷時(像是破解一個密碼要租超級電腦連續計算十年),那就可以說是足夠安全了XD
– 聽說不能用明文存密碼,那到底該怎麼存?
此文章同步發表於部落格,歡迎來逛逛~
參考資料
[資料結構] 雜湊 (Hash)
[Security] 雜湊不是加密,雜湊不是加密,雜湊不是加密。
基礎密碼學(對稱式與非對稱式加密技術)
先用md5,再用sha1,这样密码会安全一点吗?
scrypt演算法的前世今生(從零開始學區塊鏈 192)
聽說不能用明文存密碼,那到底該怎麼存?