007-047-越寫越快樂之淺談單向散列函數

圖書封面 - 圖片來自簡書App

本次的越寫越快樂系列為大家帶來單向散列函數的分享,也就是我們經常說的哈希函數的統稱,接下來我會通過以下幾個方面來說明單項散列函數的內容。

相關術語

  • 單向散列函數(one-way hash function)也稱為信息摘要函數(message digest function)、哈希函數或者雜湊函數
  • 輸入單向散列函數的消息也稱為原像(pre-image)
  • 單向散列函數輸出的散列值也稱為消息摘要(message digest)或者指紋(fingrprint)
  • 消息的完整性也稱為一致性

什么是單項散列函數

這個文件是不是真的呢

Alice在公司從事軟件開發工作。一天晚上,她的軟件終于完成了,接下來只要把文件從Alice的電腦中復制出來并制作成母盤就可以了。
但是Alice已經很累了,她決定今天晚上早點回家休息,明天再繼續弄。
第二天,Alice來到公司準備把文件從自己的電腦中復制出來,但她突然產生了這樣的疑問:“這個文件和我昨天晚上生產的文件是一樣的嗎?”
Alice的疑問是這樣的——會不會有人操作Alice的計算機,將文件改寫了呢?就算沒有人直接來到Alice的座位上,也有可能通過網絡入侵Alice的計算機。或者,也許Alice的計算機感染了病毒,造成文件被篡改……在這里,是人文的還是病毒干的并不重要,我們姑且把篡改文件的這個主體稱為“主動攻擊者Mallory”。總而言之,Alice需要知道從昨天到今天的這段時間內,Mallory是否篡改了文件的內容。
那有沒有什么辦法幫助驗證Alice手上的文件是不是“真的”呢?如果這個文件和昨天晚上生成的文件一模一樣,那它就是真的;但只要有一點點不一樣,哪怕只要一個比特(bit)有所不同、增加或者減少,它就不是真的。這種“是真的”的性質稱為完整性,也稱為一致性。也就是說這里Alice需要確認的,是自己手上的文件的完整性。
稍微想一下我們就能找到一種確認文件完整性的簡單方法——在回家之前先把文件復制到一個完全的地方保存起來,第二天在用這個文件工作之前,先將其和事先保存的文件進行對比就可以了。如果兩者一致,那就說明文件沒有被篡改。
不過這種確認完整性的方法其實是毫無意義的。因為如果可以事先把文件保存在一個安全的地方,那根本就不需要確認完整性,直接用事先保存的文件來工作不就行了嗎?
此外還有一個效率問題。如果需要確認完整性的文件非常巨大,那么文件的復制、保存以及比較都將非常耗時。

終于輪到我們的豬腳單向散列函數出場了,就像刑事偵查中獲取指紋一樣,我們能不能獲取到Alice所生成的文件的“指紋”呢?如果我們不需要對整個巨大的文件進行對比,只需要對比一個較小的指紋就能夠檢查完整性的話,那該多方便啊。

什么是單向散列函數

單向散列函數有一個輸入和輸出,其中輸入稱為消息(message),輸出稱為散列值(hash value)。單向散列函數可以根據消息的內容計算出散列值,而散列值就可以被用來檢查消息的完整性。單向散列函數所生成的散列值,就相當于消息的“指紋”。

要點:消息的長度沒有限制,生成的散列值有固定長度(bit)。

單向散列函數的性質

  • 根據任意長度的消息計算出固定長度的散列值
    首先,單向散列函數的輸入必須是任意長度的消息。其次,無論輸入多長的消息,單向散列函數必須能夠生成長度很短的散列值。從使用方便的角度看,散列值的長度最好是短且固定的。
  • 能夠快速計算出散列值
    計算散列值所花費的時間必須要短。
  • 消息不同散列值也不同
    為了能夠確認完整性,消息中哪怕只有1比特的改變,也必須有很高的概率產生不同的散列值。
  • 具備單向性
    單向散列函數必須具備單向性。單向性指的是無法通過散列值反計算出消息的性質。根據消息很容易計算出散列值,但是根據散列值幾乎很難推斷出消息的內容。

單向散列函數的實際應用

檢測軟件是否被篡改

我們可以使用單向散列函數來確認自己下載的軟件是否被篡改。我們的具體操作步驟如下:

  1. 用戶自行下載軟件到本地
  2. 計算該軟件的散列值
  3. 比對官方網站上公布的散列值和自行計算的散列值
  4. 根據比對結果來判斷自己下載的文件是否是安全的軟件,有沒有被惡意篡改

基于口令的加密

單向散列函數也被用于基于口令的加密(Password Based Encryption,PBE)。PBE的原理是將口令和鹽(salt - 通過偽隨機數生成器產生的隨機值)混合計算其散列值,然后將這個散列值用作加密的密鑰。

消息認證碼

使用單向散列函數可以構造消息認證碼。消息認證碼是將“發送者和接收者之間的共享密鑰”和“消息”進行混合后計算出的散列值。使用消息認證碼可以檢測并防止通信過程中的錯誤、篡改以及偽裝。

數字簽名

在進行數字簽名時也會使用單向散列函數。數字簽名是現實社會中的簽名和蓋章這樣的行為在數字世界中的實現。數字簽名的處理過程非常耗時,因此一般不會對整個消息內容直接施加數字簽名,而是先通過單向散列函數計算出消息的散列值,然后再對對散列值施加數字簽名。

