侧边栏壁纸
博主头像
修恩的 Paradeisos博主等级

παράδεισος

  • 累计撰写 20 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

概念筆記: Hash 雜湊函數 (哈希函數)

Ashun
2024-01-23 / 0 评论 / 0 点赞 / 75 阅读 / 2397 字

什麼是 Hashing ?

雜湊(英語:Hashing)是電腦科學中一種對資料的處理方法,通過某種特定的函式/演算法(稱為雜湊函式/演算法)將要檢索的項與用來檢索的索引(稱為雜湊,或者雜湊值)關聯起來,生成一種便於搜尋的資料結構(稱為雜湊表)。舊譯哈希(誤以為是人名而採用了音譯)。它也常用作一種資訊安全的實作方法,由一串資料中經過雜湊演算法(Hashing algorithms)計算出來的資料指紋(data fingerprint),經常用來識別檔案與資料是否有被竄改,以保證檔案與資料確實是由原創者所提供。— 節錄自維基百科

雜湊函數的特性

Hashing.webp

將原始資料透過雜湊函數,以此獲得另一個較為統一格式的值,並且雜湊函數的設計通常滿足以下特性:

  • 無法逆推
  • 同樣的輸入會算出同樣的輸出
  • 無論輸入長度,都會輸出固定長度的雜湊值

雜湊函數用在哪?

這東西運用在哪呢。比方說,一般人都會有的一個疑問: 我註冊了某個網站的帳號密碼,是不是管理員可以知道我設定的密碼是多少?

其實,一般來說不會的。你註冊的密碼會先通過雜湊函數得到一個唯一的雜湊值,然後才存進去網站的資料庫裡。而由於雜湊值無法逆推回密碼,所以管理員只會看到一坨意義不明的亂數而已。下次你再輸入密碼的時候,會再把你輸入的密碼經過一次雜湊函數,然後把結果跟資料庫裡的那個值做比對。

無論你密碼設多長多古怪,最終都會被轉換成一個固定長度的雜湊值,格式統一,也方便管理,又保證了不可讀性。

雜湊函數是加密方法嗎?

雖然他可以把一串有意義的字串轉成亂碼,但這 不是一種加密方法。 想法很簡單,概念上來說若一段數值可以加密,那也要可以解密才行,但雜湊函數做不到這一點。而且,加密算法來說,若只經過單薄的雜湊函數,還是太過簡單了。

碰撞問題

無論原始資料有多長,最後都會變成一個有固定長度的雜湊值。無限多隻的鳥要塞到有限的鳥籠裡,無論如何必定有鳥籠必須塞下至少兩以上的鳥,對吧!

兩個不同的資料經過雜湊之後擁有相同的雜湊值,就被稱為 碰撞 (Collision)

collision.webp

好的雜湊函數,能夠盡量避免碰撞問題。 但無限對上有限,這是一定會遇到且無可避免的事情,必須解決。

解決方法請見 概念筆記: 解決雜湊的碰撞問題(監修中)

其他應用

雜湊的特性讓它很適合做一些資料驗證類的工作,因為倘若原始資料有 1bit 的偏差,最後得出的雜湊值可能都有很大的不同。

資料驗證

比方說常見基於雜湊的算法 MD5,就常常被用來做資料驗證,透過比對 MD5 值,可以看出檔案是否被竄改過。所以說維基百科才會說雜湊可以用來建立「資料指紋」。

不過,MD5 已經被證實有一些重大漏洞,可以透過 差分攻擊 去刻意製造碰撞,雖然目前還無法做到指定碰撞任意一個 MD5 值。近年各方開始呼籲使用 SHA,會比較安全一點。

區塊鏈

btc_chain.png

(資料來源: Bitcoin: A Peer-to-Peer Electronic Cash System)

同樣,區塊鏈也特別需要雜湊這種運算。例如在標示區塊以及將區塊連結的時候,都會計算雜湊值,以保證區塊的唯一性與可識別性。將上一個區塊的雜湊值參與到這個區塊做計算,如此一來若前面有一區塊被更動數值,整條鏈的雜湊值就會有所變動。

比特幣挖礦本身也是在做一些雜湊相關的計算工作,可以說區塊鏈很大一部分是基於雜湊的特性而建立的。

以上就是關於 Hash 的小筆記,已經盡量寫的簡單,畢竟再詳細的我也不懂了 笑。

评论区