Hyperledger Fabric 1.3 特性调研之Iden

作者: RaeSnow | 来源:发表于2019-07-03 16:13 被阅读0次

    Idemix(Identity Mixer)是一套协议加密组件,提供更强大的身份验证和隐私保护特性。

    适用场景

    用户发送交易时,需要隐藏自己的身份信息,并且不希望其他人通过追踪交易记录查找到自己发送的交易。即用户的保密要求比较严格,具体为用户在需要以下保密要求时,建议使用该功能:

    • 匿名性(anonymity):不暴露交易者的身份;
    • 无关联性(unlinkability):无法通过多个交易确定发送者身份,即一个身份发送多条交易不会暴露这些交易来自相同的身份。

    原理

    发行方(issuer)颁发给用户证书,认证用户的一些属性。
    用户生成ZKP(zero-knowledge proof),证明自己拥有该证书,并选择性地暴露自己的部分属性;将此ZKP发送给验证方(verifier)即可。
    具体在Fabric中,流程如下图所示:


    idemix-overview.png

    由Fabric CA或Idemixgen工具为用户生成证书,SDK发送交易时提交用户的身份证明,MSP可以验证用户的身份, chaincode中可以获取用户暴露的身份属性。

    Idemix证书等身份信息的签发过程类似X.509数字证书,都是对一组属性进行数字签名,该数字签名无法被伪造并且和私钥文件关联。同时,Idemix用零知识证明确保用户在某些属性上的签名有效。
    Idemix技术基于盲签名方案,支持多个消息和签名拥有有效零知识证明。这保证了Idemix支持无关联性(unlinkability)。即使发行人也无法将证明关联到原始证书,发行人和验证者都不能判断两个证明是否来自同一证书。

    *备注:盲签名(blind signature scheme)

    性质:

      1)签名者对其所签署的消息是不可见的,即签名者不知道他所签署消息的具体内容。
      2)签名消息不可追踪,即当签名消息被公布后,签名者无法知道这是他哪次签署的。

    模型:

    接收者首先将待签数据进行盲变换,把变换后的盲数据发给签名者。
    经签名者签名后再发给接收者。
    接收者对签名再作去盲变换,得出的便是签名者对原数据的盲签名。
    这样便满足了性质1)。
    要满足性质2),必须使签名者事后看到盲签名时不能与盲数据联系起来,这通常是依靠某种协议来实现的。

    实际操作:

    1. 使用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
    
    1. 启动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
    
    1. 使用Fabric Java SDK提供的idemixEnroll接口为用户申请身份,然后可以使用和普通证书相同的方式发送交易。
      此外,idemixgen也可以为用户生成签名文件,但是暂时没法使用命令行发送idemix签名的交易。生成命令如下:
    idemixgen signerconfig –u ORG-UNIT –e ENROLLMENTID –r REVOCATIONHANDLE --output=idemix-config-dir
    

    默认是member身份,如果想生成admin身份,加参数-a。

    1. 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仅支持验签。

    相关文章

      网友评论

        本文标题:Hyperledger Fabric 1.3 特性调研之Iden

        本文链接:https://www.haomeiwen.com/subject/vpqchctx.html