拿什麼保護你,我的區塊鏈

買賣虛擬貨幣
被納入新基建的區塊鏈,以資料不可篡改、可公開監管、便於查證的特性,廣泛應用於有多方參與的系統中,為多方互動的資訊(行為、資料等)提供可靠的存證。那麼,在資訊上鍊接受公開監管的同時,能否為資訊提供隱私保護呢?隱私保護的資料又如何能驗證其可靠性呢?騰訊雲區塊鏈使用同態加密、零知識證明、可信計算等技術,為區塊鏈上資料隱私和行為可靠性提供了多方位的保障,並且提供了對國密演算法的支援,在金融、政務等場景中可以選擇適配SM2-SM3國密證書套件,完美對接國標、行標。那麼騰訊雲區塊鏈究竟是怎麼做到同時兼顧隱私性、可靠性的呢?“ 術語小課堂:隱私性:我有一個值,但我不告訴你是多少。可靠性:我有一個值,我向你證明並且證明是我的。”1. 鏈上的交易場景

以鏈上交易為例,有三種能兼顧隱私性和可靠性的交易方案:同態加密(HE)、零知識證明(ZK-Proof)、可信計算(TEE)。如Fig. 1所示的轉賬場景是區塊鏈上常見的交易場景。在如Bitcoin、Ethereum等公有鏈中,這類交易是明文儲存在鏈上的,也就是說任何人都可以透過區塊鏈提供的查詢功能獲得任意賬戶的餘額、資金動向等資訊。

2. 鏈上的交易場景

舉個例子,我存在銀行的餘額可進行加密,銀行也不知道金鑰,這樣我的餘額是保密的;但同時,如果我消費了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所示。

3. 運算合理性怎麼保證——零知識證明

我不給你展示身份證,但是我要向你證明我已經年滿18歲,這時候應該怎麼辦呢?

   “ 注:在這部分的演算法裡出現的大寫字母變數為橢圓曲線上的點,小寫字母變數為數值。除法符號表示的是模擬運算。 ”

3.1 Pedersen承諾(commitment) 演算法[3]

承諾演算法是一種提供資料繫結及資料保密的演算法,有兩個基本介面:製作承諾 (commit)和開啟承諾 (open)。

承諾的隱藏性可以為鏈上資料提供隱私保護,而繫結性則可以為保密資料的鏈上公開監管提供可靠性保障。

3.1.1 Pedersen承諾演算法詳情

3.1.2 Pedersen承諾的同態運算

Pedersen承諾支援部分同態運算:承諾+ 承諾,承諾 + 數值,承諾 – 承諾,承諾 – 數值,承諾的相反數,承諾  數值。

3.2 Bulletproofs零知識範圍證明(zk-range-proof)演算法[4,5]

Pedersen承諾演算法只能保證數值運算正確地在密文 (承諾) 上進行,而不能給運算結果任何限制。而在特定場景中,例如轉賬——我們要求轉出賬戶的餘額要大於轉出值,也就是運算結果需要為非負數。零知識範圍證明可以提供在不公開數值的情況下證明一個數在某個特定範圍內的能力。

零知識證明具有三個特性:零知識、完備性和公正性。

零知識:透過給出的證明、驗證過程及公共資訊,無法計算出證明中包含的隱藏命題元件。
完備性:按演算法制作的對正確命題的證明都能透過驗證。
公正性:由不正確的命題生成的證明無法透過驗證。

證明輸入中的C其實是x的一個 Pedersen 承諾。在轉換成非互動式證明後,驗證過程主要驗證了以下幾點:

1. 證明中的與承諾中繫結和隱藏的是同一個值;
2. 證明中的在範圍內。

多個不同的證明(除了致盲因子外,證明還有其他隨機因子)可以對應同一個承諾,而多個不同的承諾不可能與同一個證明對應透過驗證。

3.3 任意範圍的證明

4. 把計算邏輯放進保險箱——可信計算(TEE)

前面兩個小節為大家介紹了兩套解決區塊鏈上機密交易的密碼學體系。密碼學演算法提供的安全等級是比較高的,但是他們也有他們的缺點:相容性問題和運算效率較低的問題。面對安全等級、功能性和效能永恆的trade-off,我們還有工程+密碼學的解決方案——可信計算。

相較於密碼學演算法,可信計算雖然無法在理論上嚴謹地被證明安全 (推導到與NP問題等效),但是在現實中攻破可信計算環境是非常困難的,而且他具有相容性好、運算靈活、運算效率高的優勢,確實是一個非常優秀的密碼學演算法替代品。

可信計算本質上是用硬體來構建一個反沙箱環境,外部(包括OS)不能自主訪問或更改可信硬體內部的軟體、資料。結合一些簡單的密碼學演算法,可信硬體可以與外部進行安全互動,以實現在可信環境中處理敏感資料,然後以密文形式取出並提供可靠性認證的目的。

舉個例子,騰訊計費業務沉澱的風控系統,積累了大量精準的風控模型能力,如果外部合作遊戲廠商希望藉助於騰訊的風控模型提高業務風控效果,但又不希望將使用者資訊的敏感資料對外暴露。這時就可我們透過可信計算確保風控模型與使用者資訊在可信域內處理,並結合區塊鏈,保證互動留痕、可追溯以及透明性。

