1. 哈希演算法是什麼呢
哈希演算法就是一種特殊的函數,不論輸入多長的一串字元,只要通過這個函數都可以得到一個固定長度的輸出值,這就好像身份證號碼一樣,永遠都是十八位而且全國唯一。哈希演算法的輸出值就叫做哈希值。
原理:
哈希演算法有三個特點,它們賦予了區塊鏈不可篡改、匿名等特性,並保證了整個區塊鏈體系的完整。
第一個特點是具有單向性。比如輸入一串數據,通過哈希演算法可以獲得一個哈希值,但是通過這個哈希值是沒有辦法反推回來得到輸入的那串數據的。這就是單向性,也正是基於這一點,區塊鏈才有效保護了我們信息的安全性。
哈希演算法的第二個特點是抗篡改能力,對於任意一個輸入,哪怕是很小的改動,其哈希值的變化也會非常大。
它的這個特性,在區塊與區塊的連接中就起到了關鍵性的作用。區塊鏈的每個區塊都會以上一個區塊的哈希值作為標示,除非有人能夠破解整條鏈上的所有哈希值,否則數據一旦記錄在鏈上,就不可能進行篡改。
哈希演算法的第三個特點就是抗碰撞能力。所謂碰撞,就是輸入兩個不同的數據,最後得到了一個相同的輸入。
就跟我們逛街時撞衫一樣,而坑碰撞就是大部分的輸入都能得到一個獨一無二的輸出。在區塊鏈的世界中,任何一筆交易或者賬戶的地址都是完全依託於哈希演算法生產的。這也就保證了交易或者賬戶地址在區塊鏈網路中的唯一性。
無論這筆轉賬轉了多少錢,轉給了多少個人,在區塊鏈這個大賬本中都是唯一的存在。它就像人體體內的白細胞,不僅區塊鏈的每個部分都離不開它,而且它還賦予了區塊鏈種種特點,保護著整個區塊鏈體系的安全。
2. 2.安全的Hash函數一般滿足哪些要求
一般的hash函數都需要盡量滿足以下三點性質:
1.抗原像:已知y屬於y,要找出x屬於x,使得h(x)=y是困難的;
2.抗第二原像(弱抗碰撞):已知x屬於x,
找出x'屬於x,使得h(x')=h(x)是困難的;
3.抗碰撞(強抗碰撞):找出x,x'屬於x,使得h(x)=h(x')是困難的;
3. 什麼是hash函數
哈希函數(Hash Function),也稱為散列函數,給定一個輸入 x ,它會算出相應的輸出 H(x) 。哈希函數的主要特徵是:
另外哈希函數一般還要求以下兩種特點:
1、免碰撞 :即不會出現輸入 x≠y ,但是H(x)=H(y) 的情況,其實這個特點在理論上並不成立,比如目前比特幣使用的 SHA256 演算法,會有 2^256 種輸出,如果我們進行 2^256 + 1 次輸入,那麼必然會產生一次碰撞,事實上,通過 理論證明 ,通過 2^130 次輸入就會有99%的可能性發生一次碰撞,不過即使如此,即便是人類製造的所有計算機自宇宙誕生開始一直運算到今天,發生一次碰撞的幾率也是極其微小的。
2、隱匿性 :也就是說,對於一個給定的輸出結果 H(x) ,想要逆推出輸入 x ,在計算上是不可能的。如果想要得到 H(x) 的可能的原輸入,不存在比窮舉更好的方法。
hash 演算法的原理是試圖將一個空間的數據集映射到另外一個空間(通常比原空間要小),並利用質數將數據集能夠均勻的映射。目前主流的 hash 演算法有: md4 、 md5 、 sha系列 。
MD4是麻省理工學院教授 Ronald Rivest 於1990年設計出來的演算法。其摘要長度為128位,一般用32位的十六進制來表示。
2004年8月清華大學教授王小雲,指出在計算MD4時可能發生雜湊沖撞。不久之後,Dobbertin 等人發現了MD4在計算過程中第一步和第三步中的漏洞,並向大家演示了如何利用一部普通電腦在幾分鍾內找到MD4中的沖突,毫無疑問,MD4就此被淘汰掉了。
1991年,Rivest 開發出技術上更為趨近成熟的MD5演算法,它在MD4的基礎上增加了"安全-帶子"(safety-belts)的概念。雖然 MD5 比 MD4 復雜度大一些,但卻更為安全。這個演算法很明顯的由四個和 MD4 設計有少許不同的步驟組成。
MD5 擁有很好的抗修改性,即對原數據進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。
MD5很好的用在了大文件的斷點續傳上:如果有一個 5MB 的文件 客戶端把它分割成5片 1MB 的文件 在上傳的時候上傳兩個 MD5 值,一個是當前上傳的文件片的 MD5 還有一個就是拼接之後的 MD5 (如果現在上傳的是第二片 這個MD5就應該是第一片加上第二片的MD5), 通過這樣的方式能保證文件的完整性。
當如果文件傳到一半斷了,伺服器可以通過驗證文件 MD5 值就可以得知用戶已經傳到了第幾片,並且知道之前上傳的文件有沒有發生變化,就可以判斷出用戶需要從第幾片開始傳遞。
不過在2004年8月的國際密碼學會議(Crypto』2004),王小雲提出了一種快速找到 MD5 碰撞的方法(參見其 論文 ),降低了 MD5 的安全性,人們開始尋求更加可靠的加密演算法。
SHA的全稱是Secure Hash Algorithm(安全hash演算法),SHA系列有五個演算法,分別是 SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美國國家安全局(NSA)所設計,並由美國國家標准與技術研究院(NIST)發布,是美國的政府標准。後四者有時並稱為 SHA-2。SHA-1在許多安全協定中廣為使用,包括 TLS/SSL 等,是 MD5 的後繼者。
最初該演算法於1993年發布,稱做安全散列標准 (Secure Hash Standard),最初這個版本被稱為"SHA-0",它在發布之後很快就被NSA撤回,因為有很大的安全缺陷,之後在1995年發布了修訂版本,也就是SHA-1。
SHA-0 和 SHA-1 會從一個最大 2^64 位元的訊息中產生一串 160 位元的摘要,然後以 MD4 及 MD5 演算法類似的原理來加密。
2017年,谷歌發布了最新的研究成功,宣布攻破了SHA-1,並詳細描述了成功的SHA1碰撞攻擊方式,使用這種方式,可以在亞馬遜的雲計算平台上,耗時10天左右創建出SHA-1碰撞,並且成本可以控制在11萬美元以內。
即使如此,對於單台機器來說攻擊的成本依然很高,發生一次SHA-1碰撞需要超過 9,223,372,036,854,775,808 個SHA1計算,這需要使用你的機器進行6500年計算。
SHA2包括了SHA-224、SHA-256、SHA-384,和SHA-512,這幾個函數都將訊息對應到更長的訊息摘要,以它們的摘要長度(以位元計算)加在原名後面來命名,也就是說SHA-256會產生256位長度摘要。
SHA-2相對來說是安全的,至今尚未出現對SHA-2有效的攻擊!
由於目前大量的網站使用的SSL數字證數都是使用SHA-1簽名的,而SHA-1又已經不安全,各大瀏覽器廠商均宣布了棄用SHA-1的時間表:
可以看出,在時間表之後,如果檢測到網站的證書使用的還是SHA-1,就會彈出警告:
為了防止網站因出現上面的警告而顯得不專業,我們需要盡快的申請使用跟安全放心的基於SHA-2簽名的證書。
4. 區塊鏈技術中的哈希演算法是什麼
1.1. 簡介
計算機行業從業者對哈希這個詞應該非常熟悉,哈希能夠實現數據從一個維度向另一個維度的映射,通常使用哈希函數實現這種映射。通常業界使用y = hash(x)的方式進行表示,該哈希函數實現對x進行運算計算出一個哈希值y。
區塊鏈中哈希函數特性:
函數參數為string類型;
固定大小輸出;
計算高效;
collision-free 即沖突概率小:x != y => hash(x) != hash(y)
隱藏原始信息:例如區塊鏈中各個節點之間對交易的驗證只需要驗證交易的信息熵,而不需要對原始信息進行比對,節點間不需要傳輸交易的原始數據只傳輸交易的哈希即可,常見演算法有SHA系列和MD5等演算法
1.2. 哈希的用法
哈希在區塊鏈中用處廣泛,其一我們稱之為哈希指針(Hash Pointer)
哈希指針是指該變數的值是通過實際數據計算出來的且指向實際的數據所在位置,即其既可以表示實際數據內容又可以表示實際數據的存儲位置。下圖為Hash Pointer的示意圖

