區塊鏈的定義
- 區塊鏈的定義,應當是:區塊鏈是一種按照時間順序將數據進行分布式存儲的塊鏈式數據結構,它利用共識機制進行數據驗證,利用密碼學進行數據保護和用戶安全訪問,利用智能合約來操作數據,從而成為不可篡改和不可偽造的分布式賬本。所以,分布式存儲、共識機制、密碼學原理和智能合約構成區塊鏈的核心技術內容。
區塊鏈和密碼學之間的關系
- 區塊鏈和密碼學是相互促進發展的一個過程,區塊鏈中大量使用了密碼學的知識;同樣的,為了滿足區塊鏈的不同場景,也反向促進了密碼學的進一步發展。
引言
- 本篇會講述密碼學在區塊鏈中的具體的使用,從而理解為什么區塊鏈可以防止消息被篡改、怎么進行數字身份認證。比特幣中是如何通過多重簽名實現多個人共同管理某個賬戶的比特幣交易。
密碼學分類
- 古典密碼學主要關注信息的保密書寫和傳遞,以及與其相對應的破譯方法。
- 現代密碼學不只關注信息保密問題,還同時涉及信息完整性驗證(消息驗證碼)、信息發布的不可抵賴性(數字簽名)、以及在分布式計算中產生的來源于內部和外部的攻擊的所有信息安全問題。總而言之,現代密碼學是互聯網安全的基石。
密碼學知識
Hash函數
- 在有限合理的時間內,將任意長度的消息壓縮為固定長度的輸出值,并且是不可逆的。其輸出值稱為哈希值,也稱為散列值。
- Hash函數常用于實現數據完整性和實體認證,同時也構成多種密碼體制和協議的安全保障
哈希函數的評價標準
- 正向快速:給定明文和Hash算法,在有限時間和有限資源內能計算得到Hash值;
- 逆向困難:給定(若干)Hash值,在有限時間內很難(基本不可能)逆推出明文;
- 輸入敏感:原始輸入信息發生任何改變,新產生的Hash值都應該出現很大不同;
- 沖突避免:很難找到兩段內容不同的明文,使得它們的Hash值一致(發生碰撞)。
例子
- 如果對于先前的輸入做一點點的更改,輸出的結果也會發生變化
碰撞
- 碰撞是指兩個不同的消息在同一個哈希函數作用下,具有相同的哈希值。哈希函數的安全性是指在現有的計算資源(包括時間、空間、資金等)下,找到一個碰撞是不可行的。
- 沖突避免有時候又稱為“抗碰撞性”,分為“弱抗碰撞性”和“強抗碰撞性”。
- 如果給定明文前提下,無法找到與之碰撞的其他明文,則算法具有“弱抗碰撞性”;
- 如果無法找到任意兩個發生Hash碰撞的明文,則稱算法具有“強抗碰撞性”。
哈希函數的種類
- 目前常見的Hash算法包括MD和SHA系列算法。具體分類如下:
MD4(RFC 1320)是MIT的Ronald L.Rivest在1990年設計的,MD是Message Digest的縮寫。其輸出為128位。MD4已被證明不夠安全。
MD5(RFC 1321)是Rivest于1991年對MD4的改進版本。它對輸入仍以512位進行分組,其輸出是128位。MD5比MD4更加安全,但過程更加復雜,計算速度要慢一點。MD5已被證明不具備“強抗碰撞性”。
SHA(Secure Hash Algorithm)并非一個算法,而是一個Hash函數族。NIST(National Institute of Standards and Technology)于1993年發布其首個實現。
目前知名的SHA-1算法在1995年面世,它的輸出為長度160位的Hash值,抗窮舉性更好。SHA-1設計時模仿了MD4算法,采用了類似原理。SHA-1已被證明不具備“強抗碰撞性”。
NIST還設計出了SHA-224、SHA-256、SHA-384和SHA-512算法(統稱為SHA-2),跟SHA-1算法原理類似。
SHA-3相關算法也已被提出.
- 目前,MD5和SHA1已經被破解,一般推薦至少使用SHA2-256或更安全的算法。
Hash函數在區塊鏈中的應用
- SHA256和RIPEMD160
- RIPEMD160主要用于生成比特幣地址。
- SHA256是構造區塊鏈所用的主要密碼哈希函數。
- 在HyperLedger-Fabric區塊鏈平臺中,Hash函數主要用于檢測數據未經授權的修改,簽名者的身份識別和抗抵賴。
加密解密算法
- 加解密算法是密碼學的核心技術。
分類
組成
- 現代加解密系統的典型組件一般包括:加解密算法、加密密鑰、解密密鑰。
- 在加解密系統中,加解密算法自身是固定不變的,并且一般是公開可見的;密鑰則是最關鍵的信息,需要安全地保存起來,甚至通過特殊硬件進行保護。
- 一般來說,對同一種算法,密鑰需要按照特定算法每次加密前隨機生成,長度越長,則加密強度越大。加解密的基本過程如下圖所示:
- 加密過程中,通過加密算法和加密密鑰,對明文進行加密,獲得密文。
- 解密過程中,通過解密算法和解密密鑰,對密文進行解密,獲得明文。
- 根據加解密過程中所使用的密鑰是否相同,算法可以分為對稱加密(symmetric cryptography,又稱公共密鑰加密,common-key cryptography)和非對稱加密(asymmetric cryptography,又稱公鑰加密,public-key cryptography)。兩種模式適用于不同的需求,恰好形成互補。某些時候可以組合使用,形成混合加密機制,比如數字信封。
安全技術
消息認證碼與數字簽名
- 消息認證碼和數字簽名技術通過對消息的摘要進行加密,可用于消息防篡改和身份證明問題。
關于消息驗證碼
- 消息認證碼全稱是“基于Hash的消息認證碼”(Hash-based Message Authentication Code,HMAC)。
消息驗證碼基于對稱加密,可以用于對消息完整性(integrity)進行保護。
基本過程為:對某個消息利用提前共享的對稱密鑰和Hash算法進行加密處理,得到HMAC值。該HMAC值持有方可以證明自己擁有共享的對稱密鑰,并且也可以利用HMAC確保消息內容未被篡改。
一般用于證明身份的場景
如Alice、Bob提前共享和HMCA的密鑰和Hash算法,Alice需要知曉對方是否為Bob,可發送隨機消息給Bob。Bob收到消息后進行計算,把消息HMAC值返回給Alice,Alice通過檢驗收到HMAC值的正確性可以知曉對方是否是Bob。注意這里并沒有考慮中間人攻擊的情況,假定信道是安全的。
關于數字簽名
- 數字簽名基于非對稱加密,既可以用于證實某數字內容的完整性,又同時可以確認來源(或不可抵賴,Non-Repudiation)。
數字簽名的全過程分兩大部分,即簽名與驗證。一側為簽名,一側為驗證過程。
簽名過程:發方將原文用哈希算法求得數字摘要,用簽名私鑰對數字摘要加密得數字簽名,發方將原文與數字簽名一起發送給接受方。
(Q:?為什么要將原文進行數字摘要之后,利用私鑰和摘要,對原文進行簽名,而不是直接用對原文進行簽名?
A:原因有二:
一是因為非對稱加密算法的加密速度,遠小于對稱加密速度。直接對原文進行簽名,消耗較大;而是因為非對稱加密,對加密信息的長度,有著嚴格的要求,只能用于少量數據的加密。比如,RSA加密算法,要求加密的數據不得大于53個字節。
)
驗證過程:?收方驗證簽名,即用發方公鑰解密數字簽名,得出數字摘要;收方將原文采用同樣哈希算法又得一新的數字摘要,將兩個數字摘要進行比較,如果二者匹配,說明經數字簽名的電子文件傳輸成功。
用于防止消息篡改的場景
Alice通過信道發給Bob一個文件(一份信息),Bob如何獲知所收到的文件即為Alice發出的原始版本?
Alice可以先對文件內容進行摘要,然后用自己的私鑰對摘要進行加密(簽名),之后同時將文件和簽名都發給Bob。
Bob收到文件和簽名后,用Alice的公鑰來解密簽名,得到數字摘要,與收到文件進行摘要后的結果進行比對。
如果一致,說明該文件確實是Alice發過來的(別人無法擁有Alice的私鑰),并且文件內容沒有被修改過(摘要結果一致)
數字簽名的目的
- 數字簽名可以證實某數字內容的完整性和確認其來源,也就是不可抵賴性。理論上所有的非對稱加密算法都可以用來實現數字簽名,常用算法包括 DSA(Digital Signature Algorithm,基于 ElGamal 算法)和 ECSDA(Elliptic Curve Digital Signature Algorithm,基于橢圓曲線算法)等。
數字簽名與消息驗證碼的區別
- 消息驗證碼是基于對稱加密,可以用于對消息完整性(integrity)進行保護。通信雙方需要提前共享的對稱密鑰和Hash算法。
- 數字簽名是基于非對稱加密,MAC不僅能夠保證完整性,還能夠保證真實性。雙方不需要共享密鑰,私鑰僅僅需要被一方掌握。
特殊的數字簽名算法
盲簽名
- 簽名者需要在無法看到原始內容的前提下對信息進行簽名。實現對所簽名內容的保護,防止簽名者看到原始內容;同時實現防止追蹤,簽名者無法將簽名內容和簽名結果進行對應。
多重簽名
- 當 x 個簽名者中,收集到至少 y 個(x >= y >= 1)的簽名,即認為合法。x 是提供的公鑰個數,y 是需要匹配公鑰的最少的簽名個數。它可以有效地被應用在多人投票共同決策的場景中。比特幣交易中就支持多重簽名,可以實現多個人共同管理某個賬戶的比特幣交易。
群簽名
- 群組內某一個成員可以代表群組進行匿名簽名。簽名可以驗證來自于該群組,卻無法準確追蹤到簽名的是哪個成員。同樣存在一些問題,就是群簽名需要存在一個群管理員來添加新的群成員,因此存在群管理員可能追蹤到簽名成員身份的風險。
環簽名
- 簽名者首先選定一個包括簽名者自身的臨時簽名者集合。用自己的私鑰和簽名集合中其他人的公鑰就可以獨立的產生簽名,而無需他人的幫助。簽名者集合中的其他成員可能并不知道自己被包含在最終的簽名中。環簽名的主要用途在保護匿名性,屬于一種簡化的群簽名。
數字證書
- 解決的問題:公鑰可能被篡改的危機
- 對于非對稱加密算法和數字簽名來說,很重要的一點就是公鑰的分發。
- 理論上任何人可以公開獲取到對方的公鑰。然而這個公鑰有沒有可能是偽造的呢?傳輸過程中有沒有可能被篡改掉呢?一旦公鑰自身出了問題,則整個建立在其上的安全體系的安全性將不復存在。數字證書機制正是為了解決這個問題,它就像日常生活中的一個證書一樣,可以證明所記錄信息的合法性。
- 比如證明某個公鑰是某個實體(如組織或個人)的,并且確保一旦內容被篡改,就能被探測出來,從而實現對用戶公鑰的安全分發。
分類
- 加密數字證書:用于保護用于加密信息的公鑰。
- 簽名驗證數字證書:進行解密簽名進行身份驗證的公鑰。
- 兩種類型的公鑰也可以同時放在同一證書中。同時證書需要由證書認證機構CA來進行簽發和背書。權威的商業證書認證機構包括 DigiCert、GlobalSign等。用戶也可以自行搭建CA 系統,在私有網絡中進行使用。
- 證書作為公鑰信任的基礎。怎么用證書來實現公鑰的安全分發呢?在HyperLedger-Fabric中,使用的是PKI體系來保證的。
- 一個數字證書內容可能包括證書域(證書的版本、序列號、簽名算法類型、簽發者信息、有效期、被簽發主體、簽發的公開密鑰)、CA 對證書的簽名算法和簽名值等。證書的頒發者還需要對證書內容利用自己的私鑰進行簽名,以防止他人篡改證書內容。
PKI體系
-
在非對稱加密中,公鑰可以通過證書機制來進行保護,但證書的生成、分發、撤銷等過程并沒有在X.509規范中進行定義。在實際工程中,安全地管理和分發證書可以遵循PKI(Public Key Infrastructure)體系來完成。PKI體系核心解決的是證書生命周期相關的認證和管理問題,在現代密碼學應用領域處于十分基礎和重要的地位。在HyperLedger-Fabric區塊鏈系統中,就是用PKI體系來對證書進行管理的。
- PKI的全稱是Public Key Infrastructure公鑰基礎設施,是建立在公私鑰基礎上實現安全可靠傳遞消息和身份確認的一個通用框架。包含3個核心組件:
- CA:全稱Certification Authority,負責證書的頒發和吊銷,接收來自 RA 的請求。
- RA:全稱Registration Authority,對用戶身份進行驗證,校驗數據合法性,負責登記,審核過了就發給 CA;
- 證書數據庫:存放證書,多采用 X.500 系列標準格式。可以配合LDAP 目錄服務管理用戶信息。
- CA 是最核心的組件,負責完成對證書信息的維護。通常的操作流程為:
- 用戶通過 RA 登記申請證書,提供身份和認證信息等 → CA 審核后完成證書的制造,頒發給用戶 →?用戶如果需要撤銷證書則需要再次向 CA 發出申請。
證書的簽發
- CA對用戶簽發證書實際上是對某個用戶公鑰,使用CA的私鑰對其進行簽名。這樣任何人都可以用CA的公鑰對該證書進行合法性驗證。驗證成功則認可該證書中所提供的用戶公鑰內容,實現用戶公鑰的安全分發。
- 用戶證書的簽發可以有兩種方式
1,一種是由CA直接來生成證書(內含公鑰)和對應的私鑰發給用戶;
2,另一種是由用戶自己生成公鑰和私鑰,然后由CA來對公鑰內容進行簽名。
- 后者情況下,用戶一般會首先自行生成一個私鑰和證書申請文件(Certificate Signing Request,即csr文件),該文件中包括了用戶對應的公鑰和一些基本信息,如通用名(common name,即cn)、組織信息、地理位置等。
- CA只需要對證書請求文件進行簽名,生成證書文件,頒發給用戶即可。整個過程中,用戶可以保持私鑰信息的私密性,不會被其他方獲知(包括CA方)。
證書的撤銷
- 證書超出有效期后會作廢,用戶也可以主動向CA申請撤銷某證書文件。
- 由于CA無法強制收回已經頒發出去的數字證書,因此為了實現證書的作廢,往往還需要維護一個撤銷證書列表(Certificate Revocation List,CRL),用于記錄已經撤銷的證書序號。
- 因此,通常情況下,當第三方對某個證書進行驗證時,需要首先檢查該證書是否在撤銷列表中。如果存在,則該證書無法通過驗證。如果不在,則繼續進行后續的證書驗證過程。
?
Merkle樹結構?
- Merkle(默克爾)樹,又叫哈希樹,是一種典型的二叉樹結構,由一個根節點、一組中間節點和一組葉節點組成。在區塊鏈系統出現之前,廣泛用于文件系統和P2P系統中。其基本結構如下圖所示?
- 其主要特點為:
· 最下面的葉節點包含存儲數據或其哈希值;
· 非葉子節點(包括中間節點和根節點)都是它的兩個孩子節點內容的哈希值。
- 進一步地,默克爾樹可以推廣到多叉樹的情形,此時非葉子節點的內容為它所有的孩子節點內容的哈希值。
- 默克爾樹逐層記錄哈希值的特點,讓它具有了一些獨特的性質。例如,底層數據的任何變動,都會傳遞到其父節點,一層層沿著路徑一直到樹根。這意味樹根的值實際上代表了對底層所有數據的“數字摘要”。
Merkle樹應用場景
1.快速比較大量數據
- 對每組數據排序后構建默克爾樹結構。當兩個默克爾樹根相同時,則意味著兩組數據必然相同。否則,必然存在不同。由于Hash計算的過程可以十分快速,預處理可以在短時間內完成。利用默克爾樹結構能帶來巨大的比較性能優勢。
2.快速定位修改
- 例如上圖Merkle樹結構圖中。如果D1中數據被修改,會影響到N1、N4和Root。因此,一旦發現某個節點如Root的數值發生變化,沿著Root→N4→N1,最多通過O(lgn)時間即可快速定位到實際發生改變的數據塊D1。
?
布隆過濾器
- 布隆過濾器是一種基于 Hash 的高效查找結構,能夠快速判斷某個元素是否在一個集合內。
- 首先回顧一下基于Hash的快速查找,由于Hash算法具有一一對應的特點,即一個內容對應一個Hash值,而Hash值最終是可以轉化為二進制編碼,這就天然的構成了一個 “ 內容 - 索引 ” 的一個結構。
- 假如給定一個內容和存儲數組,通過構造Hash函數,使Hash值總量不超過數組的大小,就可以實現快速的基于內容的查找。如 “孤獨寂寞冷” 的 Hash 值如果是 “1000”,則存放到數組的第 1000 個單元上去。如果需要快速查找任意內容,如 “孤獨寂寞冷” 字符串是否在存儲系統中,只需要計算 Hash 值,并用 Hash 值查看系統中對應元素即可。
- 布隆過濾器采用了多個 Hash 函數來提高空間利用率。對同一個給定輸入來說,多個 Hash 函數計算出多個地址,分別在對應的這些地址上標記為 1。進行查找時,進行同樣的計算過程,并查看對應元素,如果都為 1,則說明較大概率是存在該輸入。
- 布隆過濾器相對單個 Hash 算法查找,大大提高了空間利用率,可以使用較少的空間來表示較大集合的存在關系。上面講的Hash查找和布隆過濾器,基本思想都是基于內容的編址。
- 下圖是一個布隆過濾器的示意圖
- 布隆過濾器(Bloom Filter)的核心實現是一個超大的位數組和幾個哈希函數。假設位數組的長度為m,哈希函數的個數為k:
- 以上圖為例,具體的操作流程:
假設集合里面有3個元素{x, y, z},哈希函數的個數為3。首先將位數組進行初始化,將里面每個位都設置位0。
對于集合里面的每一個元素,將元素依次通過3個哈希函數進行映射,每次映射都會產生一個哈希值,這個值對應位數組上面的一個點,然后將位數組對應的位置標記為1。
查詢W元素是否存在集合中的時候,同樣的方法將W通過哈希映射到位數組上的3個點。如果3個點的其中有一個點不為1,則可以判斷該元素一定不存在集合中。反之,如果3個點都為1,則該元素可能存在集合中。
可以從圖中可以看到:假設某個元素通過映射對應下標為4,5,6這3個點。雖然這3個點都為1,但是很明顯這3個點是不同元素經過哈希得到的位置,因此這種情況說明元素雖然不在集合中,也可能對應的都是1,這是誤判率存在的原因。
- 布隆過濾器因為其高效性大量應用于網絡和安全領域,例如信息檢索(BigTable和HBase)、垃圾郵件規則、注冊管理等。
同態加密
介紹
- 同態加密是一種加密形式,它允許人們對密文進行特定的代數運算得到仍然是加密的結果,將運算后的數據進行解密,其解密所得到的結果與對明文進行同樣的運算結果一樣。
- 傳統的加密方案關注的都是數據存儲安全。即,發送者要給接收者發送加密的東西,需要對數據進行加密后再發送。沒有密鑰的接收者,不可能從加密結果中得到有關原始數據的任何信息。只有擁有密鑰的接收者才能夠正確解密,得到原始的內容。需要注意到,這個過程中,用戶是不能對加密結果做任何操作的,只能進行存儲、傳輸。對加密結果做任何操作,都將會導致錯誤的解密,甚至解密失敗!
- 同態加密提供了一種對加密數據進行處理的功能。也就是說,其他人可以對加密數據進行處理,但是處理過程不會泄露任何原始內容。同時,擁有密鑰的用戶對處理過的數據進行解密后,得到的正好是處理后的結果。
- 區塊鏈中的應用:使用同態加密技術,運行在區塊鏈上的智能合約可以處理密文,而無法獲知真實數據,極大的提高了隱私安全性。
例子
A和B兩個用戶。A需要把自己的數據給B處理。
有兩種方式:
方式一:A把自己的數據進行加密,發送給B。B將數據解密后,對數據進行處理,然后得到目標結果Result。最后把處理后的結果發送給A。
方式二: A把自己的數據進行加密,發送給B。B直接對加密的數據,進行處理,然后得到處理的結果Result*.A收到Result*之后,通過私鑰解密Result*,最終得到Result。
方式二用到的方法,就是同態加密。
在方式二的方式中,B完成了對A數據的處理目的,并且保證了A用戶的隱私!
補充
- 什么是同態呢?它來自代數領域,包括四種類型:加法同態、乘法同態、減法同態和除法同態。同時滿足加法同態和乘法同態,則意味著是代數同態,即全同態。同時滿足四種同態性,則被稱為算數同態。
- 在計算機中如果實現了全同態意味著對于所有處理都可以實現同態性。只能實現部分特定操作的同態性,被稱為特定同態。
意義
- 換言之,這項技術令人們可以在加密的數據中進行諸如檢索、比較等操作,得出正確的結果,而在整個處理過程中無需對數據進行解密。其意義在于,真正從根本上解決將數據及其操作委托給第三方時的保密問題,例如云計算。
問題
- 雖然同態加密的優勢很明顯,并且已經實現,但是存在的問題就是需要較高的計算時間或存儲成本,相比傳統加密算法的性能和強度還有差距。困難與機會同在。
參考鏈接
- 密碼學在區塊鏈中的應用
- 區塊鏈中的密碼學與安全技術
?