當下主流的可信硬體有三種:

1. SGX (Software Guard Extension):Intel的處理器擴充套件晶片,提供有限的安全指令集,有較強計算能力,在應用層為軟體加固,本身無儲存能力。

2. TPM (Trusted Platform Module):TCG (AMD, HP, IBM, Intel, MS聯合專案) 的可信計算模組,最先啟動,可用於從硬體到軟體的認證鏈,本身擁有較弱的計算、儲存能力。

3. TrustZone:ARM架構中的可信計算擴充套件模組,非公開架構,與SGX行為相似。

由於 SGX 具有較強的計算能力,可以相容的運算邏輯靈活多樣(幾乎可以是圖靈完備的),所以我們以 SGX 為介紹主體。SGX 設計初衷是保護執行環境不被信任域外的軟硬體讀寫。這裡的敵手包括本地環境中的 OS、hypervisor、BIOS、firmware 等,即使同系統中其他軟體受到提權攻擊,也不會影響信任域內。

SGX 硬體中有固有的兩個私鑰:root seal key 和 root provisioning key,分別用於衍生加密金鑰和認證可靠性。這兩個私鑰是使用可程式設計只讀儲存器儲存的。可程式設計只讀儲存器在燒製過一次之後無法更改,而且在 SGX 中無法被外部訪問。SGX 的隔離原理如Fig. 5所示,其中 Enclave 是執行外部傳入的邏輯的一個資源分片。

Provisioning key 的使用類似證書,而Intel是一個證書發行 CA,會為所有 SGX 模組的 provisioning key 頒發一個獨立的證書。Seal key 是絕對只存在於 SGX 內的,且每一個 SGX 硬體擁有一個唯一的 seal key (當然隨機數存在碰撞,但概率極低),用於生成後續所有加密用私鑰或金鑰對。外部透過 provisioning key 的證書體系驗證 SGX 的可靠性:是否為可信環境,Enclave 中的執行邏輯是否未被篡改。內外通訊時,使用 seal key 衍生的金鑰加密。Provisioning 和 seal 兩個機制分別保證了可信計算的可靠性 (包括執行邏輯不被篡改、結果被認證) 和隱私性。

4.1 使用可信計算保護交易隱私

4.2 鏈上鍊下的橋樑

TEE 也可以用於鏈上鍊下的互聯。一些場景中需要把計算邏輯部署在鏈下,而無法以智慧合約的形式部署於區塊鏈上。例如一些國家或地區的資料不能跨地區傳到別的地區的區塊鏈上,只能在本地區對資料加工後傳出。這時候可以把資料處理邏輯部署到TEE 中,由 TEE 收集資料計算後,對結果進行簽名認證再傳到跨地區的區塊鏈上,區塊鏈節點只需要透過驗證簽名、驗證TEE的可靠性來決定是否接受該上鍊請求。

5. 安全領域自主可控之光——國密演算法

國密演算法是一套包含對稱加密、非對稱加密、簽名、雜湊等基本密碼學演算法的,從演算法設計、理論推導到開發實現都是中國自主研發的密碼學演算法集合。過去,商用密碼學演算法是美國主導的。從理論到演算法實現都是境外學者、工程師完成的。對於關係到安全的密碼學演算法是否有設計上預留的後門,我們並不確定。在諸如政務、軍事、金融等敏感領域,使用別人的演算法存在敏感資訊洩露、重要資訊被篡改的風險,因此國家推動自主的密碼學演算法勢在必行。

騰訊雲區塊鏈中使用的密碼學演算法,除了區塊鏈本身的雜湊和簽名外,更重要是在通訊過程中的證書上。騰訊雲區塊鏈平臺基於自研的國密解決方案,提供了對國密證書的支援,在區塊鏈節點與節點、區塊鏈使用者與節點間的通訊中同時支援使用傳統 ECDSA-SHA256 證書和國密 SM2-SM3 證書,在證書切換上做到配置時使用者自選、使用時使用者不感知。

目前國密演算法的支援一方面符合了金融、政務以及各類企業的安全規範要求,另一方面可幫助我國區塊鏈技術實現安全上自主可控、不受制於人。

6. 區塊鏈密碼安全特性的產業應用

說了一大堆,那麼這些在騰訊雲區塊鏈中使用到的安全技術究竟離我們的實際生活有多近呢?前文中提到的使用同態加密、零知識範圍證明實現的機密交易,使用可信計算實現的多方計算、鏈上鍊下互通究竟要怎麼用呢?以下我們介紹一些實際場景的應用。

在銀行、金融體系中,使用鏈上機密交易,透過將賬戶資訊加密後放到區塊鏈上存證,交易請求中也對交易額進行加密,以保護資金流,那麼配合同態加密或零知識證明演算法,可實現對鏈上密文的計算和對計算結果的驗證,達到交易資訊保密、交易事件可公開監管、交易結果可及時驗證的效果。舉個例子,公司 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

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;