群/環簽名技術實現

買賣虛擬貨幣

前言

安全與隱私一直是區塊鏈領域的熱點話題,也是各大主流區塊鏈平臺必爭的戰略高地。FISCO BCOS從底層到應用、架構到協議、儲存到網路等多方面針對安全和隱私作出較大努力,目前已實現賬戶管理、落盤加密、安全通訊、許可權控制等功能模組。本文將對FISCO BCOS隱私特性之一群環簽名展開介紹。

群/環簽名是一種特殊的簽名演算法,最初是為了實現隱匿支付而應用在區塊鏈領域。其能很好地隱藏簽名者身份,既能讓節點驗證交易簽名的正確性,又不會暴露交易發起者的公鑰資訊。這一特性在聯盟鏈中有著廣闊的應用前景。

什麼是群/環簽名

瞭解群/環簽名,得從匿名性說起。

在現實世界,匿名性是指主體的行為不會暴露主體的身份,這幾乎是人類文明誕生伊始便存在的需求。

從密碼學的角度,匿名性有兩種含義:給定一個密文,無法還原其公鑰,主要用於密碼演算法的安全性分析;

使用者使用密碼方案過程中不會發生身份資訊的洩露,更符合現實世界的語義。

密碼學中最早隱含身份概念的是電子簽名,簽名者透過私鑰對訊息簽名,驗證者可以使用簽名者的公鑰驗證簽名的合法性。在實際應用中,公鑰往往和證書繫結(基於身份加密除外,因為身份即公鑰,所以沒有證書),證書的屬性天然揭露屬主的身份資訊,所以傳統的簽名方案缺少匿名性。

上世紀九十年代初,Chaum和van Heyst在歐密會(EUROCRYPT)上提出了群簽名的概念,有效解決了電子簽名的身份隱私問題。

群簽名中的“群”可以理解成一個組織。組織裡有一個leader即群主,負責成員管理,組織裡的每個成員都可以匿名地代表組織進行簽名。群簽名方案主要演算法包括:建立群,由群主執行,生成群主私鑰和群公鑰;新增群成員,由群主執行,生成群成員私鑰和證書,證書用於證明群成員身份;生成群簽名,群成員透過私鑰對資訊簽名;驗證群簽名,驗證者可透過群公鑰驗證簽名的合法性,驗證者可以判定這個簽名確實來自這個群,但無法確定是哪一個群成員的簽名;

開啟群簽名,群主可透過簽名資訊獲取簽名者證書,從而追蹤到簽名者身份。

由於群簽名存在一個擁有絕對許可權的群主角色,所以群簽名的匿名性是相對的。這種特性適用於需要監管介入的場景。

為了追求完全匿名性,Rivest於2001年提出了一種無群主方案,任何成員可自發地加入組織。該方案中籤名隱含的某個引數按照一定規則組成環狀,因而被命名成環簽名。本質上“群”和“環”都可理解為多個成員組成的組織,區別在於是否存在一個能開啟簽名的leader。環簽名演算法流程如下:初始化環,由環成員執行,生成環引數,環引數就好比微信面對面建群的密碼,任何知道該引數的成員都可以加入該環;加入環,由環成員執行,透過環引數獲得公私鑰對;生成環簽名,環成員使用私鑰和隨意多個環公鑰對資訊簽名;

驗證環簽名,驗證者可透過環引數驗證簽名的合法性。

環簽名方案將簽名者公鑰隱藏在了簽名使用的公鑰列表中,公鑰列表越大,匿名性越高,適用於對隱私要求較高的多方協作場景。

FISCOBCOS的技術選型

目前,群/環簽名主要應用在投票、競標、競拍等場景以保障參與者身份隱私。對聯盟鏈而言,同一聯盟內的多個機構有協作也有博弈,在某些場景下,保護使用者身份是非常必要的。

FISCO BCOS整合的群/環簽名方案,為使用者提供一種能夠保證身份匿名性的工具。基於對方案複雜度和鏈上計算成本的考量,鏈上只保留了最有必要的步驟,即簽名驗證,其他演算法則以獨立功能元件形式提供給應用層。

應用於區塊鏈的群簽名方案需要滿足以下兩點:為了方便成員管理,需要支援群成員的撤銷;

考慮到區塊鏈儲存資源有限,因此簽名資料不能太大,可對齊標準的RSA簽名。

因此,我們選擇了首個兼具上述特性的群簽名方案BBS04《Short Group Signatures》,該方案由Boneh於2004年在美密會(CRYPTO)上提出。

