· 開啟群簽名,群主可透過簽名資訊獲取簽名者證書,從而追蹤到簽名者身份。
由於群簽名存在一個擁有絕對許可權的群主角色,所以群簽名的匿名性是相對的。這種特性適用於需要監管介入的場景。
為了追求完全匿名性,Rivest於2001年提出了一種無群主方案,任何成員可自發地加入組織。該方案中籤名隱含的某個引數按照一定規則組成環狀,因而被命名成環簽名。本質上“群”和“環”都可理解為多個成員組成的組織,區別在於是否存在一個能開啟簽名的leader。
環簽名演算法流程如下:
· 初始化環,由環成員執行,生成環引數,環引數就好比微信面對面建群的密碼,任何知道該引數的成員都可以加入該環;
· 加入環,由環成員執行,透過環引數獲得公私鑰對;
· 生成環簽名,環成員使用私鑰和隨意多個環公鑰對資訊簽名;
· 驗證環簽名,驗證者可透過環引數驗證簽名的合法性。
環簽名方案將簽名者公鑰隱藏在了簽名使用的公鑰列表中,公鑰列表越大,匿名性越高,適用於對隱私要求較高的多方協作場景。
FISCO BCOS的技術選型
目前,群/環簽名主要應用在投票、競標、競拍等場景以保障參與者身份隱私。對聯盟鏈而言,同一聯盟內的多個機構有協作也有博弈,在某些場景下,保護使用者身份是非常必要的。
FISCO BCOS整合的群/環簽名方案,為使用者提供一種能夠保證身份匿名性的工具。基於對方案複雜度和鏈上計算成本的考量,鏈上只保留了最有必要的步驟,即簽名驗證,其他演算法則以獨立功能元件形式提供給應用層。
應用於區塊鏈的群簽名方案需要滿足以下兩點:
1. 為了方便成員管理,需要支援群成員的撤銷;
2. 考慮到區塊鏈儲存資源有限,因此簽名資料不能太大,可對齊標準的RSA簽名。
因此,我們選擇了首個兼具上述特性的群簽名方案BBS04《Short Group Signatures》,該方案由Boneh於2004年在美密會(CRYPTO)上提出。
環簽名不存在能夠開啟簽名的第三方,為了方便追責,防止簽名者被誣陷,需要一種具備指責關聯性和抗誹謗性的方案,即基於相同公鑰列表生成的兩個環簽名可判斷是否來自同一個簽名者。基於這層考慮,我們選擇了Joseph在04年提出的首個可連結的環簽名方案LSAG《Linkable Spontaneous Anonymous Group Signature for Ad Hoc Groups》。
BBS04方案基於雙線性對構造,群管理員可根據不同的線性對初始化群。不同線性對型別下的群簽名儲存和計算開銷如下:
其中各個線性對的群階數可自由配置,上述實驗使用了預設值。可以看到,鏈上驗證的時間開銷差距並不大,使用者可根據自己安全性和效能需求,選擇合適的線性對型別以及群階數。
LSAG方案中,不同環大小的環簽名儲存和計算開銷如下:
由於環簽名長度、簽名和驗證時間與環成員數目呈線性關係,為防止超gas,環成員數量建議不超過32個。
如何在FISCO BCOS中使用群/環簽名
FISCO BCOS 2.3版本以預編譯合約的形式整合了BBSO4方案和LSAG方案的簽名驗證演算法。由於這些隱私保護特性預設不開啟,要啟用這些功能需要開啟CRYPTO_EXTENSION編譯選項,並重新編譯原始碼。
群/環簽名預編譯合約地址分配如下:
要完成預編譯合約的呼叫,首先需要以solidity合約方式宣告合約介面。
群簽名
// GroupSigPrecompiled.sol
pragma solidity ^0.4.24;
contract GroupSigPrecompiled {
function groupSigVerify(string signature, string message, string gpkInfo, string paramInfo) public constant returns(bool);
}
環簽名
// RingSigPrecompiled.sol
pragma solidity ^0.4.24;
contract RingSigPrecompiled {
function ringSigVerify(string signature, string message, string paramInfo) public constant returns(bool);
}
以驗證環簽名為例(請確保同級目錄下已有上述的介面宣告合約),在業務合約中透過地址例項化預編譯合約物件以完成驗證介面的呼叫:
// TestRingSig.sol
pragma solidity ^0.4.24;
import "./RingSigPrecompiled.sol";
contract TestRingSig {
RingSigPrecompiled ringSig;
function TestRingSig()
{
// 例項化RingSigPrecompiled合約
ringSig = RingSigPrecompiled(0x5005);
}
function verify(string signature, string message, string paramInfo) public constant returns(bool)
{
return ringSig.ringSigVerify(signature, message, paramInfo);
}
}
除了預編譯合約介面,FISCO BCOS還額外提供了兩個核心模組供使用者使用,分別是一個完整的群/環簽名庫以及一個群/環簽名RPC服務端。簽名庫和服務端獨立於區塊鏈平臺,使用者也可以基於簽名庫定製化地開發自己的服務端。簽名資訊可在鏈上進行儲存,然後透過在合約中呼叫驗證介面,完成簽名合法性的驗證。
FISCO BCOS為使用者提供了一個群/環簽名的開發示例,以客戶端為操作入口,示例架構如下圖所示:
群/環簽名客戶端呼叫服務端的RPC介面完成群/環的建立、成員的加入以及簽名的生成;同時客戶端與區塊鏈平臺互動,將簽名資訊上鍊;最後客戶端呼叫預編譯合約驗證鏈上的簽名。更多的操作步驟和技術細節,請參閱群/環簽名客戶端指南。參考連結如下:https://github.com/FISCO-BCOS/group-signature-client
改進的方向
在學術界,群/環簽名的發展已經比較成熟,基於不同場景誕生了很多新的方案。
例如,支援群成員主動加入的方案能有效抵抗群主作惡的陷害行為;可撤銷匿名性的環簽名方案支援簽名者在特定場合將環簽名轉換成一個普通簽名,以證明自己的簽署者身份;支援前項安全的方案能保證使用者私鑰洩露不對之前簽名的匿名性產生影響。
目前,FISCO BCOS整合的群/環簽名方案各有一種,未來對於更復雜的需求,會增加更多支援方案,為使用者提供更多選擇。同時,針對現有客戶端示例可移植性不佳的情況,未來會考慮以外掛的方式提供,方便業務快速接入。
結語
安全與隱私是一個複雜、廣闊、充滿挑戰的領域。
群/環簽名模組只是為使用者身份提供了匿名性保護,如何結合其它密碼協議構建更加可靠、健全的安全區塊鏈平臺?如何降低使用者的使用成本和開銷,提供多維度、高可用的隱私保護服務?以上問題需要我們不斷研究探索。
最後,歡迎有志之士加入FISCO BCOS安全性建設,為構建牢不可破的隱私之牆添磚加瓦。