近日,一则新闻吸引了社会各界的关注:
近日,山东冠县一农家女被冒名顶替上大学一事引发关注。目前冒名顶替者已被停职,2020年6月12日,冠县烟庄街道办事处相关工作人员对界面新闻证实,顶替者陈某某在该街道办事处审计所已工作十余年。(转载自界面新闻)
这样的事件让大众深感遗憾与痛心的同时,也从侧面反映出我们所生活的社会环境迫切需要强有力的信任场景来保证这样的事件不再出现。正如我们上一期文章《ONT ID 2.0重磅发布:支持统一账户、学分和毕业凭证等实用场景》所介绍的那样:
学生在申请奖学金或者工作实习机会时,一般会向奖学金或者工作实习机会的第三方提供学分/毕业情况,让第三方验证是否具备资格。
采用基于 ONT ID 的可验证凭证技术对学生学分或者毕业情况进行认证,可以使得第三方迅速地对学生学分情况进行验证,并以此判断是否满足相应资格。结合选择性披露技术,学生可以在不披露实际分数的情况下可以向第三方证明自己分数达到了第三方规定的条件,让第三方确信自己已经满足资格。
本期我们将详解 ONT ID 规范 v2.0。
摘 要
ONT ID 是本体基于 W3C 去中心化标识规范,使用区块链和密码学技术打造的去中心化身份框架,能快速标识和连接人、财、物、事,具有去中心化、自主管理、隐私保护、安全易用等特点。ONT ID 帮助用户充分保护其身份与数据的隐私和安全,赋予他们全面掌控自己的身份和数据的权利。
ONT ID 规范遵循 W3C DIDs 规范,并在此基础上进行定义扩展和功能扩展。
约定和术语
假定本文读者对 W3C DIDs 规范有一定程度的了解。
本文中使用的关键字:“必须 MUST”,“禁止 MUST NOT”,“要求 REQUIRED”,“应当SHALL”,“应当不 SHALL NOT”,“应该 SHOULD”,“不应该 SHOULD NOT”,“推荐 RECOMMENDED”,“可以 MAY”和“可选的 OPTIONAL”等遵循 IETF RFC 2119 规范的说明和解释。(https://www.ietf.org/rfc/rfc2119)
ONT ID:既代表本体使用区块链和密码学技术打造的去中心化身份框架,也代表本体去中心化身份框架中的去中心化身份标识。
SHA256: 密码学哈希算法,属于 SHA-2中的一种,由美国美国国家安全局于2001年发布。
Base58:区块链中常见的一种特殊编码方式,在保持易读性的同时可进行数据压缩和编码校验,在 Bitcoin 中首先采用。
ABNF:扩展的巴科斯范式,包含一组推导规则。
ONT ID 格式
0
1
ONT ID 语法
ONT ID 是一种遵循 IETF RFC 3986 规范的 URI,应该由每个实体自己生成。
ONT ID 的生成遵循 W3C DIDs 规范。
ONT ID 的生成方式采用 ABNF 方式描述如下:
ontid = "did:ont:" ontid-string
ontid-string = 1* idchar
idchar = 1-9 / A-H / J-N / P-Z / a-k / m
其中,"did:ont:"表示 ONT ID 是遵循 W3C DIDs 规范并注册在本体区块链上的去中心化标识;idchar包含了 Base58编码字符集的所有字符。
ontid-string 必须遵循如下方法生成:
1. 生成20字节随机数。
2. 附加1字节标签位。在前一步生成的随机数前附加1字节标签位,即 data = VER || h;
3. 计算4字节校验位。对 data 计算两次 SHA256,并取结果前4字节作为校验,即checksum = SHA256(SHA256(data))[0:4];
4. 编码。对上述结果进行 Base58编码,即 ontid-string = Base58(data || checksum)。
上述过程中,|| 表示连接前后两个字节串。VER的推荐取值是23。
一个 ONT ID 示例如下:
did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72
0
2
URL 语法
ONT ID URL 的语法遵循 W3C DIDs 规范中关于 DID URL 的规定。
下面是 ONT ID URL 支持的语法。
ontid-url = "did:ont:"ontid-specific-id
[ ";" param ] [ "/" path ]
[ "?" query ] [ "#" fragment ]
更多信息请参考 W3C DIDs 规范中关于 param、path、query 和 fragment 等的规定。
ONT ID 注册和注销
ONT ID 必须在本体区块链上注册之后才能生效,并禁止同一个 ONT ID 重复注册。
只有 ONT ID 的所有者或代理人才能将其注销。
某个 ONT ID 被注销后,其关联的一切数据包括密钥、代理人、属性及恢复人等都被删除,仅在本体区块链上保留 ONT ID 标识本身。
已注销的 ONT ID 无法继续使用,也不能再次注册启用。
ONT ID Document
每⼀个 ONT ID 都会对应到⼀个 ONT ID Document。
ONT ID Document是一种以 JSON-LD 形式对 ONT ID 相关信息进行序列化的方法,正如 W3C DIDs 规范中 DID Documents 的定义。
ONT ID Document 的结构如下:
{
"@context": ["https://www.w3.org/ns/did/v1", "https://ontid.ont.io/did/v2"],
"id": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72",
"publicKey": [{...}],
"authentication": [{...}],
"controller": [{...}],
"recovery": [{...}],
"service": [{...}],
"attribute": [{...}],
"created": [{...}],
"updated": [{...}],
"proof": [{...}]
}
0
1
Context
ONT ID Document 必须包含@context 属性。
@context 其值必须是多个 URI 的有序集合,其中第一个 URI 的值必须为https://www.w3.org/ns/did/v1,第二个URI的值必须为https://ontid.ont.io/did/v2。具体参见W3C DIDs规范中的说明。
示例如下:
{
"@context": ["https://www.w3.org/ns/did/v1","https://ontid.ont.io/did/v2"]
}
在实际应用过程中,W3C 和本体所提供的 context 里面的术语可能满足不了用户的需求,需要自己定义 context,此时可以使用 embedded context 进行扩展。
例如,需要为某个 ONT ID 新增一项附加属性,并为该属性的 type 值创建对应的 context,并将该 context 发布于所有使用者均可访问的 URI。在ONT ID Document 中将表示为:
{
"attribute": [
{
"@context": {
"some-type": "uri-of-the-context",
},
"id": "did:ont:some-ont-id#some-attribute",
"type": "some-type",
"value": "some-value"
},
]
}
0
2
标识关联
ONT ID Document 必须包含 id 属性,以指定该 Document 关联的 ONT ID 标识。
id 的值必须为一个有效的 ONT ID。
{ "id": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72"}
0
3
公钥列表
ONT ID Document 可以包含 publicKey 属性,以指定该 ONT ID 关联的一组公钥。
公私钥对可以帮助 ONT ID 完成自主管理,权限分级,身份认证等功能。同一个 ONT ID 可以关联多个不同的公私钥对;同样,同一个公私钥对也可以管理多个不同的 ONT ID。
在注册到本体区块链上时,ONT ID应该绑定所有者的公钥。所有者自己持有对应的私钥,私钥应当妥善保管,防止泄漏。
publicKey 属性关联的每一个公钥对象必须包含的字段为 id,type,controller,encoding。
每个关联的公钥拥有自己的标识,用字段 id 进行指定。每个绑定的公钥按照关联顺序从1开始依次编号。id 的形式为:
did:ont:some-ont-id#keys-{index}
其中{index}即为该公钥的编号。
绑定的公钥可以被废除。已废除的公钥不可被再次启用,但仍占有原编号。
字段 type 的值为该公钥所对应的密码学算法。本体支持多种国际标准密码算法,如 ECDSA签名、EdDSA 签名以及 SM2 签名等。
字段 controller 定义了该公钥所对应私钥的持有者,其值必须为一个有效的 ONT ID,表示该公钥被此 ONT ID 所控制。
encoding 的 key 为该公钥所对应的编码格式,value 为该公钥采用该格式编码的结果。本体所支持的编码格式有 publicKeyPem, publicKeyHex 以及publicKeyBase58等。
一个具体的 Publickey 属性示例如下:
{
"publicKey": [
{
"id": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72#keys-1",
"type": "EcdsaSecp256r1VerificationKey2019",
"controller": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72",
"publicKeyHex": "02a545599850544b4c0a222d594be5d59cf298f5a3fd90bff1c8caa095205901f2"
}
]
}
0
4
认证方式
ONT ID Document 采用可选的 authentication 属性指定认证方法。
ONT ID 允许用户添加认证属性,表示该 ONT ID 的持有者授权了一组认证方法来进行身份认证。
该部分继承自 W3C DIDs 规范。
一个具体示例如下:
{
...
"authentication": [
"did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72#keys-1",
{
"id": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72#keys-2",
"type": "EEcdsaSecp256r1VerificationKey2019",
"controller": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72",
"publicKeyBaseHex": "03a835599850544b4c0a222d594be5d59cf298f5a3fd90bff1c8caa064523745f3"
}
],
}
0
5
代为管理
在 ONT ID Document 中,采用可选的 controller 属性指定代理人。
一个 ONT ID 可以被其他 ONT ID 代理控制。如果需要指定代理人,必须在注册 ONT ID 到本体区块链上时指定。
代理人 ONT ID 拥有被代理 ONT ID 的注册、注销权限,并且可以修改 publicKey 和 authentication 属性。
特别地,当 ONT ID Document 中指定 controller 后,可以不指定 authentication。
代理人 ONT ID 必须是自主管理的。
代理人可以是一个 ONT ID,也可以是若干 ONT ID 组成的管理组。管理组能够设置复杂的门限控制逻辑,以满足不同的安全需求。例如,设置包含 n 个 ONT ID 的管理组,并设置该管理组的控制逻辑是最少 m(<=n)个ONT ID 共同签名才能进行操作。该设置以如下形式表示:
{
"threshold": "m",
"members": ["ID1", "ID2", ... , "IDn"]
}
进一步地,可以定义递归组合的控制逻辑,即组成员可以是 ONT ID,也可以是嵌套的管理组,如下所示:
{
"threshold": "m1",
"members": [
"ID1",
{
"threshold": "m2",
"members": ["ID2", ...]
},
...
]
}
下面是一个具体示例,表示或者是 did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72,或者是 did:ont:AXjJnU1TJViks4KUGQruiXwkKznwVpz7Z9和did:ont:AKwf6DvKFSBxhsmhjGCvJgaxHvCEQmpZZv 一起才能进行代为管理。
"controller:" [
{ "threshold": 1, "members": [ "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72",
{ "threshold": 2, "members": ["did:ont:AXjJnU1TJViks4KUGQruiXwkKznwVpz7Z9", "did:ont:AKwf6DvKFSBxhsmhjGCvJgaxHvCEQmpZZv"]
},
...
]
}
],
在操作被代理的 ONT ID 时,代理人 ONT ID 需提供符合控制逻辑的有效数字签名。
代理人可以为被代理 ONT ID 关联公钥,即设定 publickey,同时可以设定 authentication 属性,将其添加自主管理模式。自主管理的 ONT ID 无法添加代理控制人。
0
6
恢复机制
ONT ID Document 采用可选的 recovery 属性指定恢复人。
在 ONT ID 所有者意外丢失其相应密钥的情况下,恢复人可以帮助其重置密钥。恢复人能够为该 ONT ID 添加、废除 authentication 中的公钥,也可以更新恢复人设置。
只有自主管理的 ONT ID 才能设置其它 ONT ID 为其恢复人。
恢复人可以使用组管理的方式,规则同代理人的管理组。恢复人操作时需提供符合控制逻辑的有效数字签名。
下面是一个具体示例,表示ont:AXjJnU1TJViks4KUGQruiXwkKznwVpz7Z9或者did:ont:AKwf6DvKFSBxhsmhjGCvJgaxHvCEQmpZZv之一就进行恢复操作。
"recovery": [
{
"threshold": 1,
"members": ["did:ont:AXjJnU1TJViks4KUGQruiXwkKznwVpz7Z9", "did:ont:AKwf6DvKFSBxhsmhjGCvJgaxHvCEQmpZZv"]
}
],
0
7
服务信息
ONT ID Document 采用可选的 service 指定服务属性。
ONT ID 允许实体添加服务,用于指示该 ONT ID 相关的某项服务的信息,包括服务类型以及访问入口等。
该部分继承自 W3C DIDs 规范。
一个具体示例如下:
{
...
"service": [
{
"id": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72#some-service",
"type": "SomeServiceType",
"serviceEndpint": "Some URL"
}
]
}
0
8
附加属性
ONT ID Document 包含可选的 attribute 来关联 ONT ID 相关的一组属性。
ONT ID 的所有者或代理人可以为其添加、修改或删除附加属性。
每条属性必须包含 key,value,type 三个字段。其中:
"attribute"中最多可以包含100条属性。
属性的字段有长度限制。其中 key 最长为80字节,type 最长为64字节,value 最长为512K 字节。
如did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72包含一个属性:
key: "some-attribute"
type: "some-type"
value: "some-value"
那么,在其 ONT ID Document 中将表示为
{
"id": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72",
"attribute" : [
{
"key": "some-attribute",
"type": "some-type",
"value": "some-value"
},
]
}
附加属性的属性类型及其具体内容不在本规范的范畴内,由应用层自行定义。
一个具体属性示例如下:
{
"attribute": [
{
"key": "age",
"type": "number",
"value": 18
},
]
}
0
9
创建时间
ONT ID Document 应该包含 created 属性,以指定创建时间。
该部分继承自 W3C DIDs 规范。
一个具体示例如下:
{
"created": "2018-06-30T12:00:00Z"
}
1
0
更新时间
ONT ID Document 应该包含 updated 属性,以指定更新时间。
该部分继承自 W3C DIDs 规范。
一个具体示例如下:
{
"created": "2019-06-30T12:00:00Z"
}
1
1
完整性证明
ONT ID Document 可以包含 proof 属性,以证明该 ONT ID Document 的完整性。
该部分继承自 W3C DIDs 规范。
一个具体示例如下:
{
"proof": {
"type": "LinkedDataSignature2015",
"created": "2020-02-02T02:02:02Z",
"creator": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72#keys-1",
"signatureValue": "QNB13Y7Q9...1tzjn4w=="
}
}
目前,ONT ID 暂未实现完整性证明。
附录A
一个简单的ONT ID Document示例如下:
{
"@context": ["https://www.w3.org/ns/did/v1", "https://ontid.ont.io/did/v2"],
"id": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72",
"publicKey": [
{
"id": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72#keys-1",
"type": "EcdsaSecp256r1VerificationKey2019",
"controller": "did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72",
"publicKeyHex": "02a545599850544b4c0a222d594be5d59cf298f5a3fd90bff1c8caa095205901f2"
}
],
"authentication": [
"did:ont:AderzAExYf7yiuHicVLKmooY51i2Cdzg72#keys-1"
]
}
参考文献
[W3C-DID]
Decentralized Identifiers (DIDs) v1.0. W3C. Mar 2020. Working Draft. URL: https://www.w3.org/TR/did-core/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. JANUARY 2005. Standards Track. URL: https://tools.ietf.org/html/rfc3986
[BASE58]
The Base58 Encoding Scheme. Manu Sporny. IETF. December 2019. Internet-Draft. URL: https://tools.ietf.org/html/draft-msporny-base58