- 區塊鏈架構之美:從比特幣、以太坊、超級賬本看區塊鏈架構設計
- 何昊編著
- 1491字
- 2021-07-23 17:31:09
1.5 哈希算法
哈希(Hash)算法又常稱為指紋(Fingerprint)或摘要(Digest)算法,是非常基礎也非常重要的一種算法。哈希算法可以將任意長度的二進制明文映射為較短的(通常是固定長度的)二進制串(哈希值),并且不同的二進制明文很難映射為相同的二進制串。
消息摘要是指采用單向哈希函數將需要計算摘要的數據提取摘要后生成一串固定長度的密文,這一串密文又稱為數字指紋。數字指紋有固定的長度,并且不同的明文提取摘要生成的密文結果總是不同的,但是同樣的明文產生的摘要是一致的。由于生成摘要的明文沒有任何限制,但是得到的摘要卻是定長的,因此必然有一些明文會產生相同的摘要,這種現象稱為“碰撞”。為了避免這種情況的產生,哈希函數必須具備很好的抗碰撞性,這意味著在現有的計算資源(包括時間、空間、資金等)下,找到一個碰撞是不可行的。
消息摘要算法有一個特性,就是在輸入消息的過程中,如果消息發生了細微的改變,如改變輸入消息二進制數據中的一位,最后都會導致輸出結果大相徑庭。因此,消息摘要算法對于檢測消息或密鑰等信息對象中的微小變化非常有用。從中可以歸納出消息摘要算法的如下三個特點。
? 消息摘要算法的輸入長度是任意的,輸出長度是固定的。
? 對消息摘要算法給定輸入,計算輸出是很容易的。
? 給定消息摘要算法H,找到兩個不同的輸入,輸出為同一個值在計算上不可行。
? 常見的消息摘要算法:MD5、SHA、SHA256、SHA512、SM3等。
在本書中,經常會看到SHA256這個消息摘要算法,這個算法是在比特幣系統和以太坊中大量使用的消息摘要算法。SHA256對任意的輸入產生定長的32B,256bit的輸出,為了更方便地展示,一般采用Hex編碼的方式來對結果進行編碼。以123為例,對其使用SHA256計算后,用Hex編碼得到的結果是a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3。
消息摘要算法并不是一種加密算法,不能用于對信息的保護,但是消息摘要算法常用于對密碼的保存。例如,用戶登錄網站需要通過用戶名和密碼來進行驗證,如果網站后臺直接保存了密碼的明文,一旦發生了數據泄露,后果不堪設想,因為大多數用戶都傾向于在多個網站使用相同的密碼。為了避免這種情況的出現,可以利用哈希算法的特性,網站后臺不直接保存明文密碼,而保存用戶密碼的哈希值,這樣當用戶登錄時比較密碼最終的哈希值即可,如果一致,則證明登錄密碼是正確的,即使發生了數據泄露也很難根據單向哈希值推算出用戶原始的登錄密碼。
但是,有時因為用戶口令的強度太低,只使用一些簡單的字符串,如123456,攻擊者可以通過對這些口令提前計算哈希值,得到口令和哈希值的一種映射關系來達到破解的目的。為了提高安全性,網站一般會通過加鹽(Salt)的方式來計算哈希值,不直接保存用戶密碼的哈希值,而將密碼加上一段隨機字符(鹽)再計算哈希值,這樣把哈希值和鹽分開保存可以極大地提高安全性。
消息摘要算法可以用于驗證數據的完整性,但僅在數據的摘要與數據本身分開傳輸的情況下可以驗證。否則攻擊者可以同時修改數據和摘要,從而輕易地避開檢測。消息驗證碼(Message Authentication Code,MAC)或密鑰哈希值(Keyed Hash)是增加了身份驗證來擴展摘要函數的密碼學函數,只有擁有了摘要密鑰,才能生成合法的MAC。
MAC通常與密文一起使用。加密通信可以確保通信的機密性,卻無法保證通信消息的完整性,如果攻擊者Mallory的能力非常強大,以至于可以修改Alice和Bob通信中的密文,他就可以誘導Bob接收并相信偽造的信息。但是,當MAC和密文一起發送時,Bob就可以確認收到的消息未遭到篡改。
任何消息摘要算法都可以作為MAC的基礎,其中一個基礎是基于摘要的消息驗證碼(Hash based Message Authentication Code,HMAC)。HMAC的本質是將摘要密鑰和消息以一種安全的方式交織在一起的函數。在本書的第8章數字錢包章節中可以看到HMAC-SHA512這樣的消息驗證碼,它表明基于摘要的消息驗證碼是以SHA512摘要函數為基礎的。
- Mastering Visual Studio 2017
- JavaScript百煉成仙
- Android應用程序開發與典型案例
- Java入門經典(第6版)
- C#程序設計實訓指導書
- AWS Serverless架構:使用AWS從傳統部署方式向Serverless架構遷移
- 樂學Web編程:網站制作不神秘
- 軟件測試項目實戰之性能測試篇
- Java從入門到精通(第4版)
- Groovy for Domain:specific Languages(Second Edition)
- 老“碼”識途
- PostgreSQL Replication(Second Edition)
- Python數據結構與算法(視頻教學版)
- Android嵌入式系統程序開發:基于Cortex-A8(第2版)
- BeagleBone Robotic Projects(Second Edition)