可验证凭证创建与验证

最近更新时间:2024-01-15 10:47:51

我的收藏

操作场景

在 TDID 分布式身份标识创建好后,权威机构通常通过已定义好的凭证模板颁发可验证凭证给凭证持有人,凭证持有人获取凭证后,在特定场景出示给验证者验证,凭证的相关操作包括:

操作说明

凭证模板管理

1. 在创建可验证凭证前,需要在控制台定义凭证模板的字段名称,模板规范了凭证中声明的字段,支持必选和可选字段,请根据业务场景定义适合的凭证模板。
2. 凭证模板支持禁用和启用操作,凭证模板被禁用后,凭证创建和验证会失败。
3. 凭证模板数据会上链存储在合约中,在创建凭证时,需要携带凭证模板 id,DID 平台会验证凭证模板的有效性,以及凭证字段是否与模板一致。

凭证创建和签名

1. 凭证通过 DID 平台的 API SDK 调用来创建,当私钥托管在 DID 平台,凭证直接在 DID 平台完成签名并创建返回凭证内容。
2. 当用户自持私钥时,可通过 DID 平台的 API SDK 调用返回未签名的凭证内容,由业务方从返回的凭证内容中取出摘要签名并替换掉凭证内容的签名字段值生成签名后的凭证。签名方法如下:
取出 API SDK 返回的凭证 json 中的 signatureValue 字段值 ,并做 base64 解码得到字节流 A。
对字符串 A 做国密 SM3 的摘要运算得到字节流 B。
对字节流 B 做 Hex 字符串编码得到字符串 C。
对字符串 C 的字节流做国密 SM2 签名字节流,并做 base64 编码得到字符串 D。
把 D 替换掉凭证 json 文本中的 signatureValue 字段值,生成已签名凭证。
java 伪代码示例:
byte[] A = java.util.Base64.getDecoder().decode(signatureValue)
byte[] B = new SM3Digest().hash(A);
String C = new String(Hex.encode(B));
byte[] signature = SM2.sign(C)
String signatureValue = java.util.Base64.getEncoder().encode(signature)

凭证验签

通过调用 DID 平台的 API SDK 的 VerifyCredentials 接口 来验证凭证的有效性,DID 平台获取凭证 json 内容中的凭证颁发方的 DID 标识并从链上获取其对应的公钥,使用该公钥对凭证的签名值进行验签。