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

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

本次的越寫越快樂系列為大家?guī)韱蜗蛏⒘泻瘮档姆窒恚簿褪俏覀兘洺Uf的哈希函數的統(tǒng)稱瞬逊,接下來我會通過以下幾個方面來說明單項散列函數的內容。

相關術語

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

什么是單項散列函數

這個文件是不是真的呢

Alice在公司從事軟件開發(fā)工作粘昨。一天晚上垢啼,她的軟件終于完成了,接下來只要把文件從Alice的電腦中復制出來并制作成母盤就可以了张肾。
但是Alice已經很累了芭析,她決定今天晚上早點回家休息,明天再繼續(xù)弄吞瞪。
第二天馁启,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 - 通過偽隨機數生成器產生的隨機值)混合計算其散列值塘淑,然后將這個散列值用作加密的密鑰萝招。

消息認證碼

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

數字簽名

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

偽隨機數生成器

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

一次性口令

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

單向散列函數的具體例子

MD系列

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

SHA系列

SHA-1是由NIST(美國國家標準技術研究所)設計的一種能夠產生160比特的散列值的單向散列函數次和。
1993年被作為作為美國聯(lián)邦信息處理標準規(guī)格(FIPS PUB 180)發(fā)布的是SHA(安全散列算法)反肋。
1995年發(fā)布的修訂版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上發(fā)布了一款名為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 - 建議使用

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

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

總結

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末肋联,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刁俭,更是在濱河造成了極大的恐慌橄仍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牍戚,死亡現(xiàn)場離奇詭異侮繁,居然都是意外死亡,警方通過查閱死者的電腦和手機如孝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門宪哩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人第晰,你說我怎么就攤上這事锁孟”蜃妫” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵品抽,是天一觀的道長涧至。 經常有香客問我,道長桑包,這世上最難降的妖魔是什么南蓬? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮哑了,結果婚禮上赘方,老公的妹妹穿的比我還像新娘。我一直安慰自己弱左,他們只是感情好窄陡,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拆火,像睡著了一般跳夭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上们镜,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天币叹,我揣著相機與錄音,去河邊找鬼模狭。 笑死颈抚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的嚼鹉。 我是一名探鬼主播贩汉,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锚赤!你這毒婦竟也來了匹舞?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤线脚,失蹤者是張志新(化名)和其女友劉穎赐稽,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體酒贬,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡又憨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锭吨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡寒匙,死狀恐怖零如,靈堂內的尸體忽然破棺而出躏将,到底是詐尸還是另有隱情,我是刑警寧澤考蕾,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布祸憋,位于F島的核電站,受9級特大地震影響肖卧,放射性物質發(fā)生泄漏蚯窥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一塞帐、第九天 我趴在偏房一處隱蔽的房頂上張望拦赠。 院中可真熱鬧,春花似錦葵姥、人聲如沸荷鼠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽允乐。三九已至,卻和暖如春削咆,著一層夾襖步出監(jiān)牢的瞬間牍疏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工拨齐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留麸澜,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓奏黑,卻偏偏與公主長得像炊邦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熟史,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 為什么要有單向散列函數 作為接收者馁害,如果將得到的密文正確解密,看到了明文蹂匹。是否意味著這次加密傳輸是完全安全和正確的...
    JMasche閱讀 2,373評論 0 3
  • 區(qū)塊鏈 比特幣作為第一個廣為人知的數字貨幣碘菜,因其實現(xiàn)了完全匿名的交易,而后被不希望別人知道他做了某種交易的人(比如...
    tolak閱讀 1,071評論 0 1
  • 本文分為7個部分限寞,第1部分介紹密碼學的基本概念忍啸,第2部分講解常見的對稱加密算法,第3部分講解常見的非對稱加密算法履植,...
    youclavier閱讀 3,208評論 0 6
  • 提及江南计雌,濕潤便滲透了血液,侵襲了靈魂玫霎。江南凿滤,因水而生妈橄,因水而靈,更因水而名翁脆。水眷蚓,是這里永恒的主題。 古往今來反番,多...
    京起一灘鷗露閱讀 263評論 0 0
  • 潘雨馨沙热,11月2日,讀書打卡第21次罢缸,今天我讀了三國演義第301-319頁篙贸,本章講述的主要人物是黃忠,黃忠是三國時...
    潘雨馨閱讀 240評論 0 0