在上一篇文章中,我们以最简单的生成DID,颁发VC,验证VP流程介绍了DID的用法,但是在实际生活中,我们并不总是希望直接将整个证件VC亮给验证者看,比如我们去住酒店时,需要登记姓名、身份证号信息,但是如果我们直接把身份证给前台人员的话,前台人员就可以看到我们的民族、住址等信息,对于我们普通人来说,也许觉得没什么,那要是明星、公众人物去住酒店,那么可能前台人员就可能出于各方面的原因偷偷把住址信息记下了或者泄露到网上,给证照本人的生活带来各种麻烦。那么我们有什么办法呢?用户属性的选择性披露能够降低风险。
我们以小明从公安机关获得身份证VC,然后在住酒店时,只出示姓名、照片和身份证号,不对外暴露民族和住址(因为身份证编号里面已经有生日了,所以我们就忽略掉出生日期属性)为例,说明用户属性的选择性披露的处理过程。
0x0.准备知识1:默克尔树
关于Merkle Tree默克尔树的介绍,网上已经很多了,只要讲解比特币基本原理的应该都会讲到默克尔树。使用默克尔树的目的是为了能够将一个区块中的所有交易形成一个短小的指纹(默克尔根,哈希值),并将这个指纹放到区块头,任何对交易的篡改都会导致指纹变化。而我们使用默克尔树而不是直接将区块中所有的交易直接算哈希的原因是因为我们希望能够进行快速的简单支付验证(SPV)。
我们以4个交易组成的默克尔树为例,我们要验证Data2是否被包含在区块中,只需要给出:
- 要验证的原始数据:Data2
- 要验证的数据所在的位置索引:1 (索引以0开始,所以Data2的索引是1)
- 验证路径:[Hash1,Hash34]
- 默克尔根:MerkleRoot
通过这4个参数,我们就能确认Data2是否被包含在这棵树中了。
0x1.准备知识2:基于种子的无限序列
基于前面提到的默克尔树和默克尔验证,我们可以将用户的属性作为Data部分计算默克尔树,比如我们要对身份证上的属性构建默克尔树:
基于上面的默克尔树,我们可以只暴露生日,而不暴露其他字段,然后给出验证路径,从而证明生