天天看點

關于哈希(散列)函數你應該知道的東西

無論安全從業人員用計算機做什麼,有一種工具對他們每個人都很有用:加密 哈希(散列)(hash)函數。這聽起來很神秘、很專業,甚至可能有點乏味,但是, 在這裡,關于什麼是哈希函數以及它們為什麼對你很重要,我會作出一個簡潔的解釋。

加密哈希函數,比如 SHA-256 或者 MD5,接受一組二進制資料(通常是位元組)作為輸入,并且對每個可能的輸入集給出一個 希望唯一(hopefully unique)的輸出。對于任意模式的輸入,給定的哈希函數的輸出(“哈希值”)的長度都是一樣的(對于 SHA-256,是 32 位元組或者 256 比特,這從名字中就能看出來)。最重要的是:從輸出的哈希值反推回輸入,這從計算的角度是 不可行的(implausible)(密碼學家讨厭 “ 不可能(impossible)” 這個詞)。這就是為什麼它們有時候被稱作 單向哈希函數(one-way hash function)。

但是哈希函數是用來做什麼的呢?為什麼“唯一”的屬性如此重要?

唯一的輸出

在描述哈希函數的輸出時,“ 希望唯一(hopefully unique)”這個短語是至關重要的,因為哈希函數就是用來呈現完全唯一的輸出。比如,哈希函數可以用于驗證 你 下載下傳的檔案副本的每一個位元組是否和 我 下載下傳的檔案一樣。你下載下傳一個 Linux 的 ISO 檔案或者從 Linux 的倉庫中下載下傳軟體時,你會看到使用這個驗證過程。沒有了唯一性,這個技術就沒用了,至少就通常的目的而言是這樣的。

如果兩個不同的輸入産生了相同的輸出,那麼這樣的哈希過程就稱作“ 碰撞(collision)”。事實上,MD5 算法已經被棄用,因為雖然可能性微乎其微,但它現在可以用市面上的硬體和軟體系統找到碰撞。

另外一個重要的特性是,消息中的一個微小變化,甚至隻是改變一個比特位,都可能會在輸出中産生一個明顯的變化(這就是“ 雪崩效應(avalanche effect)”)。

驗證二進制資料

哈希函數的典型用途是當有人給你一段二進制資料,確定這些資料是你所期望的。無論是文本、可執行檔案、視訊、圖像或者一個完整的資料庫資料,在計算世界中,所有的資料都可以用二進制的形式進行描述,是以至少可以這麼說,哈希是廣泛适用的。直接比較二進制資料是非常緩慢的且計算量巨大,但是哈希函數在設計上非常快。給定兩個大小為幾 M 或者幾 G 的檔案,你可以事先生成它們的哈希值,然後在需要的時候再進行比較。

通常,對哈希值進行簽名比對大型資料集本身進行簽名更容易。這個特性太重要了,以至于密碼學中對哈希值最常見的應用就是生成“數字”簽名。

由于生成資料的哈希值很容易,是以通常不需要有兩套資料。假設你想在你的電腦上運作一個可執行檔案。但是在你運作之前,你需要檢查這個檔案就是你要的檔案,沒有被黑客篡改。你可以友善快捷的對檔案生成哈希值,隻要你有一個這個哈希值的副本,你就可以相當肯定這就是你想要的檔案。

下面是一個簡單的例子:

$ shasum -a256 ~/bin/fop
87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c  /home/bob/bin/fop           

複制

如果我知道

fop

這個可執行檔案的 SHA-256 校驗和,這是由供應商(這個例子中是 Apache 基金會)提供的:

87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c           

複制

然後我就可以确信,我驅動器上的這個可執行檔案和 Apache 基金會網站上釋出的檔案是一模一樣的。這就是哈希函數難以發生碰撞(或者至少是 很難通過計算得到碰撞)這個性質的重要之處。如果黑客能将真實檔案用哈希值相同的檔案輕易的進行替換,那麼這個驗證過程就毫無用處。

事實上,這些性質還有更技術性的名稱,我上面所描述的将三個重要的屬性混在了一起。更準确地說,這些技術名稱是:

  1. 抗原像性(pre-image resistance):給定一個哈希值,即使知道用了什麼哈希函數,也很難得到用于建立它的消息。
  2. 抗次原像性(second pre-image resistance) :給定一個消息,很難找到另一個消息,使得這個消息可以産生相同的哈希值。
  3. 抗碰撞性(collision resistance):很難得到任意兩個可以産生相同哈希值的消息。

抗碰撞性 和 抗次原像性 也許聽上去是同樣的性質,但它們具有細微而顯著的不同。抗次原像性 說的是如果 已經 有了一個消息,你也很難得到另一個與之哈希值相比對的消息。抗碰撞性 使你很難找到兩個可以生成相同哈希值的消息,并且要在哈希函數中實作這一性質則更加困難。

讓我回到黑客試圖替換檔案(可以通過哈希值進行校驗)的場景。現在,要在“外面”使用加密雜湊演算法(除了使用那些在現實世界中由獨角獸公司開發的完全無 Bug 且安全的實作之外),還有一些重要且困難的附加條件需要滿足。認真的讀者可能已經想到了其中一些,特别需要指出的是:

  1. 你必須確定自己所擁有的哈希值副本也沒有被篡改。
  2. 你必須確定執行雜湊演算法的實體能夠正确執行并報告了結果。
  3. 你必須確定對比兩個哈希值的實體确實報告了這個對比的正确結果。

確定你能滿足這些條件絕對不是一件容易的事。這就是 可信平台子產品(Trusted Platform Modules)(TPM)成為許多計算系統一部分的原因之一。它們扮演着信任的硬體基礎,可以為驗證重要二進制資料真實性的加密工具提供保證。TPM 對于現實中的系統來說是有用且重要的工具,我也打算将來寫一篇關于 TPM 的文章。