偽隨機數生成器

使用單向散列函數可以構造偽隨機數生成器。密碼技術中所使用的隨機數需要具備“事實上不可能根據過去的隨機數列預測未來的隨機數列”這樣的性質。為了保證不可預測性,可以利用單向散列函數的單向性。

一次性口令

使用單向散列函數可以構造一次性口令(one-time password)。一次性口令經常被用于服務器對客戶端的合法性認證。在這種方式中,通過單向散列函數可以保證口令只在通信鏈路上傳送一次(one-time),因此即使竊聽者竊取了口令,也無法使用。

單向散列函數的具體例子

MD系列

MD5(Message Digest 消息摘要 5)也就是Rivest提出的針對MD4的改進版本,它能夠產生128比特的散列值(RFC1321)[https://www.rfc-editor.org/rfc/rfc1321.txt]。MD5的強抗碰撞性以及被攻破,也就是說現在已經能夠產生相同散列值得兩條不同的消息。

SHA系列

SHA-1是由NIST(美國國家標準技術研究所)設計的一種能夠產生160比特的散列值的單向散列函數。
1993年被作為作為美國聯邦信息處理標準規格(FIPS PUB 180)發布的是SHA(安全散列算法)。
1995年發布的修訂版FIPS PUB 180-1稱為SHA-1。
SHA-224、SHA-256、SHA-384和SHA-512是目前NIST制定的SHA-2的版本,SHA后面的數字代表消息通過單向散列函數生成的散列值的長度(bit-比特)。
下面的表格給出目前6個版本的SHA-2標準的簡要情況:

名稱 輸出長度(bit) 備注
SHA-224 224 將SHA-256的結果截掉32比特
SHA-256 256
SHA-512/224 224 將SHA-512的結果截掉288比特
SHA-512/256 256 將SHA-256的結果截掉256比特
SHA-384 384 將SHA-256的結果截掉128比特
SHA-512 512

在2005年SHA-1的強抗碰撞性被攻破的背景下,NIST開始著手制定用于取代SHA-1的下一代單向散列函數SHA-3。Keccak的算法最終成為了SHA-3的新標準。Keccak的設計者之一Gilles Van Assche在GitHub上發布了一款名為Keccak Tools的軟件。

RIPEMD-160

RIPEMD-160是于1996年由Hans Dobbertin、Antoon Bosselaers和Bart Preneel設計的一種能夠產生160比特的散列值的單向散列函數。RIPEMD-160是歐盟RIPE項目所設計的RIPEMD單向散列函數的修訂版。這一系列額函數還包括RIPEMD-128、RIPEMD-256、RIPEMD-320等其他一些版本。RIPEMD的強抗碰撞性已經于2004年被攻破,但RIPEMD-160還尚未被攻破。

比特幣中使用的就是RIPEMD-160。

應該使用哪些單向散列函數

MD5 - 不建議使用
SHA-1 - 不建議使用
SHA-2 - 建議使用
SHA-3 - 建議使用

單向散列函數無法解決的問題

使用單向散列函數可以實現完整性的檢查,也就是說單向散列函數能夠辨別出“篡改”,但無法辨別出“偽裝”。

總結

通過對《圖解密碼技術》第七章節的學習,我們知道了單向散列函數的概念、使用場景以及為什么要使用單向散列函數,那么接下來我們就要看看在具體的編程語言中是如何實現單向散列函數的,那么接下來我有機會會為大家繼續分享單向散列函數的有關內容,我相信密碼學不是那么復雜,只是我們的認知有限,自認為目前流行的區塊鏈技術使用了哪些高深的技術,使用了哪些不那么通俗易懂的術語,當然書中還探討了一些單向散列函數的碰撞性問題、SHA-3的選拔過程、Keccak的內部狀態和Keccak函數的實現步驟,這些內容想要一口氣消化那是不可能完成的任務,除非你對密碼學底層實現技術有特別深入的研究,那么我建議你熟悉常見的單向散列函數的使用場景、基本原理和使用步驟就足夠了。當然作為一個區塊鏈技術的愛好者來說,這些基本知識是必須要知道并且熟練使用的,我相信你的努力不會白費,我更相信你走過的每一步都算數,我更知道有無數的007戰友都在支持我們去探索不一樣的人生和進化,要是我的文章對你有所啟發,那將是我莫大的榮幸。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 為什么要有單向散列函數 作為接收者,如果將得到的密文正確解密,看到了明文。是否意味著這次加密傳輸是完全安全和正確的...
    JMasche閱讀 2,425評論 0 3
  • 區塊鏈 比特幣作為第一個廣為人知的數字貨幣,因其實現了完全匿名的交易,而后被不希望別人知道他做了某種交易的人(比如...
    tolak閱讀 1,118評論 0 1
  • 本文分為7個部分,第1部分介紹密碼學的基本概念,第2部分講解常見的對稱加密算法,第3部分講解常見的非對稱加密算法,...
    youclavier閱讀 3,275評論 0 6
  • 提及江南,濕潤便滲透了血液,侵襲了靈魂。江南,因水而生,因水而靈,更因水而名。水,是這里永恒的主題。 古往今來,多...
    京起一灘鷗露閱讀 270評論 0 0
  • 潘雨馨,11月2日,讀書打卡第21次,今天我讀了三國演義第301-319頁,本章講述的主要人物是黃忠,黃忠是三國時...
    潘雨馨閱讀 249評論 0 0