Idemix(Identity Mixer)是一套協(xié)議加密組件,提供更強(qiáng)大的身份驗(yàn)證和隱私保護(hù)特性。
適用場景
用戶發(fā)送交易時(shí),需要隱藏自己的身份信息,并且不希望其他人通過追蹤交易記錄查找到自己發(fā)送的交易。即用戶的保密要求比較嚴(yán)格,具體為用戶在需要以下保密要求時(shí),建議使用該功能:
- 匿名性(anonymity):不暴露交易者的身份;
- 無關(guān)聯(lián)性(unlinkability):無法通過多個(gè)交易確定發(fā)送者身份,即一個(gè)身份發(fā)送多條交易不會(huì)暴露這些交易來自相同的身份。
原理
發(fā)行方(issuer)頒發(fā)給用戶證書,認(rèn)證用戶的一些屬性。
用戶生成ZKP(zero-knowledge proof),證明自己擁有該證書,并選擇性地暴露自己的部分屬性;將此ZKP發(fā)送給驗(yàn)證方(verifier)即可。
具體在Fabric中,流程如下圖所示:

由Fabric CA或Idemixgen工具為用戶生成證書,SDK發(fā)送交易時(shí)提交用戶的身份證明,MSP可以驗(yàn)證用戶的身份, chaincode中可以獲取用戶暴露的身份屬性。
Idemix證書等身份信息的簽發(fā)過程類似X.509數(shù)字證書,都是對(duì)一組屬性進(jìn)行數(shù)字簽名,該數(shù)字簽名無法被偽造并且和私鑰文件關(guān)聯(lián)。同時(shí),Idemix用零知識(shí)證明確保用戶在某些屬性上的簽名有效。
Idemix技術(shù)基于盲簽名方案,支持多個(gè)消息和簽名擁有有效零知識(shí)證明。這保證了Idemix支持無關(guān)聯(lián)性(unlinkability)。即使發(fā)行人也無法將證明關(guān)聯(lián)到原始證書,發(fā)行人和驗(yàn)證者都不能判斷兩個(gè)證明是否來自同一證書。
*備注:盲簽名(blind signature scheme)
性質(zhì):
??1)簽名者對(duì)其所簽署的消息是不可見的,即簽名者不知道他所簽署消息的具體內(nèi)容。
??2)簽名消息不可追蹤,即當(dāng)簽名消息被公布后,簽名者無法知道這是他哪次簽署的。
模型:
接收者首先將待簽數(shù)據(jù)進(jìn)行盲變換,把變換后的盲數(shù)據(jù)發(fā)給簽名者。
經(jīng)簽名者簽名后再發(fā)給接收者。
接收者對(duì)簽名再作去盲變換,得出的便是簽名者對(duì)原數(shù)據(jù)的盲簽名。
這樣便滿足了性質(zhì)1)。
要滿足性質(zhì)2),必須使簽名者事后看到盲簽名時(shí)不能與盲數(shù)據(jù)聯(lián)系起來,這通常是依靠某種協(xié)議來實(shí)現(xiàn)的。
實(shí)際操作:
- 使用Fabric CA或idemixgen工具生成簽發(fā)者的私鑰和證書等。
??1)使用Fabric CA:Fabric CA server(>= Version 1.3)啟動(dòng)時(shí)會(huì)自動(dòng)在主目錄下生成相關(guān)的證書文件。啟動(dòng)命令如下:
fabric-ca-server init
也可以使用docker啟動(dòng),啟動(dòng)后生成的文件目錄結(jié)構(gòu)如下:
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工具:生成簽發(fā)者的私鑰和證書等,使用如下命令(其中output參數(shù)指定證書存放路徑):
idemixgen ca-keygen --output="idemix-config-dir"
生成文件的目錄結(jié)構(gòu)如下:
idemix-config-dir
├── ca
│ ├── IssuerPublicKey
│ ├── IssuerSecretKey
│ └── RevocationKey
└── msp
├── IssuerPublicKey
└── RevocationPublicKey
- 啟動(dòng)fabric環(huán)境之前,需要修改configtx.yaml文件,配置驗(yàn)證者的相關(guān)信息,具體添加內(nèi)容如下:
- &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接口為用戶申請(qǐng)身份,然后可以使用和普通證書相同的方式發(fā)送交易。
此外,idemixgen也可以為用戶生成簽名文件,但是暫時(shí)沒法使用命令行發(fā)送idemix簽名的交易。生成命令如下:
idemixgen signerconfig –u ORG-UNIT –e ENROLLMENTID –r REVOCATIONHANDLE --output=idemix-config-dir
默認(rèn)是member身份,如果想生成admin身份,加參數(shù)-a。
- chaincode中cid庫提供函數(shù)GetAttributeValue可以獲取身份的ou(organization unit,e.g. “org1.department1”)和role(e.g. “member”)信息,具體使用見如下代碼【摘自官網(wǎng)】:
// 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提供了相關(guān)API獲取用戶身份和發(fā)送交易,其他SDK暫不支持;
- 目前合約只有Golang提供了API獲取用戶身份的屬性值;
- 目前只支持固定的屬性,不支持自定義屬性。具體支持的屬性包括:Organizational Unit attribute (“ou”),Role attribute (“role”),Enrollment ID attribute,Revocation Handle attribute;
- 不支持證書的廢除;
- peer并不使用Idemix背書,Idemix簽名在Client SDK,peer僅支持驗(yàn)簽。