SHA-256、MD-5……哈希散列函數這些原理你懂了嗎?

2021-01-09 巴比特資訊

作者:wagslane

譯者:火火醬

出品:區塊鏈大本營

本文對哈希函數進行簡要的介紹,旨在幫助讀者理解為什麼要使用哈希函數,以及其基本工作原理。文中將省略具體證明和實現細節,而將重點放在高級原理上。

為什麼要使用哈希函數

哈希函數被廣泛應用於網際網路的各個方面,主要用於安全存儲密碼、查找備份記錄、快速存儲和檢索數據等等。例如,Qvault使用哈希散列將主密碼擴展為私人加密密鑰。

(Qvault:https://qvault.io/)

用途列表清單詳見: https://en.wikipedia.or/wiki/Hash_function#Uses

本文將重點介紹哈希函數的幾個重要特性,也可以說是其最重要的特性:

哈希函數確定性地加擾數據;無論輸入是什麼,哈希函數的輸出大小始終相同;無法從加擾的數據中檢索原始數據(單向函數);確定性地加擾數據

首先,想像一個魔方。

我們從恢復魔方開始。如果我們隨機轉動魔方,到最後,魔方將會呈現和開始時完全不同的狀態。同樣,如果我們重新開始,重複完全相同的動作,那麼我們會不斷得到完全相同的結果。儘管看起來結果可能是隨機產生的,但實質上並非如此。這就是「確定性」的意思。

「確定性」在安全存儲密碼方面起著至關重要的作用。例如,假設我的密碼是「iLoveBitcoin」。我可以使用哈希函數對其進行加擾:

iLoveBitcoin→ 「2f5sfsdfs5s1fsfsdf98ss4f84sfs6d5fs2d1fdf15」

現在,如果有人看到這個加擾後的版本,他們也不會知道我的原始密碼!這一點非常重要,因為這意味著,作為一名網站開發人員,我只需存儲用戶密碼的哈希散列(加擾數據),即可對其進行驗證。

當用戶進行註冊時,我對密碼進行哈希散列處理,並將其存儲在資料庫中。當用戶登錄時,我只需再次對輸入的內容進行哈希散列處理,並比較兩個哈希值。由於特定的輸入始終會輸出相同的哈希值,所以該方法每次都可以成功驗證密碼。

如果網站以純文本格式存儲密碼的話,則會出現巨大的安全漏洞。如果有人入侵該網站,那麼他將會能獲取所有的電子郵件和密碼,並可以嘗試在其他網站上使用這些信息進行登錄。

無論輸入是什麼,輸出大小始終相同

如果對單個單詞進行哈希,則輸出將是特定的大小(對於特定的哈希函數SHA-256來說,其大小是256 bits)。如果對一本書進行哈希,其輸出也將是相同的大小。

這是其另一個重要特性,因為這可以節省我們的計算時間。典型的例子是在數據映射(data map)中使用哈希散列作為鍵(key)。數據映射是計算機科學中用來存儲數據的簡單結構。

當程序在映射中存儲數據時,會向映射提供鍵(key)和值(value)。當程序想要訪問該值時,它可以向映射提供適當的鍵並接收相應的值。數據映射的優勢在於它們可以立即找到數據。該鍵被用作計算機能夠立即找到的地址,這樣一來,就不必花費數小時在數百萬條記錄中進行搜索了。

因為鍵就像地址一樣,不能太大。如果想將書籍存儲在數據映射中,則可以對書籍的內容進行哈希散列處理,並使用哈希值作為鍵。作為一名程式設計師,我可以輕而易舉地使用哈希散列來查找該書的內容,而不必按標題、作者等對數千條記錄進行排序。

其工作原理是怎樣的呢?

這部分是本文的難點,我會儘量將其簡化,省略實際的實現細節,重點介紹計算機在使用哈希散列處理數據時工作原理的基本概念。

下面讓我們來看一下我為此專門編寫的一個算法——LANEHASH:

我們從要進行哈希散列的數據開始

我把字母和數字轉換成1和0 (計算機中的所有數據都以1和0的形式進行存儲,不同的1和0的組合代表了不同的字母)

此時,我們通過各種預設的步驟對數據進行轉換。步驟內容可以是任意的,但重要的是,每次使用LANEHASH時,我們都需要遵循相同的步驟,以便我們的算法具有確定性。我們將前4位從左側移到右側:

每隔1 位(bit)進行間隔:

我們把這兩部分轉換為以十進位的數字。十進位是我們在學校中學過的「正常的」數字系統。(所有的二進位數據實際上都是數字,你可以在其他網站上在線查詢如何將二進位轉換為十進位數字)

我們將這兩個數字相乘:

然後對該數進行平方:

再將該數字轉換回二進位:

從右側切掉9 bits後正好得到16 bits:

然後將該二進位數據轉換回英語:

如上所示,如果輸入相同,那麼最後終將會得到相同的輸出結果。但是,如果改變任何一個字母,最終的結果也將發生巨大變化。免責聲明:

在我將英語轉換成二進位,並將二進位轉換成英語的步驟中,並沒有遵循任何模式。有許多不同的方法可以將二進位數據轉換成英語並轉換回去,我只是不想在本文中展開討論這個問題。感興趣的話,你可以通過以下連結進行了解:

https://en.wikipedia.org/wiki/ASCII

https://en.wikipedia.org/wiki/Unicode原文:https://hackernoon.com/a-very-basic-intro-to-hash-functions-sha-256-md-5-etc-21wp24jk

相關焦點

  • 密碼轉化為散列值真的安全嗎?Python中hashlib模塊使用詳解
    是哈希不是嘻哈,你真的了解散列嗎?hashlib模塊Python中hashlib模塊內置了各種hash算法,文檔中hashlib是這樣解釋的:A common interface to many hash functions(許多散列函數的公共接口)
  • 從哈希函數、哈希衝突、開散列出發,一文告訴你哈希思想與哈希表構造到底是什麼!
    、雜湊,或音譯為哈希,是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。哈希函數散列函數(英語:Hash function)又稱散列算法、哈希函數,是一種從任何一種數據中創建小的數字「指紋」的方法。
  • SHA3-256加密可防量子攻擊 再過幾十億年都沒問題
    Ye Olde 哈希散列標準似乎能扛過薛丁格的量子貓雖然有理由假想真正的量子計算機將摧毀傳統非對稱加密,但可能會很驚訝地發現
  • 10分鐘了解一致性哈希算法,全網(小區區域網)(建議收藏)
    很多同學應該都知道什麼是哈希函數,在後端面試和開發中會遇到「一致性哈希」,那麼什麼是一致性哈希呢?名字聽起來很厲害的樣子,其實原理並不複雜,這篇文章帶你徹底搞懂一致性哈希!進入主題前,先來一場緊張刺激的模擬面試吧。模擬面試面試官:看你簡歷上寫參與了一個大型項目,用到了分布式緩存集群,那你說說你們是怎麼做緩存負載均衡?
  • sha1 EV代碼籤名證書
    SHA和MD系列算法是一種基於散列算法的單向加密算法,也就是說明文一經加密(散列),密文就不可以再被恢復為明文。一般用於數字籤名和簡單認證。sha1 EV代碼籤名證書EV代碼證書可以支持SHA1算法其實也可以使用。
  • 人們常說的哈希(Hash)到底是什麼?
    了解過區塊鏈的朋友,一定聽過「哈希」這一詞彙,然而對哈希的概念又極其的模糊,那麼哈希是什麼呢?Hash一般被翻譯成「散列」,也可直接音譯為「哈希」,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。
  • 一口氣講透一致性哈希(Hash),助力「碼農變身」
    如今雲計算、大數據、物聯網、AI的興起,使得分布系統得到了前所未有的廣泛應用,然而由於分布式系統具有極高的複雜度,帶來了許多難題,一致性哈希就是為了解決分布式難題之一應運而生的,本篇主要圖示講解一致性哈希的原理及其應用,助力碼農變身。
  • Comunion 區塊鏈深度學習系列|什麼是哈希
    本系列內容包含:基本概念及原理、密碼學、共識算法、錢包及節點原理、挖礦原理及實現。發展史哈希算法是為了檢測數據在傳輸的過程當中是否被篡改而誕生的。開發者採用的算法也是根據哈希算法的成熟度,來不斷的去採用更成熟、更好的算法。所以如果讀者想設計一個區塊鏈系統,如果裡面涉及到使用哈希算法的話,那麼一定要選擇更好哈希算法,而不是一味模仿之前的系統,這些 SHA 算法僅僅是一個加密算法而已,沒有我們想的那麼神秘。
  • 那是你還不懂這些密碼儲存的操作
    更好的方法是使用單向加密哈希函數。散列函數在輸入和輸出之間提供多對一映射,實際上不可能反轉輸出。好的加密哈希函數具有較少的衝突(即,對於函數的不同輸入值,很難獲得相同的輸出)。由於鴿洞原理,無法完全避免碰撞。對於哈希密碼,我們可以假設哈希函數將生成唯一的輸出,即對於沒有兩個不同的密碼,我們將獲得相同的哈希值。一些流行的加密哈希函數是MD5和SHA1。
  • 受果蠅啟發的哈希算法!用「生物學上合理的」突觸可塑性規則生成...
    這個算法的靈感來自於果蠅的嗅覺迴路,它可以產生哈希碼——物體的數字表示——其性能優於經典算法。不幸的是,由於FlyHash使用隨機投影,它無法從數據中學習。他們說,它比之前發布的各種哈希方法的基準測試都要好,而且它可以生成對相似度搜索有用的二進位表示。
  • 區塊鏈加密機制的不同算法及其原理解析
    Hash函數是一個無比神奇的東西,說他替中本聰打下了半壁江山一點不為過,學習比特幣應該從學習Hash函數入手,理解了Hash函數再去學比特幣原理將事半功倍,不然將處處感覺混沌,難以開竅。 礦工在處理交易數據(對數據也是進行哈希)的同時不斷的進行哈希計算,求得一位前23位為0的哈希值,這個值成為nonce黃金數。當全網有一位礦工哈希出nonce時,他就會把自己打包的區塊公布出去,其他節點收到區塊驗證區塊後就會一致性認為這個區塊接到了區塊鏈上,就繼續進行下一個區塊的打包和哈希計算。
  • 她任教山東大學,後被清華聘請,破解國際通用哈希函數而出名
    於是王小雲從當時最安全,也是全世界最通用的哈希函數開始研究起。當時的她也沒有很大的想法說非要幹出個什麼來。結果後來破解了被許多專家聲稱不可破解的哈希函數。那麼我們來了解一下哈希函數是如何運行的。MD5和SHA-1這兩個函數是一種加密的哈希函數,而且兩者的返回值永遠是固定的。
  • 什麼是一致性哈希算法
    因此,就有個問題,如何將這些海量的數據分配到各個機器中?數據分布到各個機器存儲之後,又如何進行查找?這裡主要記錄一致性Hash算法如何將數據分配到各個機器中去。2,衡量一致性哈希算法好處的四個標準①平衡性。平衡性是指哈希的結果能夠儘可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。②單調性。
  • 機器學習時代的哈希算法,將如何更高效地索引數據
    考慮如下的一個簡單的哈希函數,我們假定其中的鍵為整數:function hashFunction(key) {return (key * 13) % sizeOfArray; }雖然任何唯一的整數在乘以 13 時會產生唯一的結果,但由於鴿巢原理(Pigeonhole principle),我們無法在每個桶只放一個物品的情況下將 6 個物品放入 5 個桶中,最終的哈希碼仍然會重複出現
  • 量子計算機真的能摧毀它嗎?
    2001年IBM的華裔研究員艾薩克·莊他們的研究團隊,通過核磁共振進行了秀爾算法演示,即5個氟原子和兩個碳原子組成的一個分子,用每個原子的核自旋來做量子比特,7個qubit相當於2^7也就是128個經典比特。用這臺迷你量子計算機使用秀爾算法進行了15的質因數分解,給出的結果是3和5,成功證明了秀爾算法是可行的。
  • 用Emoji 表情符號,為你科普比特幣知識(第一部分)
    為了更好地說明不可變的公共分布式帳本的力量,讓我們想像一個常見的但是假設的情況,這種情況涉及到價值5美元的比特幣。 (比特幣的價值可能會上升或下降,但5美元可能只是單個比特幣的一小部分。)假設我的朋友伊莉莎白發給我5美元的比特幣。想每筆交易一樣,這筆交易會馬上被記錄在區塊鏈中。反過來,我給你發去5美元,因為每個區塊鏈副本現在都表明我擁有過去屬於伊莉莎白的5塊錢。
  • 量子計算機真的能摧毀區塊鏈網絡嗎?
    Landauer原理 比特幣的加密算法有兩類三種,分別是橢圓曲線算法、SHA256哈希算法和RIPEMD160哈希算法。 哈希算法 比特幣運用的兩種哈希算法中,SHA256是SHA-2下細分出的一種算法,它是一種密碼散列函數算法標準,由美國國家安全局研發;RIPEMD (RIPE Message Digest) 也是一種哈希函數。對於對稱加密與哈希函數,存在量子攻擊,但危險性較小。