拿什么保护你,我的区块链
被納入新基建的區塊鏈,以數據不可篡改、可公開監管、便于查證的特性,廣泛應用于有多方參與的系統中,為多方交互的信息(行為、數據等)提供可靠的存證。那么,在信息上鏈接受公開監管的同時,能否為信息提供隱私保護呢?隱私保護的數據又如何能驗證其可靠性呢?騰訊云區塊鏈使用同態加密、零知識證明、可信計算等技術,為區塊鏈上數據隱私和行為可靠性提供了多方位的保障,并且提供了對國密算法的支持,在金融、政務等場景中可以選擇適配SM2-SM3國密證書套件,完美對接國標、行標。那么騰訊云區塊鏈究竟是怎么做到同時兼顧隱私性、可靠性的呢?
“?術語小課堂:
隱私性:我有一個值,但我不告訴你是多少。
可靠性:我有一個值,我向你證明并且證明是我的。”
01
—
鏈上的交易場景
以鏈上交易為例,有三種能兼顧隱私性和可靠性的交易方案:同態加密(HE)、零知識證明(ZK-Proof)、可信計算(TEE)。如Fig. 1所示的轉賬場景是區塊鏈上常見的交易場景。在如Bitcoin、Ethereum等公有鏈中,這類交易是明文儲存在鏈上的,也就是說任何人都可以通過區塊鏈提供的查詢功能獲得任意賬戶的余額、資金動向等信息。
Fig. 1 鏈上交易:從賬戶??轉賬到賬戶??
在這筆交易中,需要公開審計的是???,而需要保護的信息也正是?、、??、??、?。如何在證明???這個關系的同時,不能泄露?、、??、??、?這幾項賬戶、交易信息呢?如果直接把賬戶余額?、?和轉賬金額??加密了,要如何在鏈上對新密文進行公開的驗證呢?
02
—
鏈上的交易場景
舉個例子,我存在銀行的余額可進行加密,銀行也不知道密鑰,這樣我的余額是保密的;但同時,如果我消費了10塊錢,銀行能基于我的加密余額減掉相應的錢。這就相當于保護隱私的情況下,執行交易。而這就是同態加密。
同態加密算法很多小伙伴都接觸過甚至使用過。這類加密算法具有將密文的運算映射到明文的四則運算的特性。使用同態加密可以直接對密文進行運算,以改變隱藏在密文中的明文。
2.1 同態加密簡介:如何選擇同態加密算法?
????“?符號小課堂:
?????:?:是加密算法,為明文原文,為加密后的密文。
?????:?:是解密算法,為密文,為解密后所得明文。
?????????、、?:密文的同態加法、減法、乘法運算符”
根據算法所支持的同態運算,同態加密的能力各有不同。常見的、得到更多關注的同態運算是四則運算:
2.1.1 對加法同態:(加法與減法在現有算法的數學結構中是同類型的運算)
? ? “?密文與密文相加:??
????密文與明文相加:??
????密文相反數:??
????密文與密文相減:??
????密文與明文相減:??”
2.1.2?對乘法同態
? ? “?密文與明文相乘:??
?????密文與密文相乘:???”
騰訊云區塊鏈同態加密同時支持了Paillier公鑰加密與Lattice加密算法。
加法同態最容易支持,幾乎所有同態加密算法都支持對加法的同態運算。而當前比較實用的算法中,Paillier公鑰加密是除了支持對加法同態之外還能支持密文與明文相乘的同態加密算法。而全同態的能力,也就是對加法、乘法甚至除法的同態運算都支持的能力,則多見于基于Lattice這種數學結構設計的加密算法中。而基于Lattice的算法是post-quantum的,也就是說,即使在使用量子計算的環境中,這些算法仍然是安全不可暴力破解的,但這些算法本身的耗時也非常高。
Paillier這個基于DCRA假設 (decisional composite residuosity assumption) 的算法,每秒可以計算上萬次同態加法(上次作者親自benchmark是每秒15000次:在普通Linux系統上的Golang實現,安全等級在2048 bit),而基于Lattice的BGV算法 (Brakerski-Gentry-Vaikuntanathan) 在相同安全性配置下每秒只能計算不到兩次(benchmark:同環境同安全等級下大約每次需要700-800毫秒)。這也就是安全等級、功能強度與性能的永恒的權衡(trade-off)。
那么強大的全同態加密就沒有用武之地了嗎?其實對于每10分鐘出個塊的公鏈,800毫秒的計算速度還是可以接受的。而在支持并要求快速出塊的場景下,我們還是選擇Paillier,畢竟兼顧了性能與可靠性。
Paillier在各種語言中都有開源實現,一部分實現是已經受過大規模使用的洗禮。而基于Lattice的post-quantum算法們應用并不廣泛,而親測除了效率之外,還是非常容易上手使用的。HElib是個C實現,與其他語言的項目兼容性喜人。
2.2?處理同態加密中的負數
密碼學算法通常使用有限的數域作為明文、密文、簽名、公私鑰等的取值范圍,而且通常是循環的有限數域,比如???生成的整數域就是{??}這個集合,但取值會循環,??會跳回數域的第一個元素???。這類數域經過平移可以使元素變成一半正一半負。例如??生成 {??},他與??生成的數域在數學結構上是等效的,但在實際應用中就引入了負數,可以支持更多場景,因此變得更實用了。
同態加密這類密碼學算法在使用中也可以通過平移數域的方法,將原本只包含正整數的明文取值范圍變成包含負整數的取值范圍,并且這個改動也只需要在加密、解密算法的實現中做一些工程改動即可。常用的做法是,對于一個??生成的域,假設一個值為???,如果??,則直接使用??;否則計算
得到一個負數。這種映射方式可以保證明文、密文的計算是對應的,不會出現判斷邊界導致的錯誤。
2.3?處理同態加密中的小數
前文提到的這些同態加密算法,他們距離現實還有一個大障礙——原算法為整數設計。這也可以理解,因為這些密碼學算法全是基于數論的,他們所依賴的數學理論中,數學結構都是以整數來表達的,對整數有天然的兼容性,而對小數就不是那么友好了。那么在使用時,我們就需要對這些算法做一些兼容性的處理。其實這些處理都比較直觀,而且都是從工程上來解決,并不需要從理論上解決。
2.3.1 保留小數位數固定的場景:
例如記錄金額的數據,通常保留兩位小數。這種場景中,加密前對所有數據都乘100化成整數,解密后除以100取回原本的小數即可。只要不涉及密文與密文的乘法運算,這種方法就可以解決小數的兼容問題。
2.3.2 ?保留隨意位數小數:
將數據的整數部分與小數部分拆開進行加密,在解密后重新組合。使用這個方案時,要注意為保存小數部分的數據分量保留一部分緩沖位數,當密文計算導致進位到整數部分時,可以暫時將這部分整數值保留在這個密文中。用 Paillier 算法為例子,明文長度允許為 2048 bit,作為小數分量的明文可以考慮使用 1024 位表示小數,另外 1024位預留給可能進位的整數 (實際情況可能保留64位整數就很足夠了)。
2.3.3 準確計算結果:
在需要準確保留運算結果的場景中,需要將計算中涉及到的小數化成分數,并把分子、分母拆開分別加密。計算時,以??為例,需要在密文上計算??和??作為結果的密文,解密后計算??。這種場景需要全同態算法支持。
2.4?使用同態加密保護交易隱私
回到鏈上交易的問題,引入同態加密后,交易過程變成Fig. 2所示。
Fig.2 同態加密保護的鏈上交易
如圖中的計算,對等式??的驗證可以轉化為密文上的驗證:??。如此,鏈上數據全程都是密文,卻并不妨礙公開監管。
03
—
運算合理性怎么保證——零知識證明
我不給你展示身份證,但是我要向你證明我已經年滿18歲,這時候應該怎么辦呢?
在上一部分,我們討論了使用同態加密來保護鏈上數據隱私又能提供公開監管的方案。如果在交易場景中,我們對賬戶余額做出一定的限制,比如?、?都不可以小于??(??是有可能小于??的),那么同態加密提供的方案就不能再交易執行之前判斷這個交易是否符合限制條件了。這時候,我們可以引入另一個密碼學算法體系——零知識證明。
簡單來說,零知識證明就是,我有一個??,我需要向你證明??滿足的一個關系,例如??或者??,我不告訴你??的準確值還要說服你??滿足的一個關系,例如??或者???,我不告訴你??的準確值還要說服你??滿足這個關系。一個直觀的例子如Fig.3所示。證明者P知道山洞中密道的存在,而驗證者V并不知道。P先隨機選擇A、B兩條通道之一進入山洞中,V來到洞口,隨機指定A、B之一要求P從指定通道走出山洞。多次實驗后,V被說服了P知道密道這一事實,但V仍然不知道密道在哪里。而在區塊鏈交易場景中,我們需要的效果是所有人都被說服??和??這個事實,卻不知道?、?的具體值。在這部分,我們會詳細介紹如何使用Pedersen承諾、Bulletproofs零知識范圍證明來達到這個目標。
? ? “?注:在這部分的算法里出現的大寫字母變量為橢圓曲線上的點,小寫字母變量為數值。除法符號表示的是模擬運算。?”
Fig.3 密道的零知識證明
3.1?Pedersen承諾(commitment) 算法[3]
承諾算法是一種提供數據綁定及數據保密的算法,有兩個基本接口:制作承諾 (commit)和打開承諾 (open)。
??:輸入一個明文數值??和一個隨機致盲因子??,返回一個對??的承諾??。其中,致盲因子也稱為opening,可以視作對稱簽名算法的私鑰或者加密算法中的解密密鑰。
??:打開承諾是驗證一個承諾??是否與其宣稱綁定的值??真實綁定。??是制作承諾時所使用的致盲因子。
承諾具有兩個屬性:隱藏性 (hiding) 和綁定性 (binding)。
隱藏性:給出一個承諾???,無法算出其中綁定的數值??。更高的安全性則要求敵手選擇兩個數值,由被挑戰者任選一個制作成承諾,而敵手猜出正確數值的概率不高于??。
綁定性:給出一個承諾??及其綁定的數值和致盲因子對??使得??,無法找到另一組??使得??。
承諾的隱藏性可以為鏈上數據提供隱私保護,而綁定性則可以為保密數據的鏈上公開監管提供可靠性保障。
3.1.1 Pedersen承諾算法詳情
Pedersen承諾是一個基于橢圓曲線 (EC) 的密碼學算法。我們取用橢圓曲線加法群上的兩個隨機基點?、?作為公共參數。
??:計算??作為??的承諾。
??:判斷??,若等式成立則返回??,否則返回??。
3.1.2 Pedersen承諾的同態運算
Pedersen承諾支持部分同態運算:承諾+ 承諾,承諾 + 數值,承諾 – 承諾,承諾 – 數值,承諾的相反數,承諾??數值。
假設有兩個承諾??、???,和另一個數值??。
承諾 + 承諾:已知??,求??的Pedersen承諾
??
在??中,綁定的數值變成了??,而致盲因子opening變成了??。
承諾 + 數值:已知??和??,求??的Pedersen承諾
??
在??中,綁定的數值變成了??,而致盲因子仍然為??不變。
承諾 – 承諾:已知??,求??的Pedersen承諾
??
在??中,綁定的數值變成了??,而致盲因子變為??。
承諾 – 數值:
??
在??中,綁定的數值變成了??,而致盲因子仍為??。
承諾相反數:
??
在??中,綁定的數值變成了??,而致盲因子變為??。
承諾??數值:
??
在??中,綁定的數值變成了??,而致盲因子變為??。
3.2 Bulletproofs零知識范圍證明(zk-range-proof)算法[4,5]
Pedersen承諾算法只能保證數值運算正確地在密文 (承諾) 上進行,而不能給運算結果任何限制。而在特定場景中,例如轉賬——我們要求轉出賬戶的余額要大于轉出值,也就是運算結果需要為非負數。零知識范圍證明可以提供在不公開數值的情況下證明一個數在某個特定范圍內的能力。
零知識證明具有三個特性:零知識、完備性和公正性。
零知識:通過給出的證明、驗證過程及公共信息,無法計算出證明中包含的隱藏命題組件。
完備性:按算法制作的對正確命題的證明都能通過驗證。
公正性:由不正確的命題生成的證明無法通過驗證。
在Bulletproofs零知識范圍證明中,要證明的基本命題是數值?〖μ〗?,其中??是需要隱藏的命題組件,?μ?是一個大于1的正整數,實現時為了方便,通常取?μ?,零知識體現在從證明、驗證過程中無法得出任何一個證明π所證明的命題中的??的值。
Bulletproofs也是一個基于EC的算法,并且使用Pedersen承諾作為證明的一部分用以綁定及隱藏??。其基本設計如下:
公共信息:?μ?
證明者的秘密輸入:??
1.???驗證者隨機選擇??,計算??,其中??。驗證者把??發送給證明者。
2.???證明者把??轉換為 bit 流的形式??,其中??。證明者隨機選擇??并計算??。注意??。
證明者現在需要證明??,而不公開??。這種類型的零知識證明可以使用??protocol來進行。以上的算法步驟都是需要驗證者與證明者實時交互才能完成的。我們可以用 Fiat-Shamir 啟發式把交互式的證明轉化成非交互式的證明,也就是證明者算出一個非交互式證明之后,任何人都能在沒有證明者協助的情況下進行驗證 (類似簽名中的驗簽)。關于??protocol?和 Fiat-Shamir 協議的基本概念,可以參考下面的知識小課堂。
證明輸入中的??其實是??的一個 Pedersen 承諾。在轉換成非交互式證明后,驗證過程主要驗證了以下幾點:
證明中的與承諾中綁定和隱藏的是同一個值;
證明中的在范圍內。
多個不同的證明(除了致盲因子外,證明還有其他隨機因子)可以對應同一個承諾,而多個不同的承諾不可能與同一個證明對應通過驗證。
3.3 任意范圍的證明
這個部分,我們討論如何把證明范圍??擴展到任意范圍??。要證明??,我們可以證明??。結合 Pedersen 承諾的同態運算,我們可以很容易地通過兩個非交互式證明完成任意范圍證明。
回到我們最初的交易場景中,鏈上數據以 Pedersen 承諾的形式上鏈,配合一個證明承諾中明文大于零的 Bulletproofs 證明,其他參與者就可以在不知道明文的情況下也能被說服改明文大于零了。計算時,利用 Pedersen 承諾的同態性質,其他鏈上參與者可以很容易地看到??這個關系,并且能通過 Bulletproofs 的證明確認??與??都大于零。
04
—
把計算邏輯放進保險箱——可信計算(TEE)
前面兩個小節為大家介紹了兩套解決區塊鏈上機密交易的密碼學體系。密碼學算法提供的安全等級是比較高的,但是他們也有他們的缺點:兼容性問題和運算效率較低的問題。面對安全等級、功能性和性能永恒的trade-off,我們還有工程+密碼學的解決方案——可信計算。
相較于密碼學算法,可信計算雖然無法在理論上嚴謹地被證明安全 (推導到與NP問題等效),但是在現實中攻破可信計算環境是非常困難的,而且他具有兼容性好、運算靈活、運算效率高的優勢,確實是一個非常優秀的密碼學算法替代品。
可信計算本質上是用硬件來構建一個反沙箱環境,外部(包括OS)不能自主訪問或更改可信硬件內部的軟件、數據。結合一些簡單的密碼學算法,可信硬件可以與外部進行安全交互,以實現在可信環境中處理敏感數據,然后以密文形式取出并提供可靠性認證的目的。
舉個例子,騰訊計費業務沉淀的風控系統,積累了大量精準的風控模型能力,如果外部合作游戲廠商希望借助于騰訊的風控模型提高業務風控效果,但又不希望將用戶信息的敏感數據對外暴露。這是就可我們通過可信計算確保風控模型與用戶信息在可信域內處理,并結合區塊鏈,保證交互留痕、可追溯以及透明性。
?
當下主流的可信硬件有三種:
SGX (Software Guard Extension):Intel的處理器擴展芯片,提供有限的安全指令集,有較強計算能力,在應用層為軟件加固,本身無存儲能力。
TPM (Trusted Platform Module):TCG (AMD, HP, IBM, Intel, MS聯合項目) 的可信計算模塊,最先啟動,可用于從硬件到軟件的認證鏈,本身擁有較弱的計算、存儲能力。
TrustZone:ARM架構中的可信計算擴展模塊,非公開架構,與SGX行為相似。
由于 SGX 具有較強的計算能力,可以兼容的運算邏輯靈活多樣(幾乎可以是圖靈完備的),所以我們以 SGX 為介紹主體。SGX 設計初衷是保護運行環境不被信任域外的軟硬件讀寫。這里的敵手包括本地環境中的 OS、hypervisor、BIOS、firmware 等,即使同系統中其他軟件受到提權攻擊,也不會影響信任域內。
Fig.4 攻擊面對比:左圖黃色虛線框中為一般運行環境的攻擊面,右圖黃色虛線框中為SGX環境中的攻擊面
SGX 硬件中有固有的兩個私鑰:root seal key 和 root provisioning key,分別用于衍生加密密鑰和認證可靠性。這兩個私鑰是使用可編程只讀存儲器保存的。可編程只讀存儲器在燒制過一次之后無法更改,而且在 SGX 中無法被外部訪問。SGX 的隔離原理如Fig. 5所示,其中 Enclave 是運行外部傳入的邏輯的一個資源分片。
Fig.5 SGX的隔離、隱私保護、認證
Provisioning key 的使用類似證書,而Intel是一個證書發行 CA,會為所有 SGX 模塊的 provisioning key 頒發一個獨立的證書。Seal key 是絕對只存在于 SGX 內的,且每一個 SGX 硬件擁有一個唯一的 seal key (當然隨機數存在碰撞,但概率極低),用于生成后續所有加密用私鑰或密鑰對。外部通過 provisioning key 的證書體系驗證 SGX 的可靠性:是否為可信環境,Enclave 中的運行邏輯是否未被篡改。內外通信時,使用 seal key 衍生的密鑰加密。Provisioning 和 seal 兩個機制分別保證了可信計算的可靠性 (包括運行邏輯不被篡改、結果被認證) 和隱私性。
4.1 使用可信計算保護交易隱私
那么如何把可信計算 (TEE: trusted executionenvironment) 應用到區塊鏈的機密交易場景中呢?首先,鏈上數據由 TEE 加密、簽名后,以密文+簽名組合的形式上鏈,也就是說?、?賬戶余額的密文和簽名存于鏈上。在交易時,外部調用方使用 TEE 的公鑰加密??并將密文傳入 TEE,TEE 上鏈取得?、?的密文和簽名,在驗證簽名正確性后,TEE 使用自己的私鑰解密?、、?,計算出??和??,對??和??加密、簽名認證后,輸出密文及簽名到鏈上。公開監管的區塊鏈參與者可以通過驗證 TEE 簽名來驗證鏈上數據是否可靠。鏈上交易的有效性需要由部署于 TEE 內的邏輯來校驗,如果不符合,該邏輯需要拒絕交易。
4.2 鏈上鏈下的橋梁
TEE 也可以用于鏈上鏈下的互聯。一些場景中需要把計算邏輯部署在鏈下,而無法以智能合約的形式部署于區塊鏈上。例如一些國家或地區的數據不能跨地區傳到別的地區的區塊鏈上,只能在本地區對數據加工后傳出。這時候可以把數據處理邏輯部署到TEE 中,由 TEE 收集數據計算后,對結果進行簽名認證再傳到跨地區的區塊鏈上,區塊鏈節點只需要通過驗證簽名、驗證TEE的可靠性來決定是否接受該上鏈請求。
05
—
安全領域自主可控之光——國密算法
國密算法是一套包含對稱加密、非對稱加密、簽名、哈希等基本密碼學算法的,從算法設計、理論推導到開發實現都是中國自主研發的密碼學算法集合。過去,商用密碼學算法是美國主導的。從理論到算法實現都是境外學者、工程師完成的。對于關系到安全的密碼學算法是否有設計上預留的后門,我們并不確定。在諸如政務、軍事、金融等敏感領域,使用別人的算法存在敏感信息泄露、重要信息被篡改的風險,因此國家推動自主的密碼學算法勢在必行。
騰訊云區塊鏈中使用的密碼學算法,除了區塊鏈本身的哈希和簽名外,更重要是在通信過程中的證書上。騰訊云區塊鏈平臺基于自研的國密解決方案,提供了對國密證書的支持,在區塊鏈節點與節點、區塊鏈用戶與節點間的通信中同時支持使用傳統 ECDSA-SHA256 證書和國密 SM2-SM3 證書,在證書切換上做到配置時用戶自選、使用時用戶不感知。
目前國密算法的支持一方面符合了金融、政務以及各類企業的安全規范要求,另一方面可幫助我國區塊鏈技術實現安全上自主可控、不受制于人。
06
—
區塊鏈密碼安全特性的產業應用
說了一大堆,那么這些在騰訊云區塊鏈中使用到的安全技術究竟離我們的實際生活有多近呢?前文中提到的使用同態加密、零知識范圍證明實現的機密交易,使用可信計算實現的多方計算、鏈上鏈下互通究竟要怎么用呢?以下我們介紹一些實際場景的應用。
在銀行、金融體系中,使用鏈上機密交易,通過將賬戶信息加密后放到區塊鏈上存證,交易請求中也對交易額進行加密,以保護資金流,那么配合同態加密或零知識證明算法,可實現對鏈上密文的計算和對計算結果的驗證,達到交易信息保密、交易事件可公開監管、交易結果可及時驗證的效果。舉個例子,公司 A 和公司 B 作為區塊鏈分布式賬本的參與方,可以將自己的賬戶余額等信息采用同態加密的密文形式存到鏈上。這樣一來,A 向 B 支付一筆款項時,則可以通過同態運算來執行這個交易,并用零知識證明提供余額足夠支付這次交易的證明,整個商業互動就可以在隱私保護中進行。
在廣告投放的場景中,也可以用部署了可信計算的騰訊云區塊鏈來安全地聯合提取隱私數據中的可公開信息。廣告歸因是一個典型的涉及多方數據共享的場景。這個場景主要參與方包括廣告投放商和廣告平臺:廣告投放商擁有用戶購買其產品或服務的交易信息,而廣告平臺擁有用戶對投放商投放在平臺上的廣告的瀏覽、點擊信息。在現行商業模式下,廣告投放商會根據瀏覽、點擊了廣告的用戶是否購買產品或服務的情況來計算一個廣告轉化率,計算公式是:?轉化率瀏覽過廣告且購買的用戶量瀏覽過廣告的用戶?。要得到轉化率數據,就需要得到廣告投放商側購買過產品的用戶集合與廣告平臺側瀏覽過廣告的用戶集合的交集。廣告投放商與廣告平臺可以使用第四部分提到的鏈上鏈下互通的機制把各自數據的存證放到區塊鏈上,而不公開數據本身。需要計算轉化率時,可以通過可信計算環境來驗證鏈上存證與鏈下實際數據,并在實際數據上進行計算得到結果。整個過程不會泄露鏈下數據。
?
這期我們就介紹到這里。區塊鏈的安全應用場景還有很多,希望這次的分享可以在思路上幫到大家。
?
[1] Schnorr, “Efficient identification and signatures for smartcards”, Crypto 1989
[2] Fiat, Shamir, “How to Prove Yourself: Practical Solutions toIdentification and Signature Problems”, Crypto 1986
[3] Pedersen, “Non-interactive and information-theoretic secureverifiable secret sharing”, Crypto 1991
[4] Camenisch, Chaabouni, Shelat, “Efficient Protocols for SetMembership and Range Proofs”, AsiaCrypt 2008
[5] Bunz, Bootle, Boneh, Poelstra, Wuille, Maxwell, “Bulletproofs:Short Proofs for Confidential Transactions and More”, S&P 2018
總結
以上是生活随笔為你收集整理的拿什么保护你,我的区块链的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么微信推荐这么快?
- 下一篇: 99.999%,提升ElasticSea