雜湊是一種演算法又稱 『雜湊演算法』,屬於在資料中編碼的技術
最主要分為 Hash Function(雜湊函數)和Hash Table(雜湊表)
不過記住最重要的一點,雜湊 Hash 【不是加密】【不是加密】【不是加密】
很重要所以說三次
可以把雜湊函數看到一台果汁機,這個果汁機有許多功能按鈕 (md5 , sha1 ,sha256...)
當我們把資料丟進去後,按下按鈕(sah1),經過果汁機打散的結果,得到的結果我們稱為雜湊值 (Hash Value)或 雜湊碼 (Hash Code)
下表為 hash online產生網站 https://www.fileformat.info/tool/hash.htm 執行結果
name | value |
---|---|
Original text | 羊小咩 |
Original bytes | e7:be:8a:e5:b0:8f:e5:92:a9 (length=9) |
MD5 | 28ebf41c0fd6440ce2a889c048f0d460 |
SHA-1 | 8a580166718f2c786e6893e67e0ca11523e4e8bb |
SHA-256 | 8b5ca9a3ec4a108d431aa88938d05343a70289721120f7967f6aa91d66b377db |
SHA-512 | 9eda5bc2825c4329c24e49e4801bdf69468c05556eb48b4c46d163bf3b9207340c8c7cad3969e6902d451bf14407c3174151bba96bd9f346cd6ee8988f1cf08d |
下圖為 playground 執行結果
無論資料輸入長度很短,或超大,打散後輸出的長度都是固定的
雜湊表Hash Table 是一種儲存(Key,Value)的資料結構, 可以把Key 想像成檔案名稱, Value 檔案的資料內容,通常運用在資料儲存,及資料庫功能設計
名字 | 喜歡食物 |
---|---|
羊小咩 | 烤肉 |
長頸鹿 | 嫩芽 |
大象 | 蘋果 |
會將某一欄資料,當為主要資料,上表為例會將姓名進行hash ,資料用原始型態儲存
hash | 喜歡食物 |
---|---|
28ebf41c0fd6440ce2a889c048f0d460 | 烤肉 |
537e7b22835c0f1bc29a58475bbcca55 | 嫩芽 |
e33d101cae2f9056d5426aea50643430 | 蘋果 |
Hash Table(雜湊表)為了效能或空間通常取道 hash 後還會在做除餘做分區,但也不是絕對,依照需求設計及變化
以下為雜湊 常用演算法,當然其實不只這些,只是列出現在比較常使用的
由於電腦進步,md5字典檔幾乎都已經列舉完了,因此已不建議使用 md5,至少使用sha1 以上的演算法
如果有考慮碰撞問題建議使用sha224 或 sha256以上
md5
sha
常用在保護使用者輸入的密碼,就是常聽到的密碼在資料庫有沒以儲存明文
密碼輸入 abc 採用 hash 運算
sha1('abc')
實際儲存資料是
a9993e364706816aba3e25717850c26c9cd0d89d
在網路傳輸資料時,將傳輸內容進行hash ,伺服器驗證這組 hash code ,確保資料在中間沒有被串改
這也稱
確保訓息完整性
稱(Hash-based message authentication code , 縮寫HMAC)
在上方以有簡單介紹,主要用途資料使用及儲存,更多用在資料搜索上的設計
在傳輸協議上設計對應的 hash 檢驗,當傳送資料時比對計算hash code 比對不相同時為,傳輸內容有誤
這又稱
冗餘校驗
發行的軟體進行雜湊後,並把雜湊碼公布於網站,讓使用者自行比對安裝的為官方出廠沒被竄改過
也稱為
Checksum
圖片進行hash 可以快速比對是否相同檔案
語音 影片,分割為很多小檔案進行hash 後可以進行 搜尋 批配是否有相同的部份
網路資源發行後進行hash 碼,配合子資源完整性 (Subresource Integrity ,SRI) 避免使用CDN時內容已被串改
<script src="https://example.com/example-framework.js" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script>
有時候我們擔心雜湊遇到字典檔攻擊,我們會將要雜湊的資料加鹽(salt)
原始資料:abc
用 hash 運算
sha1('abc')
實際儲存資料是 a9993e364706816aba3e25717850c26c9cd0d89d
可以在hash解密網站 https://www.dcode.fr/sha1-hash 可以發現很容易就查原始資料
sha1('abc,salt')
實際儲存資料是 8a0d0d1b0d275ae1041db295336b97542c212b18
發現我們將資料尾端加入 ,salt
即使是一樣的密碼由於加上了 salt 出來的結果也都不一樣
salt 長度位置都可以隨意,沒有限制
先祝大家中秋節快樂 ,大家在烤肉我在寫文(哭)
雜湊函數有不可逆的特性,因此很常跟著密碼學搭配一起使用
保護資料和資料比對,雜湊函數絕對是少不了的
可以不用深入了解,演算法怎麼運算,只要學會如何使用受益無窮