Idemix(Identity Mixer)是一套協議加密組件,提供更強大的身份驗證和隱私保護特性。
適用場景
用戶發送交易時,需要隱藏自己的身份信息,并且不希望其他人通過追蹤交易記錄查找到自己發送的交易。即用戶的保密要求比較嚴格,具體為用戶在需要以下保密要求時,建議使用該功能:
- 匿名性(anonymity):不暴露交易者的身份;
- 無關聯性(unlinkability):無法通過多個交易確定發送者身份,即一個身份發送多條交易不會暴露這些交易來自相同的身份。
原理
發行方(issuer)頒發給用戶證書,認證用戶的一些屬性。
用戶生成ZKP(zero-knowledge proof),證明自己擁有該證書,并選擇性地暴露自己的部分屬性;將此ZKP發送給驗證方(verifier)即可。
具體在Fabric中,流程如下圖所示:
由Fabric CA或Idemixgen工具為用戶生成證書,SDK發送交易時提交用戶的身份證明,MSP可以驗證用戶的身份, chaincode中可以獲取用戶暴露的身份屬性。
Idemix證書等身份信息的簽發過程類似X.509數字證書,都是對一組屬性進行數字簽名,該數字簽名無法被偽造并且和私鑰文件關聯。同時,Idemix用零知識證明確保用戶在某些屬性上的簽名有效。
Idemix技術基于盲簽名方案,支持多個消息和簽名擁有有效零知識證明。這保證了Idemix支持無關聯性(unlinkability)。即使發行人也無法將證明關聯到原始證書,發行人和驗證者都不能判斷兩個證明是否來自同一證書。
*備注:盲簽名(blind signature scheme)
性質:
??1)簽名者對其所簽署的消息是不可見的,即簽名者不知道他所簽署消息的具體內容。
??2)簽名消息不可追蹤,即當簽名消息被公布后,簽名者無法知道這是他哪次簽署的。
模型:
接收者首先將待簽數據進行盲變換,把變換后的盲數據發給簽名者。
經簽名者簽名后再發給接收者。
接收者對簽名再作去盲變換,得出的便是簽名者對原數據的盲簽名。
這樣便滿足了性質1)。
要滿足性質2),必須使簽名者事后看到盲簽名時不能與盲數據聯系起來,這通常是依靠某種協議來實現的。
實際操作:
- 使用Fabric CA或idemixgen工具生成簽發者的私鑰和證書等。
??1)使用Fabric CA:Fabric CA server(>= Version 1.3)啟動時會自動在主目錄下生成相關的證書文件。啟動命令如下:
fabric-ca-server init
也可以使用docker啟動,啟動后生成的文件目錄結構如下:
fabric-ca-server
├── IssuerPublicKey
├── IssuerRevocationPublicKey
├── ca-cert.pem
├── fabric-ca-server-config.yaml
├── fabric-ca-server.db
└── msp
└── keystore
├── IssuerRevocationPrivateKey
├── IssuerSecretKey
└── ee8fe16f689fa3c5ad0b7de96366bde0f8c80478b83b5b09801af38af2779a8a_sk
??2)使用idemixgen工具:生成簽發者的私鑰和證書等,使用如下命令(其中output參數指定證書存放路徑):
idemixgen ca-keygen --output="idemix-config-dir"
生成文件的目錄結構如下:
idemix-config-dir
├── ca
│ ├── IssuerPublicKey
│ ├── IssuerSecretKey
│ └── RevocationKey
└── msp
├── IssuerPublicKey
└── RevocationPublicKey
- 啟動fabric環境之前,需要修改configtx.yaml文件,配置驗證者的相關信息,具體添加內容如下:
- &Org1Idemix
# defaultorg defines the organization which is used in the sampleconfig
# of the fabric.git development environment
name: idemixMSP1
# id to load the msp definition as
id: idemixMSPID1
msptype: idemix
mspdir: idemix-config-dir
- 使用Fabric Java SDK提供的idemixEnroll接口為用戶申請身份,然后可以使用和普通證書相同的方式發送交易。
此外,idemixgen也可以為用戶生成簽名文件,但是暫時沒法使用命令行發送idemix簽名的交易。生成命令如下:
idemixgen signerconfig –u ORG-UNIT –e ENROLLMENTID –r REVOCATIONHANDLE --output=idemix-config-dir
默認是member身份,如果想生成admin身份,加參數-a。
- chaincode中cid庫提供函數GetAttributeValue可以獲取身份的ou(organization unit,e.g. “org1.department1”)和role(e.g. “member”)信息,具體使用見如下代碼【摘自官網】:
// Getting attributes from an idemix credential
ou, found, err := cid.GetAttributeValue(stub, "ou");
if err != nil {
return shim.Error("Failed to get attribute 'ou'")
}
if !found {
return shim.Error("attribute 'ou' not found")
}
if !strings.HasSuffix(ou, "department1") {
return shim.Error(fmt.Sprintf("Incorrect 'ou' returned, got '%s' expecting to end with 'department1'", ou))
}
role, found, err := cid.GetAttributeValue(stub, "role");
if err != nil {
return shim.Error("Failed to get attribute 'role'")
}
if !found {
return shim.Error("attribute 'role' not found")
}
if role != "member" {
return shim.Error(fmt.Sprintf("Incorrect 'role' returned, got '%s' expecting 'member'", role))
}
局限性
- 目前只有Fabric Java SDK提供了相關API獲取用戶身份和發送交易,其他SDK暫不支持;
- 目前合約只有Golang提供了API獲取用戶身份的屬性值;
- 目前只支持固定的屬性,不支持自定義屬性。具體支持的屬性包括:Organizational Unit attribute (“ou”),Role attribute (“role”),Enrollment ID attribute,Revocation Handle attribute;
- 不支持證書的廢除;
- peer并不使用Idemix背書,Idemix簽名在Client SDK,peer僅支持驗簽。