[資訊安全] 密碼存明碼,怎麼不直接去裸奔算了?淺談 Hash , 用雜湊保護密碼

前言

「那個……不好意思,我的暱稱是乂煞氣 a 明乂,我不小心忘記密碼了,現在沒辦法登入,能請你們幫忙嗎?」

「稍等我查詢一下喔 …… 乂煞氣 a 明乂 先生您的密碼是 ilikeakb48,下次不要忘記囉。」

好不容易拿回密碼的煞氣 a 明眉頭一皺,覺得好像哪裡怪怪的……

網站管理者看得到我的密碼,合理嗎

不知道你有沒有類似的經驗,當登入網站卻想不起來密碼時,按下「忘記密碼」,沒多久就會收到一封「補寄密碼通知信」,將你的密碼明明白白的寫在裡面。

Image for post
Image for post
圖片來源:我的密碼沒加密

這表示該網站在儲存你的密碼時,完全沒有加密,以「明文」的方式存在資料庫裡,這樣做其實隱含著巨大的資安風險:

  1. 如果有駭客駭進了網站資料庫的主機,那所有使用者的帳號、密碼都赤裸裸地攤在駭客的眼前,每個人的帳戶、個人資料都無法倖免。
  2. 如果網站管理者居心不良、或是受到威脅、或是起來上廁所時忘了切換電腦畫面,那使用者的帳號、密碼隨時都可能外洩。

因此作為一個有資訊安全意識的網站工程師,知道在儲存使用者的密碼時,應該要動一點手腳,將這組密碼「整形」,這樣即使資料庫不慎外洩,也不會讓原本密碼的模樣很容易被看出或猜到。

將密碼「整形」的手段,分為「雜湊」與「加密」兩種,這篇文章主要談論「雜湊 (hash)」。

什麼是雜湊 (Hash)

在資安領域中,雜湊是一種對資料的處理方法,透過一連串的演算,將資料轉換成看似亂碼的字串。

當我們說對密碼進行雜湊,意思就是指透過雜湊函式( hash function, 又稱雜湊演算法),將密碼「轉換 / 整形」成完全不一樣的樣貌,經過雜湊函數轉換後的內容,稱作雜湊值(hash sum)。與整形不一樣的地方是,我們無法從轉換後的樣貌(雜湊值),去推導出原本的模樣(原密碼)。

下面這張圖源自維基百科,模擬雜湊函式的使用,如圖所示,「Fox」經過雜湊後,得到了一個完全不同的雜湊值「DFCD3454」。

Image for post
Image for post
維基百科 - 雜湊函式的工作原裡

雜湊的特性

  1. 不可逆。雜湊函式是一種單向函示,沒有辦法從結果去逆推回原本的內容。如上圖中輸入「Fox」經過雜湊,得到雜湊值「DFCD3454」,我們卻無法透過任何函式或算法,去知道「DFCD3454」雜湊前的原文是「FOX」。
  2. 同樣的輸入經過雜湊,保證一定會得到同樣的輸出。如圖「Fox」不管經過幾次雜湊,不會得到「DFCD3454」以外的值。
  3. 不定長度、無窮可能的輸入,都會得到固定長度的雜湊值,亦即輸出的長度不受原本長度的影響。如圖「Fox」和 「The red fox runs across the ice」經過雜湊後,得到一樣長度的雜湊值。
  4. 雖然機率很低,但是有可能「不同的輸入」卻有「相同的雜湊值」,如果有這種情形,稱為碰撞(collision)。一個雜湊函式的好壞,也取決於是不是容易發生碰撞。
  5. 即使只有一點點不一樣,雜湊出來的值仍然天差地遠,看不出關係。

利用這些特性,我們可以將經過雜湊函式後的密碼存入資料庫中,取代原本直接存明碼的形式。這樣即使駭客取得了主機資料,也無法得到原本的密碼。下面示範簡單的例子:

將密碼存成明碼的資料庫

