Hyperledger Fabric 1.3 特性调研之Identity Mixer(一)

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仅支持验签。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容