Idemix是一个加密协议套件,它提供强大的身份验证以及隐私保护功能,如匿名,无需披露交易者身份即可进行交易,以及不可链接性,即单个身份发送多个交易的能力,而不会泄露 交易是通过相同的身份发送的。
Idemix流中涉及三个参与者:用户,发行者和验证者。
例如,假设“爱丽丝”需要向鲍勃(店员)证明她拥有由DMV发给她的驾驶执照。
在这种情况下,Alice是用户,DMV是发行者,Bob是验证者。 为了向鲍勃证明爱丽丝有驾驶执照,她可以向他展示。 然而,Bob可以看到Alice的姓名,地址,确切的年龄等等 - 比Bob需要了解的信息更多。 相反,Alice可以使用Idemix为Bob生成“零知识证明”,只显示她拥有有效的驾驶执照而没有其他任何内容。
所以从证明来看:
Idemix身份验证技术提供的信任模型和安全保证类似于标准X.509证书所确保的信任模型和安全保证,但具有有效提供高级隐私功能的基础加密算法,包括上述隐私功能。 我们将在下面的技术部分详细比较Idemix和X.509技术。
要了解如何将Idemix与Hyperledger Fabric一起使用,我们需要查看哪些Fabric组件与Idemix中的用户,颁发者和验证者相对应。
要在Hyperledger Fabric中使用Idemix,需要以下三个基本步骤:
比较此图中的角色与上面的角色。
Fabric CA(版本1.3或更高版本)已得到增强,可自动充当Idemix颁发者。 当fabric-ca-server启动(或通过fabric-ca-server init命令初始化)时,将在fabric-ca-server的主目录中自动创建以下两个文件:IssuerPublicKey和IssuerRevocationPublicKey。 这些文件在步骤2中是必需的。
对于开发环境,如果您不使用Fabric CA,可以使用``idemixgen``来创建这些文件。
您需要使用步骤1中的IssuerPublicKey和IssuerRevocationPublicKey创建Idemix MSP。
例如,请考虑以下摘录自Hyperledger Java SDK示例中的configtx.yaml(https://github.com/hyperledger/fabric-sdk-java/blob/master/src/test/fixture/sdkintegration/e2e-2Orgs/v1.3/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: crypto-config/peerOrganizations/org3.example.com
msptype设置为idemix,mspdir目录的内容(本例中为crypto-config / peerOrganizations / org3.example.com / msp)包含IssuerPublicKey和IssuerRevocationPublicKey文件。
请注意,在此示例中,Org1Idemix表示Org1的Idemix MSP(未显示),它也具有X509 MSP。
考虑用户。 回想一下,Java SDK是用户的API。为了将Idemix与Java SDK一起使用,只需要一个额外的API调用:org.hyperledger.fabric_ca.sdk.HFCAClient类的idemixEnroll方法。 例如,假设hfcaClient是您的HFCAClient对象,x509Enrollment是与您的X509证书关联的org.hyperledger.fabric.sdk.Enrollment。
以下调用将返回与您的Idemix凭据关联的org.hyperledger.fabric.sdk.Enrollment对象。
IdemixEnrollment idemixEnrollment = hfcaClient.idemixEnroll(x509enrollment, "idemixMSPID1");
另请注意,IdemixEnrollment实现了org.hyperledger.fabric.sdk.Enrollment接口,因此可以使用与使用X509注册对象相同的方式,当然,这会自动提供Idemix的隐私增强功能。
从验证者的角度来看,还有一个要考虑的角色:链码。 使用Idemix凭证时,链码可以了解有关交易者的信息吗?
当使用Idemix凭证时,cid(客户端标识)库(仅用于golang)(https://github.com/hyperledger/fabric/tree/master/core/chaincode/shim/ext/cid)已扩展为支持GetAttributeValue函数。 但是,正如下面“Current limitations”部分所述,Idemix案例中只公开了两个属性:ou和role。
如果Fabric CA是凭证颁发者:
Idemix的当前版本确实存在一些限制。
- 固定的属性集
尚无法使用自定义属性去发布或使用Idemix凭据。 将来的版本将支持自定义属性。
下面的四种属性是目前版本支持的:
1.组织单位属性(“ou”):
用法:与X.509相同
类型:字符串
显示(Revealed):永远
2.角色属性(“role”):
用法:与X.509相同
类型:整数
显示(Revealed):永远
3.注册ID属性
用法:唯一标识用户 - 在属于同一用户的所有注册凭据中相同(将在未来版本中用于审核)
类型:BIG
显示:从不在签名中,仅在为Fabric CA生成身份验证令牌时。
4.撤销句柄属性
用法:唯一标识凭证(将在以后的版本中用于撤销)
类型:整数
显示:永远不会
- 撤销尚不支持
尽管上面提到的撤销句柄属性的存在可以看到很多撤销框架已经到位,但尚不支持撤销Idemix凭据。
- peer不使用Idemix进行背书
目前,peer仅使用Idemix MSP进行签名验证。 使用Idemix进行签名只能通过Client SDK完成。 Idemix MSP将支持更多角色(包括'peer'角色)。
证书/凭证概念和颁发过程在Idemix和X.509证书中非常相似:一组属性使用无法伪造的签名进行数字签名,并且存在以加密方式绑定凭证的密钥。
标准X.509证书和Identity Mixer凭证之间的主要区别是用于验证属性的签名方案。 身份混合器系统的基础签名允许拥有签名和相应的属性的有效证明,而不会泄露签名和(选定的)属性值本身。 我们使用零知识证明来确保在某些属性上的签名有效并且用户拥有相应的凭证密钥时不泄露这样的“知识”或“信息”。
此类证明(如X.509证书)可以使用最初签署凭证的权限的公钥进行验证,并且无法成功伪造。 只有知道凭证密钥的用户才能生成有关凭证及其属性的证明。
关于不可链接性,当呈现X.509证书时,必须显示所有属性以验证证书签名。 这意味着签署事务的所有证书用法都是可链接的。
为了避免这种可链接性,每次都需要使用新的X.509证书,这会导致复杂的密钥管理以及通信和存储开销。 此外,有些情况下,即使颁发证书的CA也不能将所有事务链接到用户,这点也很重要。
Idemix有助于避免CA和验证者的可链接性,因为即使CA也无法将证据链接到原始凭证。 发行人和验证者都不能判断两个证据是否来自同一凭证(或来自两个不同的凭证)。
有关Identity Mixer技术的概念和功能的更多详细信息,请参阅“隐私保护基于属性的身份验证的概念和语言”一文。(https://link.springer.com/content/pdf/10.1007%2F978-3-642-37282-7_4.pdf)
Idemix技术是基于盲签名方案构建的,该方案支持多个消息和签名拥有的有效零知识证明。 Idemix的所有加密构建块都在顶级会议和期刊上发布,并由科学界进行验证。Fabric的这种特殊的Idemix实现使用基于配对的签名方案,该方案由Camenisch和Lysyanskaya(https://link.springer.com/content/pdf/10.1007%2F978-3-540-28628-8_4.pdf)简要提出并由Au(https://eprint.iacr.org/2016/663.pdf)等人详细描述。在零知识证明中证明签名知识的能力让Camenisch等人使用了。