摘要:Hash函數是一類基礎密碼算法,主要用于檢測消息完整性,與簽名算法一起保證電子簽名的合法性與抗抵賴性,是設計眾多密碼系統的關鍵部件,如消息認證碼、區塊鏈和可證明安全密碼系統等。本文介紹了Hash函數的基本安全屬性及其在密碼系統設計中的重要應用,特別是區塊鏈技術與產業中的重要應用。
王小云 ? ?中國科學院院士,國際知名密碼學專家
關于區塊鏈技術,我有不同的感受。我是1995年開始做Hash函數的研究,因為當時Hash函數有三個安全屬性,這三個安全屬性被用來設計各種各樣的密碼體制,各種各樣的密碼系統離不開Hash函數。因為很多密碼系統在攻擊的時候,有一種攻擊就是直接把密鑰求出來完全破解,有的是通過修改函數得到密鑰或敏感信息被破解,而防止修改函數是通過Hash函數來保障的。我當時做Hash函數的分析,就一點,就是認為,很多密碼系統的安全性還是Hash函數,我要分析Hash的安全性。我也非常幸運,把國際上當時的兩大算法給出了非常好的碰撞解攻擊,這是我做的一個工作。
區塊鏈技術和現在做的很多事情,我也感覺到非常激動。以前Hash函數用來綁定各種各樣的敏感信息,比如這個密碼系統是安全的,今天我們用Hash函數綁定各種各樣的交易系統,就變成到我們今天的區塊鏈。只是綁定信息的內容不一樣,所以導致它的功能不一樣。所以說,區塊鏈技術是Hash函數的定義,但是密碼Hash函數,不是指的網絡互聯網系統里的Hash函數,是密碼Hash函數定義產生的那一天起,實際上就已經有了區塊鏈技術,只是我們不清楚,當時只是局限在綁定密碼系統的Hash參數上,而不是綁定交易信息本身。但是確實Hash函數綁定交易信息的時候,有各種各樣的應用,應用在各種場景里,非常靈活多變。下面首先看一下Hash函數的定義和應用。
?一、Hash函數簡介及應用。
密碼學的重要性性,是網絡空間安全的理論支撐,所有的科學問題仍然是數學問題。網絡信息安全的四大屬性,加密算法保證的是機密性,數字簽名算法保證的是可認證性和不可抵賴性,好多老師都是用這兩個屬性。Hash函數保證的是完整性,但是Hash函數一定要綁定數字簽名的敏感信息,保證完成可認證性和不可替代性的問題。所以,沒有Hash函數數字簽名,本身是漢南完成可認證性和不可否認性的。大家可以看出來,Hash函數和三個安全屬性有關系,唯獨跟機密性關聯性不大,但是也有人設計了一種加密算法,也使用了Hash函數,是這么一個關聯性。
為什么要用Hash函數呢?1981年為了避免RSE的攻擊,提出了密碼Hash函數。實事求是講,非常簡單,因為所有的電子簽名算法有一個代數結構,Hash就是為了破壞它的代數結構。通過綁定信息,破壞代數結構來完成。Hash實際上就是一個壓縮函數,它把任意一個消息壓縮為固定長度的數字指紋,每個人的指紋都是世界獨一無二的。如果你把這個消息提煉一個數字指紋以后也是獨一無二的,只不過這個數字指紋有128BT、160BT、192BT,或者是256BT,最長的可以到512BT,這個消息串就是這個消息的指紋。你拿到這個指紋去簽名,干其他事情就可以了。
Hash函數有個屬性,大家一定要知道,你要學區塊鏈只要記三個屬性,其他的不用記了。一個是碰撞性,如果兩個合同,比如100萬和2000萬的壓縮結果數字指紋是相同的,它的簽名一定是相同的。所以說,Hash函數一定要抗碰撞攻擊。我們也有電子簽名法,我們有網絡安全法,也有電子簽名數字驅動這一塊,實際上就是基于這個無碰撞性,兩個消息不能發生碰撞。有碰撞的話,你就不能證明哪個是合法的,哪個是非法的。還有一個就是抗原像攻擊,我知道這個消息的指紋以后,我不能恢復它的源消息M,不能得到消息M的任何一BT的信息,任何信息都不能得到。大家想像一下,如果有保護口令,M是我的口令,用了Hash函數,那么口令就很難得到,是得不到的。因為我的電腦里存放的是它的Hash值,而不是口令本身,這是保護口令的一個屬性,當然,也可以保護其他的,可以綁定我們的交易信息。M藏起來,你只能看到Hash值,得不到M的任何信息。所以根據你的實際應用靈活使用,我講的意思就是你可以在任何交易里面靈活使用,不是一個死的東西。
第二原像攻擊,就是說,有一個消息M1,你不能得到另外一消息M2和M1的數字指紋是一樣的,也就是一個消息有指紋,有簽名,不能達到另外一個消息跟它的簽名是一樣的。大家也可以看出,簽名的工具可以通過碰撞得到攻擊,也可以通過求解第二原像得到攻擊,不是單一的。也可以求解原像得到他的攻擊,都沒問題,可以圍繞一個新的消息,都是可以的。所以大家要注意一下,它的功能就是說,一種攻擊可以通過多種屬性破解來達到攻擊的效果,只是攻擊的難度不一樣而已。攻擊難度我就不講了,因為今天不是一個純學術的。
Hash函數可以用在很多種密碼系統,我們的電子簽名、數字證書、比特幣、區塊鏈,各種各樣的可證明安全系統。大家可以看一下SSR、VTA、RPJACK里面,都有了Hash函數來保障它的安全性。當然它的安全性有很多地方,有很多保障點,Hash函數肯定是很關鍵的地方,來保障它的安全性。有一點毋庸置疑,就是一個Hash函數的破解可以導致眾多基于Hash函數的密碼系統被破解。大家可以有一個很典型的實例就是火焰病毒,火焰病毒我們做了MD5的破解以后,火焰病毒就是用MD5破解的。實際上我聽了很多業界的人在講火焰病毒,但是大家可以參考一下密碼里面把火焰病毒的攻擊路線拿出來了,大家一看這個主體路線,肯定是我們給出來的MD5的主體路線。那個框架就是我2005年的一次談話,后來我花了一陣子時間給他一個攻擊的框架,兩個一結合,實際上就是一個火焰病毒。通過密碼計算機技術,把它嵌入到微軟操作系統的升級里面,就是我們的火焰病毒。所以說大家一定要注意一下,一個算法不安全,你不知道它會在哪里發生攻擊。
這就是當時國際上主要的Hash函數算法,MD是第一次破解,MD5、沙盤都是我們第一次破解的,給出的是碰撞攻擊。歐洲的MD160還是安全的,沙盤沒能被破解,沙盤破解以后,又花了5年的時間新設計了算法。還有一個算法就是SM沒寫進來,SM是國產的算法,是當時我們破解了MD5沙盤以后一個團隊設計的新的算法。大家可以看出來,安全算法不是太多,但是大家要注意一點,沙圖做了比特幣,比特幣就是用沙圖來做的。
實際上我們看看Hash函數的應用,第一個就是電子簽名,我對一個文件進行簽名,首先對它進行壓縮,得到數字指紋,然后對數字指紋調用RSA或者是SM2,或者是ECC,我們就可以得到它的簽名,就是這樣一個架構。我們也可以看一看Hash函數的登錄系統,管理員可以從數據庫里面得到用戶密碼,有口令,所以口令并不是密碼。但是如果你的口令是用Hash函數來放的,并且如果是動態的就更安全,可以是放的動態的,這個時候,它的安全性就非常高,大家可以參考一下。實際上我要做一個登錄系統,用Hash函數加上動態的一些技術,就可以保證你登錄的安全性,實際上也比較簡單,非常成熟,就是大家可能在用的時候不知道它是怎么樣來保證安全性。雖然你用的是Hash函數,我也是用的Hash函數,但是你用的Hash函數不安全,我用的Hash函數可能就是安全的。所以大家要了解一下,這個密碼技術的本質是什么就可以了。
Hash函數可以延伸密鑰。為什么?大家知道,我們在加密的時候都是用的對稱密碼算法。對稱密碼算法的密鑰一個月、半年、兩年換一次,密鑰怎么換?有一個主密鑰,每一次換的是用Hash函數來衍生就行了,是最好的一個辦法。并且每次衍生的時候,兩個人選一個隨機數,它就是絕對隨機的動態密鑰的一個生成的辦法。你的U盾里面每次可以存放這個衍生以后的算法,主密鑰可以不要了,流掉就可以了,所以說是非常好的技術。我不知道他們是怎么做的,這種技術可以放在銀行的U盾里面,可以作為公司的一個產品來賺錢就可以了。
二、比特幣。
跟比特幣區塊鏈有很好的聯系,比特承諾,就是說Alice有一個秘密,我要賣錢,我要有一個秘密,要進行承諾,Alice過后要驗證,比如我知道一個預測股票升或者降的很好的軟件,我要放在這個Hash里面,要公開它的Hash值,M不公開。Alice要驗證,我先承諾,把Hash值定高。比如說一個月以后,包括我預測的股票該升的升,該降的降,成功率很高,他就要買我的這個軟件。承諾這個M,我要對M進行一次壓縮,就是對它進行一次承諾。隱藏了M的所有信息,Bob得不到M的任何信息。如果他要得到了以后,他就不用買你的了,他就可以預測了,所以說,Bob不能得到M的任何信息,Alice不能替換和篡改M的任何信息,大家可以看一下,Bob得不到M的信息是原像攻擊,Alice不能替換和篡改M的任何信息是第二原像攻擊和碰撞攻擊,可以事先做,后面就是碰撞攻擊。大家可以看出來,基本上這三個屬性,把大家所有攻擊的企圖就達到了。三個屬性就夠了,任何人不能在Hash函數上做文章,想得到攻擊是不可能的,三個屬性已經足夠了。你可以想各種攻擊,基本上不可能成功,這就是密碼的用途,能把所有的攻擊擋在外面。
這個就是我們通常叫做,M我們就是隱藏性,就隱藏信息了。綁定性就是說Alice一旦做出了承諾以后,這個信息不能再進行修改,過后你打開的一定是源信息,不能是修改以后的信息。如果你打開的是修改以后的信息,那就意味著你已經成功的進行了碰撞攻擊或者是第二原像攻擊,那是不可能的,因為它是世界性的數學難題。除了MD5沙盤對我們破解的算法以外的,其他的仍然是安全的。
這是證明,大家可以看出Hash函數的妙用。為什么我們設計密碼系統是安全的?大家知道,身份證明我就不再講了,你要證明沒有一個秘密,Alice要向Bob證明一個秘密,又不能讓Bob知道這個秘密本身是什么東西,但是Bob又要相信你知道這個秘密,你就要用知識知名。Bob搜一個挑戰,0或者是1,我就給出一個回應,證明一個式子,這個我就不再講了。一般來講,要交互128次,效率特別慢。但是我用了Hash函數就不一樣了,Hash函數一次性就可以完成。不用交互,一次性完成就行了,這就是Hash函數的一個妙用。
這個圖顯示了,你利用Hash函數證明我知道一個秘密,就是Alice只要把一些參數,R和Y公布以后,Alice知道都有一個JX秘密,知道一個秘密。最后Bob連挑戰R都不給了,Alice最后自己直接計算,一個Y和R的驗證,任何人都可以驗證,β=A的Y次方,V的R次方。Alice藏在V里面的秘密,只要計算兩個值,所有的人一驗證就知道我知道了這個秘密,非常簡單,一次性解決這個問題。所以Hash函數多么好用?讓我們的互聯網變得極其簡單而又可信,這就是它的應用。
為什么看一些論文里面,大量的都是可證明安全的論文,基本上都是Hash函數,用起來特別方便簡便,只是根據實際需要來設計不同的系統,根據不同的攻擊的場景,設計不同的系統,是做這樣的工作。但是比特幣我們就開始走向另外一方面,跟交易有關系了。比特幣不管這個人是虛幻的也好,還是實際的也好,大家認為中本聰是比特幣的提出者。他就是去中心化,為什么去中心化?我大體說一下使用的靈活的綁定交易技術,靈活的技術來綁定交易,沒有使用隱藏技術。因為去中心化全球都知道交易沒有使用隱藏技術,挖礦使用弱化的原像解,任何人都挖,挖出一個解來就是一個比特幣,這是一個弱化的原像解,因為原像解是非常難的,全世界的計算機25億年的計算量才能達到2的110次的計算難度。我們的比特幣的原像解是2的250次的計算難度,就是多少億個45億年都做不出來全球的運算資源,所以原像解不可能找到。我一定要把原像解降得很弱,弱到一定程度就找到這個原像解,這個原像解就是比特幣這么一個東西。
Hash函數是一個Y,是一個數字指紋,我只有求Y的前70個比特是0,一開始60個比特是0,我要找一個Y,就是說我要找一個M,這個M輸出的Y,只要前70個比特是0,65個比特是0就可以了,這樣就是一個比特幣,不要求它的512倍是固定的,只要求70倍是固定,所以難度就變成了2的70次計算。如果他的256比特是固定的,計算難度是256次計算。如果是固定128BT,那么就是2的128次計算,就是全球的計算機資源,計算45億年都找不到這個原像解,但是70個0就可以找到了。大家都知道,好多人玩過都知道難度,我就不說了,大家比我要有實際經驗。
現在有好多的題目在里面,大家看比特幣的結構。我們Block Hash,相當于我要一個結果,我輸出的是多少個0,后面我們就不再研究了。大家看,Block Hash是上一次輸出的,上一次比特幣的輸出結果是怎樣的,你要放在里面。Nouns是你要在一個空間里面搜M這個解,讓這個M滿足輸出結果是多少個0。所以說這個Nouns是一個隨機數,是你自己選的隨機數,你要做的空間。當然你要放進去,另外后面那些就是包含的TX1、TX2,就是全球的交易。目前全球的交易你要放在里面,當然不一定所有的交易,多少年以前的不行,現在一段時間內的交易放在里面。為什么?因為到時候全球的交易你通過這個Tree的結構會查找你的交易,比如說我在這個交易里面花了8塊錢,我用5個比特幣還是2個比特幣?通過這個交易里面,將來會查到我還剩2個比特幣,我的2個比特幣在上一次交易的時候是可以用的,不是用過的,你得有查找的證據,還有產生的交易信息,都要查得到。這個我就不再說了,有一個網站,大家可以上去看,有完整的信息。
大家可以看出來,我們這個比特幣就是綁定了比特幣交易的信息,不是完整信息,是今天我買了3個比特幣,賣了2個比特幣,我以前還有3個幣,我交易完2個,還剩下3個。通過TIX的信息,通過這個Tree的形式就能查國家,全球就通過這個Tree來約束你的交易過程。挖礦很簡單,就是一定要挖出一個M,滿足幾十個0就可以了。最關鍵的是他這個結構,把交易放在里面了,大家可以查。
我認為這個交易信息還是比特幣的一些信息,就是我挖出來的比特幣,還是我買來的比特幣,還是我賣了一部分比特幣,還剩下一部分比特幣,主要還是比特幣的信息。大家看一看,如果我把整個的架構保持下來,TX變成交易信息,就變成區塊鏈了。當然大家說區塊鏈是去中心的,比特幣是沒有中心的,為什么比特幣國家不支持?首先它會擾亂國家的金融市場,又沒有中心。區塊鏈為什么就火了又允許了?因為區塊鏈是綁定了交易。另外,我可以通過簽名,把可控物加進來,只要有數字簽名就是可控的,國家的權威部門就可以介入,只是你允許不允許的問題,是有這個技術的。所以說區塊鏈可以改造成有中心和無中心的交易管理技術。這個題目我不再講了,因為時間有限。
簽名的時候就是公鑰和私鑰,大家一定要注意,比特幣并不是安全的,所有人的交易通過一個公鑰就可以幫你找到,連接在一起,你早晚有一天是暴露的。張三交易了多少比特幣是可以找到你的,因為你所有都使用的同一個公鑰。所以如果你經常換公鑰,你就得做得比較隱蔽一點,就是這樣的一個技術。
這個攻擊大家也值得關注。如果有一個人,有全球51%的計算能力,那就意味著什么?你能控制區塊鏈的技術。為什么?因為你只要有超過一半的計算能力,因為挖礦是通過計算能力挖出來的。所以說,你如果超過全球的51%的計算能力,那么你就隨意。實際上這個區塊鏈的價值是你主導的,這個加鏈是你主導的,所以你有足夠的能力主導這個鏈,可以做一些你想干的事情,這是一種計算能力的攻擊。因為它是一個弱化的,不弱化的話任何人都做不了。如果弱化了以后,完全可以用你的計算資源。另外區塊鏈技術是一個全球化的資源控制技術,任何一個國家你多少比特幣,就意味著你有多少計算能力,所以這個計算能力在全球是透明的。我估計美國在了解全球的計算能力方面,通過比特幣就可以做到,這是一個艱深的問題。
三、區塊鏈的發展。
大家要知道一點,你把交易信息放在里面就變成了區塊鏈技術,這是其一。其二你可以通過挖礦建鏈,你也可以不通過挖礦,只是使用一下綁定技術本身,沒有挖礦之說,只是綁了一下這個交易信息,也是區塊鏈。但是,你用分布式那種拜占庭協議,還有其他的技術來進行投票決策就可以了,要決策誰做賬本的問題,因為這個鏈的建立就是做賬本,進行投票就可以了。投票技術也是靈活多樣的,可以利用拜占庭協議,可以利用密碼技術其他的投票協議也是可以的,這個都可以,大家一定不要局限于現有的技術,這是非常靈活的開發平臺。
四、小結。
首先我們的比特幣雖然都不是匿名的,因為公鑰說明一切,你所有的交易只有一個公鑰,要經常換公鑰,保證你的匿名性。第二個就是全球能力資源的監控問題,區塊鏈還有一些共享算法的研究,分布式系統。當然我們把一些更深的密碼技術放在區塊鏈上,來研究新的一些區塊鏈技術。另外我們還是希望國產密碼算法的區塊鏈產業,就是我們的SM3和SM2技術要推廣使用。最后,我覺得還是要進行區塊鏈人才的培養。