環簽名不存在能夠開啟簽名的第三方,為了方便追責,防止簽名者被誣陷,需要一種具備指責關聯性和抗誹謗性的方案,即基於相同公鑰列表生成的兩個環簽名可判斷是否來自同一個簽名者。基於這層考慮,我們選擇了Joseph在04年提出的首個可連結的環簽名方案LSAG《Linkable Spontaneous Anonymous Group Signature for Ad Hoc Groups》。

BBS04方案基於雙線性對構造,群管理員可根據不同的線性對初始化群。不同線性對型別下的群簽名儲存和計算開銷如下:

其中各個線性對的群階數可自由配置,上述實驗使用了預設值。可以看到,鏈上驗證的時間開銷差距並不大,使用者可根據自己安全性和效能需求,選擇合適的線性對型別以及群階數。

LSAG方案中,不同環大小的環簽名儲存和計算開銷如下:

由於環簽名長度、簽名和驗證時間與環成員數目呈線性關係,為防止超gas,環成員數量建議不超過32個。

如何在FISCOBCOS中使用群/環簽名

FISCO BCOS 2.3版本以預編譯合約的形式整合了BBSO4方案和LSAG方案的簽名驗證演算法。由於這些隱私保護特性預設不開啟,要啟用這些功能需要開啟CRYPTO_EXTENSION編譯選項,並重新編譯原始碼。

群/環簽名預編譯合約地址分配如下:

要完成預編譯合約的呼叫,首先需要以solidity合約方式宣告合約介面。

群簽名

// GroupSigPrecompiled.solpragma solidity ^0.4.24;contract GroupSigPrecompiled {     function groupSigVerify(string signature, string message, string gpkInfo, string paramInfo) public constant returns(bool);}

環簽名

// RingSigPrecompiled.solpragma solidity ^0.4.24;contract RingSigPrecompiled {     function ringSigVerify(string signature, string message, string paramInfo) public constant returns(bool);}

以驗證環簽名為例(請確保同級目錄下已有上述的介面宣告合約),在業務合約中透過地址例項化預編譯合約物件以完成驗證介面的呼叫:

// TestRingSig.solpragma solidity ^0.4.24;import "./RingSigPrecompiled.sol";contract TestRingSig {    RingSigPrecompiled ringSig;functionTestRingSig(){        // 例項化RingSigPrecompiled合約        ringSig = RingSigPrecompiled(0x5005);     }functionverify(stringsignature,stringmessage,stringparamInfo)publicconstantreturns(bool){        return ringSig.ringSigVerify(signature, message, paramInfo);    }}

除了預編譯合約介面,FISCO BCOS還額外提供了兩個核心模組供使用者使用,分別是一個完整的群/環簽名庫以及一個群/環簽名RPC服務端。簽名庫和服務端獨立於區塊鏈平臺,使用者也可以基於簽名庫定製化地開發自己的服務端。簽名資訊可在鏈上進行儲存,然後透過在合約中呼叫驗證介面,完成簽名合法性的驗證。

FISCO BCOS為使用者提供了一個群/環簽名的開發示例,以客戶端為操作入口,示例架構如下圖所示:

群/環簽名客戶端呼叫服務端的RPC介面完成群/環的建立、成員的加入以及簽名的生成;同時客戶端與區塊鏈平臺互動,將簽名資訊上鍊;最後客戶端呼叫預編譯合約驗證鏈上的簽名。更多的操作步驟和技術細節,請參閱群/環簽名客戶端指南。參考連結如下:

https://github.com/FISCO-BCOS/group-signature-client

改進的方向

在學術界,群/環簽名的發展已經比較成熟,基於不同場景誕生了很多新的方案。

例如,支援群成員主動加入的方案能有效抵抗群主作惡的陷害行為;可撤銷匿名性的環簽名方案支援簽名者在特定場合將環簽名轉換成一個普通簽名,以證明自己的簽署者身份;支援前項安全的方案能保證使用者私鑰洩露不對之前簽名的匿名性產生影響。

目前,FISCO BCOS整合的群/環簽名方案各有一種,未來對於更復雜的需求,會增加更多支援方案,為使用者提供更多選擇。同時,針對現有客戶端示例可移植性不佳的情況,未來會考慮以外掛的方式提供,方便業務快速接入。

結語

安全與隱私是一個複雜、廣闊、充滿挑戰的領域。

群/環簽名模組只是為使用者身份提供了匿名性保護,如何結合其它密碼協議構建更加可靠、健全的安全區塊鏈平臺?如何降低使用者的使用成本和開銷,提供多維度、高可用的隱私保護服務?以上問題需要我們不斷研究探索。

免責聲明:

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

推荐阅读

;