Hash是什麼?
雜湊(Hash)算法原先是一種用在資料編碼中的技術,最主要分為Hash Function(雜湊函數)和Hash Table(雜湊表)兩個部份,其中hash function是一種將任意資料映射成為固定長度的技術,hash table則是儲存(Key,Value)這種對應關係的資料結構,我們會對hash function和hash table做簡單的介紹,欲深度了解hash table的可以觀看我們文末的參考資料。
Hash Function是什麼?
雜湊函式Hash Function是一種將輸入值映射到另一個值域的技術,Hash Function的底層有非常複雜的數學式,式子中蘊含了一些magic number,有興趣鑽研的可以再去尋找一些論文來研讀,這邊就不多作介紹,因此在這邊可以直接想像Hash Function就是一台轉換器,丟輸入進去就會產生一個輸出,而這種轉換有一個很重要的特性就是「單向」,也就是one-way function,輸入可以經由轉換得到輸出,但輸出卻不可得到輸入,具有不可逆的特性。
Hash Table是什麼?
雜湊表Hash Table是一種儲存(Key,Value)的資料結構,通常一個Key就是對應一個Value,Value就是要儲存的資料,Key則可以想像成這筆資料的標籤,想要找到這筆資料就需要有這筆資料的Key去搜尋,比如有一些資料是許多車主的姓名和車子的廠牌:
很明顯的,左邊是車主姓名,右邊是該車主的車子廠牌,因此我們可以假定Key是車主姓名,Value是車子廠牌,那去尋找key名稱為”Michael”的,就可以找到他的Value、也就是車子廠牌為”Tesla”。而這邊提到的Hash Table,Key和Value分別擺放的就是原始輸入,以及經由Hash Function轉換過的輸出。有一個重點要說明,有些Hash Function有可能會發生一種情況:不同輸入,結果輸出相同,這樣放到Hash Table上,就等於有多個Key都可以指到同一個Value,這樣今天如果我得到這個Value,我就會分不出來是用哪把Key去呼叫資料的,這種情況稱為”衝突Collision”,在比較舊的幾種Hash Function,例如MD2、MD5等就有這種衝突的情況,但對於要能用在區塊鏈上的Hash卻是不能有這種衝突的情況的,原因有許多例如:沒辦法作為電子簽名的辨別之用,因此使用在區塊鏈的Hash技術比較常用的種類是密碼雜湊函式(Cryptographic Hash Function)。
Cryptographic Hash Function是什麼?
密碼雜湊函式Hash Function的一種類型,也具有hash function所有的性質,但密碼雜湊函式得出的輸出不會發生衝突(collision)的情況,具有「碰撞抵抗性」(Collision-Resistant),因此可明確分辨輸入訊息是否不同,因此在區塊鏈當中,都是使用密碼雜湊函式作為hash function。
在密碼雜湊函式中有許多不同的演算法,常見的有MD5、SHA家族,在比特幣中使用的hash算法就是使用SHA家族當中的SHA-256演算法。
密碼雜湊函式例子:
例子中可看出多了一個驚嘆號,輸出結果就會有很大的改變,有興趣的各位能夠上網搜尋線上hash就會有很多網站可以玩玩看各個語詞的hash值囉!
SHA是什麼?
安全散列演算法 SHA(Secure Hash Algorithm)是密碼雜湊函式的一種安全標準,SHA家族的演算法,由美國國家安全域(NSA)所設計,並由美國國家標準與技術研究院(NIST)發布,是美國的政府標準。
常見的SHA家族有SHA-1、SHA-2當中的SHA-256和SHA-512等等,其中的SHA-256演算法,無論放進任何的輸入,經由hash function得到的輸出長度都會剛好是256 bits,維基上有提供SHA-256的虛擬碼,有興趣的可以上去看一下 :https://zh.wikipedia.org/wiki/SHA-2
小知識:2017年荷蘭密碼學研究小組CWI和Google正式宣布攻破了SHA-1
Hash常見用途
- 檔案校驗碼
- 使用者密碼儲存和比對
可以把要隱藏的資料用Hash的方式加密起來,想要確認該加密密文(見:小知識)的原始資料時也可以用Hash的特性來確認,比如把使用者密碼Hash起來再儲存,這樣資料庫中就不會直接儲存公開的使用者密碼,而今天想要確認使用者輸入的密碼是否正確只需要把使用者輸入的密碼Hash起來跟資料庫當中儲存的密文做比對就可以。
小知識:明文(Plain Text)和密文(Cipher Text)是密碼學中的基礎名詞,概念很簡單,明文指的就是加密前原始資料, 明文加密之後就會變密文。比如上方Hash的例子當中,Hi, We are blockbar就是明文,密文就是9cd454c137d2910ea3333d2167b899242b876e5c1fb489f1906f34f680951851。
了解Hash的意思之後,下個部分,我們將會介紹DAY9 區塊鏈中的數位簽章機制,歡迎大家追蹤我們!
參考資料:
- https://www.investopedia.com/news/cryptographic-hash-functions/
- https://medium.com/d-d-mag/%E7%82%BA%E4%BB%80%E9%BA%BC%E4%BD%A0%E9%9C%80%E8%A6%81%E6%87%82%E4%B8%80%E9%BB%9E%E5%AF%86%E7%A2%BC%E5%AD%B8-709c090452aa
- https://blog.goodaudience.com/very-basic-intro-to-hash-functions-sha-256-md-5-etc-ed721622ff8
- https://ithelp.ithome.com.tw/articles/10208884
- https://blockgeeks.com/guides/what-is-hashing/?fbclid=IwAR1hsj4Tb2er0m2-8nU8P8omrgiDq-U_Pr0dPUzESQNuEioSqYENHovTfQE
Hash Table相關資料: