前言
這篇是我個人的筆記,因此不會是完整的教學,
只紀錄個人認為重要的部分。
推薦文章
在網路上剛好已經有看到非常不錯的介紹,推薦可以優先看這一篇:
[資訊安全] 密碼存明碼,怎麼不直接去裸奔算了?淺談 Hash , 用雜湊保護密碼
hash 的介紹與特性
我們在使用 hash 的時候,
主要在做的事情是把 Input 經過 hash function 運算之後得到一個 output,
可以表示為 input -> hash function -> output
hash 最重要的特性 「不可逆」
hash 最重要的特性就是 「不可逆」
我們在設計 hash function 時,要注意我們設計的 hash function 要有不可逆的特性,
這樣才符合 hash 的精神,
我們這裡簡單舉例怎麼設計不可逆的 hash function,但實際上設計只會更複雜。
這裡只為解釋「不可逆的特性」舉例。
例如,我們的密碼是 18,hash function 是 x mod 10,
因此透過計算我們會得到 8。
所謂不可逆的特性是指我們無法從 8 回推至 18,
稍微思考之後我們能知道,回推的可能有太多種,8、18、28 都是有可能的結果。
因此利用這個特性,我們可以設計一種密碼驗證機制,
「使我們可以在不儲存真實的密碼情況下,進行密碼驗證」
collision
講完上面的例子後,來講個題外話,
你可能會有疑惑,那如果猜密碼的人去猜 hash function 後的結果就好啦!
甚至還比原來的 18 更好猜,因為 8, 18, 28 都算對耶!!
這裡就會帶出一個新的概念,就是 hash 後的 collison (碰撞),也代表著出現一樣結果的機率。
一個好的 hash function,發生 collison 的機率也必須要低,
例如我們可以透過增加 hash function output 的位元數,
把所有可能的密碼對應到,全部可能有 2^256 種結果,
不要小看這數字,「表示上」看起來很小,他可是「天文等級的數量級」,
有興趣的話,推薦閱讀這篇:加密貨幣世界裡最強大的數字:2 的 256 次方
而這個算法就可以提到超級有名的 hash 算法 SHA-256,
細節就先不在此文章多提了,有興趣可以自己去查詢。
而 SHA-256 發生 collision 的機率,雖然不為 0,
但那機率超級無限接近 0 … 不知道怎麼解釋好的數量級XDDD,
因此我們就幾乎可以直接假定這件事情不會發生!
(我是抓個感覺,比被雷劈到的機率更低? 比你所有認為發生機率超級低的事情,機率都還要更更低!)
有興趣的話一樣可以參考其他網友們的分享!
hash 在密碼上的應用
因為上述提到的不可逆特性,使得我們輸入的密碼,例如 password,
經過 hash function 後可能變成一個特殊值,
而 hash function 的另外一個特色是,不論我們進行多少次 hash function 計算,
「hash function 出來的結果必須要是一樣的」,也就是必須都能算出一樣的結果
而這樣我們就能安心的儲存密碼,因為就算駭客駭入主機拿得到密碼,
拿到的密碼也是永遠沒辦法被還原成原始的樣子。
而像我們作為使用者,只要我們每次輸入一樣的密碼,
透過 hash function 都會得到一樣的特殊值, 進而比對密碼的正確性。
比較:加/解密 與 hash 的不同
- 「加解密」:重點是可逆,可以還原出原始結果。
- 「Hash」:重點是不可逆,不能還原出原始結果,只用來單向計算,比對一致性。