將密碼存成雜湊值的資料庫

很明顯的,即使知道了雜湊值,駭客也難以輕易解碼。而如果是本人要登入的話,主機只要對輸入的密碼做雜湊,去比對是不是符合儲存的雜湊值就可以了。

常見的雜湊演算法

  • SHA-0
  • SHA-1 ( 已經被證明不夠安全。 2017年荷蘭密碼學研究小組 CWI 和Google 正式宣布攻破了SHA-1)
  • SHA-256
  • MD-5 (已經被證明不夠安全。 1996年後被證實存在弱點,可以被加以破解 ;2004年,證實 MD5 演算法無法防止碰撞)
  • RIPEMD-160

雜湊加鹽

既然一樣的密碼經過雜湊以後,就一定會有一樣的雜湊值,那駭客豈不是可以針對這一點,自己建立起一個常用字串對照雜湊值的表格,藉此去破解雜湊後的密碼嗎?

比如說,我們現在把網頁拉上一點,就知道「DFCD3454」對應的密碼就是「Fox」,這樣怎麼會安全呢?

網路世界還真的存在著這麼一張表,叫做「彩虹表」,原理就是用原本已經做好字串與雜湊值對照的表格,去強硬破解資料庫裡的密碼。

這篇文章不討論破解的實際操作,因為這其實是可以防範的,我們只要給密碼加鹽(salt)就可以了。

加鹽是指原本的密碼在雜湊之前,先加入一段固定的字串(鹽),讓原密碼改變,比如說,我們在原本的密碼前方,都加上 1234。

之後再拿加鹽過後的密碼去雜湊,得出新的雜湊值

如此一來,即使有了對照表,在沒有取得鹽,也不知道鹽是怎麼加的情形下(也可以把鹽加在密碼後面,或間隔插入),駭客也難以在短時間內破解密碼。

而如果是本人輸入密碼的話,主機端只要照著把鹽加回密碼,接著去做雜湊,比較是否符合資料庫裡的雜湊值就可以了。

Image for post
Image for post
圖片來源:台灣微軟資安部落格

雜湊與加密

雖然大家習慣性常常說:加密雜湊、雜湊加密......雜湊與加密雖然常常一起使用,保護原文的安全性,但其實雜湊與加密是不相同的。

最大也是最根本性的差異,就是明文加密後會有密文密鑰,透過密文密鑰,可以逆推回去原本的明文內容,雜湊則不行

那些沒有幫密碼加密的網站

很可惜,不是每個工程師的小三課本都有教資訊安全,許多知名的網站,也曾經被人發現將使用者的密碼存成明碼。若是有興趣,下面分享一些相關連結:

我的密碼沒加密

「我的密碼沒加密」也有臉書,從 2011 年開始記錄那些沒有將密碼加密的網站,其中包含一些知名的售票系統或電商。裡面也把儲存與取得密碼的過程用圖片詳細說明,呼籲網站開發者及早修正問題。非常有教育意義的良心網站。

臉書又爆資安醜聞!上億用戶密碼「沒加密」,隨便 2 萬名員工翻閱

Oops,Google 也不小心用明碼存企業用戶帳密

(新聞來源:奇摩新聞、Line Today)

尾聲

讀到這裡,我們知道了

  • 煞氣 a 明皺眉的原因
  • 雜湊、雜湊加鹽保護密碼的原理
  • 雜湊的特性
  • 為什麼要雜湊
  • 密碼存明碼是違反資訊安全的起手式

下次如果遇到有網站直接大喇喇地把密碼寄給你,記得大喊:

把我的密碼存明碼

怎麼不直接叫我去裸奔算了

希望這篇文章能幫助更多人認識雜湊,一起學習資安知識。

文章內容多處來自網路上前人的筆記資料,作者加上一點不正經的話整理而成,若是內容有誤或有引用不當的地方,還請先進網友們不吝指正。

參考資料

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store