我叫雜湊不叫加密-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等。

圖 11

根據資料,目前SHA-0已經淘汰, 而SHA-1也已經被列為弱安全性,目前較常使用的是SHA-256。

bcrypt

可以說是專門用於密碼的慢雜湊演算法,除了可以加鹽來抵抗彩虹表攻擊外,因為他可以保證加密的速度落在一個特定範圍內,所以可以延長攻擊方的加密速度,讓暴力搜尋變得比較容易被防禦。

scrypt

記憶體依賴的雜湊演算法,目前常用於區塊鏈。

小結

大致了解演算法的種類,對於什麼情境常用到的演算法可以有些認識了。

有時候其實也是會混合使用的,比如說,可能會先將資料加密,再將資料做雜湊給對方一個雜湊值以驗證資料有沒有經過竄改等等,都是一些常用的作法。

有一個資料裡提到的結論蠻好的,引用一下:

在資安領域沒有所謂絕對的安全,你只能不斷提高攻擊者的成本,當那個成本高到攻擊者無法負荷時(像是破解一個密碼要租超級電腦連續計算十年),那就可以說是足夠安全了XD
聽說不能用明文存密碼,那到底該怎麼存?

此文章同步發表於部落格,歡迎來逛逛~

參考資料

[資料結構] 雜湊 (Hash)
[Security] 雜湊不是加密,雜湊不是加密,雜湊不是加密。
基礎密碼學(對稱式與非對稱式加密技術)
先用md5,再用sha1,这样密码会安全一点吗?
scrypt演算法的前世今生(從零開始學區塊鏈 192)
聽說不能用明文存密碼,那到底該怎麼存?