5. 安全的哈希函數中,函數可以是雙向的嗎
安全的哈希函數中,函數可以是雙向的。
hash就是找到一種數據內容和數據存放地址之間的映射關系了解了hash基本定義,就不能不提到一些著名的hash演算法,MD5和SHA1可以說是目前應用最廣泛的Hash演算法,而它們都是以MD4為基礎設計的。
哈希函數的特點:
哈希防碰撞用處是保證上傳和下載的數據是一樣的,就是改一點點出來的結果差很多。舉個例子,你輸入的信息是一部《紅樓夢》(當然電腦識別出來就是0和1),然後你在紅樓夢的第100頁的第五句話把一個逗號改成句號,然後輸出的hash值就完全不同了。這就是哈希函數一個非常重要的特性。
6. 什麼是Hash函數Hash函數在密碼學中有什麼作用
Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
HASH主要用於信息安全領域中加密演算法,他把一些不同長度的信息轉化成雜亂的128位的編碼里,叫做HASH值. 也可以說,hash就是找到一種數據內容和數據存放地址之間的映射關系
Hash演算法在信息安全方面的應用主要體現在以下的3個方面:
1) 文件校驗
我們比較熟悉的校驗演算法有奇偶校驗和CRC校驗,這2種校驗並沒有抗數據篡改的能力,它們一定程度上能檢測並糾正數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。
MD5 Hash演算法的"數字指紋"特性,使它成為目前應用最廣泛的一種文件完整性校驗和(Checksum)演算法,不少Unix系統有提供計算md5 checksum的命令。
2) 數字簽名
Hash 演算法也是現代密碼體系中的一個重要組成部分。由於非對稱演算法的運算速度較慢,所以在數字簽名協議中,單向散列函數扮演了一個重要的角色。 對 Hash 值,又稱"數字摘要"進行數字簽名,在統計上可以認為與對文件本身進行數字簽名是等效的。而且這樣的協議還有其他的優點。
3) 鑒權協議
如下的鑒權協議又被稱作"挑戰--認證模式:在傳輸信道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。
7. 網路安全的基石(下)— 完整性與身份認證
網路安全篇,面對復雜多變的網路環境,我們需要掌握哪些關於網路安全的相關知識,聊一聊與網路安全相關的:HTTPS、SSL、TLS 等。
在上一篇文章中,我們介紹了通過非對稱加密協商出一個用於對稱加密的秘鑰,這樣便可以保證秘鑰不會被竊取,從而實現了機密性。
但僅有機密性,距離安全還差的很遠 ...
因為雖然會話密鑰無法被竊取,但是惡意者可以嘗試修改、重組相關信息返回給網站,因為沒有完整性的保證,伺服器也只能「照單全收」。
另外,惡意者也可以偽造公鑰,如果我們拿到的是「假的公鑰」,此時的混合加密就完全失效了。可能我們以為的目標,實際上對方卻是偽冒者。
所以,今天我們就來聊一聊,在機密性這一基礎之上的完整性和身份認證等特性。
缺乏完整性的機密,可能會被黑客替換或篡改。接下來我們先來看看如何給機密增加上完整這一特性。
如果說保證機密這一特性的是加密演算法,那實現完整性的手段主要是 摘要演算法 ,也就是常說的散列函數、哈希函數(Hash Function)。
我們可以把摘要演算法近似的理解成一種特殊的壓縮演算法,它能夠將任意長度的數據「壓縮」成固定長度,而且是獨一無二的「摘要字元串」,就好像是給信息生成了一個數字「指紋」。因此好的摘要演算法必須能夠「抵抗沖突」(兩份不同的原文對應相同的摘要),讓這種可能性盡量地小。因為摘要演算法對輸入具有單向性和 雪崩效應 。
1. 單向性
所有的散列函數都有一個基本特性:如果散列值是不相同的(同一個函數),那麼這兩個散列值的原始輸入也是不相同的。具有這種性質的散列函數稱為 單向散列函數 ,即 對於給定的散列值 , 不能夠逆推出原文 。
2. 雪崩效應
雪崩效應是指當輸入發生最微小的改變時,也會導致輸出的不可區分性改變。合格的摘要演算法,無論是密鑰或明文的任何細微變化都必須引起散列值的不可區分性改變。所以摘要演算法也被 TLS 用來生成偽隨機數(PRF,pseudo random function)。
相信每個開發者在工作中都或多或少的聽過或用過 SHA-1 (Secure Hash Algorithm 1)和 MD5 (Message-Digest 5),它們就是最常用的兩個摘要演算法,能夠生成 20 位元組和 16 位元組長度的數字摘要。遺憾的是它們先後分別在 2005 年和 2009 年被破解,在 TLS 里已經被禁止使用了。
目前 TLS 推薦使用的是 SHA-1 的後繼者 SHA-2,區別於前者,它屬於 密碼散列函數
演算法標准,由美國國家安全局研發。總共有 6 種 ,常用的有 SHA224、SHA256 及 SHA384,它們分別能夠生成 28 位元組、32 位元組及 48 位元組的摘要。
摘要演算法能夠保證「數字摘要」和原文是完全等價的,所以,我們只要在原文後附上它的摘要,就能夠保證數據的完整性。
該怎麼理解呢?客戶端將消息和消息摘要(SHA-2)發送給服務端之後,服務端拿到後也計算下消息的摘要,對這兩份「指紋」做個對比,如果一致,就說明消息是完整可信的,沒有被修改。因為即使是對消息的很小變動(例如一個標點符號,這就是雪崩效應),摘要也會完全不同,服務端計算對比就會發現消息被篡改,是不可信的。
不過,大家這時候肯定也看出了問題,摘要演算法不具有機密性,如果明文傳輸,那麼黑客可以修改消息後,把摘要也一起修改。
所以,真正的完整性必須建立在機密性之上,就是在上期講解的《 網路安全的基石(上)— 加密 》:在混合加密系統里用會話密鑰加密消息和摘要,這樣黑客無法得知明文,也就沒有辦法「動手腳了」。
加密和摘要實現了通信過程的機密性和完整性,我們的通信過程可以說是比較安全了。但這里還有漏洞,那就是通信的兩端。
對於通信的兩端,我們還要解決身份認證的問題。簡單來說,就是如何證明對方真實身份。因為黑客可以偽裝成網站來竊取你的信息,反過來,他也可以偽裝成你,向網站發送支付、轉賬等消息,網站沒有辦法確認你的身份,錢可能就這樣被偷走了。
回想下現實生活中,解決身份認證常用的手段有簽名、手印和印章等,只要在紙上寫下簽名加上蓋章,就能證明這份文件確實是由本人而非其他人發出的。
那在 TLS 什麼東西和生活中的手印、印章很像,只能由本人持有呢?只要有了這個東西,就能夠在網路世界裡證明你的身份。回想下前面我們介紹的內容,大家也很容易想到,它就是非對稱加密里的 私鑰 ,使用私鑰再加上摘要演算法,就能夠實現 數字簽名 ,同時實現 身份認證 和 不可否認 。
簽名與驗簽
數字簽名的原理其實也不復雜,就是將公鑰和私鑰的用法反過來,之前是公鑰加密,私鑰解密; 現在是私鑰加密 , 公鑰解密 。
簽名和公鑰一樣完全公開,任何人都可以獲取。但這個簽名只有用私鑰對應的公鑰才能解開,拿到摘要後,再比對原文驗證完整性,就可以簽署文件一樣證明消息確實是你發的。整個過程的兩個行為也有其專用術語,分別叫做 簽名 和 驗簽 。
回顧下安全通信的四大特性我們都已經實現了,整個通信過程是不是已經完美了呢?答案不是的,這里還有一個「公鑰的信任」問題,因為誰都可以發布公鑰,我們還缺少防止黑客偽造公鑰的手段。關於該部分內容你可以參考下篇文章 《公鑰信任問題 — 數字證書與 CA》 。
總結
網路安全涉及了方方面面太多的知識,尤其是網路的基礎知識對我們來說還是非常重要的,關於這部分大家又有什麼要分享的?歡迎你的分享留言或指正。
網路安全系列專題
8. 什麼是Hash函數Hash函數在密碼學中有什麼作用
hash函數頁稱散列函數
哈希函數
雜湊函數,是一個從消息空間到像空間的不可逆映射。作用:數字簽名,生成程序或文檔的「數字指紋」,用於安全傳輸和存儲口令!