BSN-DID研究6--客户端生成DID的计算方法

这篇具有很好参考价值的文章主要介绍了BSN-DID研究6--客户端生成DID的计算方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DID研究的第一步就是为用户生成DID标识符, 在帮助文件 14.2 HTTP API · BSN中说明了计算方法,
在SDK代码中 com.reddate.did.sdk.util.DidUtils类提供了生成函数。
1 创建DID过程介绍
有两个方式创建DID, 一种是在服务端创建,然后返回给前端。 另一种是在前端直接创建。 BSN-DID服务支持这两种方法。
//使用服务端创建DID
DidDataWrapper didData = didClient.createDid(false);
String did = didData.getDid();
因为创建DID必须使用公私钥信息,为了安全起见,一般用户多选择在前端(本地)生成公私钥然后计算生成DID,而不会把公私钥发送到服务端去计算。开发者可按下述介绍在本地完成开发。
1)通过椭圆曲线算法Secp256k1生成两对公私钥信息;
2)保存私钥,指定主备公钥拼装Base DID Document,其内容如下示例:
{
   "@context": "https://w3id.org/did/v1",
   "authentication":
   {
      "type": "Secp256k1",
      "publicKey": "28986472722394106073871327423452879123214061743224210681401278929598807211140001274507530324221923795865447680836742348963337343510229880669968499735858"
   }
   "recovery":
   {
      "type": "Secp256k1",
      "publicKey": "9251971168042915941551574641987721503984542761641852064853964541181378832746959340151297908312616596971625573967556676367696067937171601766581709843378481"
   }
}
3)通过base58(ripemd160(sha256()))算法生成DID标识符,其格式如下示例:
did:bsn:3wxYHXwAm57grc9JUr2zrPHt9HC
4)拼装DID Document内容,如下示例:
{
   "did": "did:bsn:3wxYHXwAm57grc9JUr2zrPHt9HC",
   "version": 1,
   "created": "2021-05-20T16:02:20Z",
   "updated": "2021-05-20T16:02:20Z",
   "authentication":
   {
      "type": "Secp256k1",
      "publicKey": "28986472722394106073871327423452879123214061743224210681401278929598807211140001274507530324221923795865447680836742348963337343510229880669968499735858"
   }
   "recovery":
   {
      "type": "Secp256k1",
      "publicKey": "9251971168042915941551574641987721503984542761641852064853964541181378832746959340151297908312616596971625573967556676367696067937171601766581709843378481"
   }
}
5)使用主私钥对DID Document内容进行Secp256k1签名,最终形成带有签名属性的DID Document,如下示例:
{
   "did": "did:bsn:3wxYHXwAm57grc9JUr2zrPHt9HC",
   "version": 1,
   "created": "2021-05-20T16:02:20Z",
   "updated": "2021-05-20T16:02:20Z",
   "authentication":
   {
      "type": "Secp256k1",
      "publicKey": "28986472722394106073871327423452879123214061743224210681401278929598807211140001274507530324221923795865447680836742348963337343510229880669968499735858"
   }
   "recovery":
   {
      "type": "Secp256k1",
      "publicKey": "9251971168042915941551574641987721503984542761641852064853964541181378832746959340151297908312616596971625573967556676367696067937171601766581709843378481"
   }
   "proof":
   {
      "type": "Secp256k1",
      "creator": "did:bsn:3wxYHXwAm57grc9JUr2zrPHt9HC",
      "signatureValue": "zD5nt+P/Ga/CRG2hJU/SMRXy210CLdvATsxQdPxTEy9Mc9Y0OSFpE3Yu5k2+OjQKVOtu5of9VFbgO3Zljw/vQxs="
   }
}
2 DidUtils类中函数解析
// 根据主备公钥拼装Base DID Document
public static BaseDidDocument generateBaseDidDocument(KeyPair primaryKeyPair, KeyPair alternateKeyPair)
//从一个完整的DOC中解析出Base DID Document
public static BaseDidDocument generateBaseDidDocument(final DidDocument didDocument)
// 根据base DID Document计算DID
public static String generateDidIdentifierByBaseDidDocument(BaseDidDocument baseDidDocument)
//含义没搞清楚
public static String generateDidByDidIdentifier(String didIdentifier)
//指定主备公钥DID,生成DOC
public static DidDocument generateDidDocument(KeyPair primaryKeyPair, KeyPair alternateKeyPair, String did)
关键的是看这两个函数:
/**
* Generate base did document
*
* @param primaryKeyPair
* @param alternateKeyPair
*/
public static BaseDidDocument generateBaseDidDocument(KeyPair primaryKeyPair, KeyPair alternateKeyPair)
      throws Exception {
   BaseDidDocument baseDidDocument = new BaseDidDocument();
   baseDidDocument.setContext(CurrencyCode.W3C_FORMAT_ADDRESS);
   PublicKey primaryPublicKey = new PublicKey();
   primaryPublicKey.setType(ECDSAUtils.TYPE);
   primaryPublicKey.setPublicKey(primaryKeyPair.getPublicKey());
   baseDidDocument.setAuthentication(primaryPublicKey);
   PublicKey alternatePublicKey = new PublicKey();
   alternatePublicKey.setType(ECDSAUtils.TYPE);
   alternatePublicKey.setPublicKey(alternateKeyPair.getPublicKey());
   baseDidDocument.setRecovery(alternatePublicKey);
   return baseDidDocument;
}
/**
* Generate did identifier (encode the base did document after hashing twice)
*
* @param baseDidDocument
*/
public static String generateDidIdentifierByBaseDidDocument(BaseDidDocument baseDidDocument) throws Exception {
   String baseDidDocumentStr = JSONArray.toJSON(baseDidDocument).toString();
   // Coding base did with sha256
   byte[] firstHashBaseDidDocument = SHA256Utils.getSha256(baseDidDocumentStr);
   // On this basis, ripemd160 coding is carried out
   byte[] secondHashBaseDidDocument = RipeMDUtils.encodeRipeMd160(firstHashBaseDidDocument);
   // Finally, base28 coding is carried out
   String afterEncodeBaseDidDocument = Base58Utils.encode(secondHashBaseDidDocument);
   return afterEncodeBaseDidDocument;
}
上面代码说明了计算步骤,  第一步sha256计算hash,第二步RipeMd160计算hash,第3步Base58。
【特殊说明1】 Base58Utils类的算法有特殊性。 我测试了,同样的字符串,Base58Utils.encode的结果与一般的base58在线计算工具计算结果不一样。这一点什么原因就没有去分析内部代码啦。
【特殊说明2】 KeyPair生成公钥和私钥字符串也和一般的钱包工具生成结果不同。
一般的钱包工具生成的公私钥是16进制形式的字符串:
例如  私钥: 5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133
而KeyPair生成私钥是: 59892406425224321141687523581481793923894983609789633294227503636425859954495
这个字符串是10进制的大整数,因此具体应用时要注意区分转换。
【特殊说明3】baseDocument中填写的公钥字符串是10进制的大整数, 切记不要搞错了。
3 测试代码
我写了一段测试代码,验证目的:
(1)手工拼装的baseDocument字符串与自动生成的字符串相同
(2)计算出did
//先生成两组私钥:
主私钥
privateKey  59892406425224321141687523581481793923894983609789633294227503636425859954495
publicKey   1648062039648339302524063279508895632770137069244278134081956539023412707736391318756182919431261356264811228156011285063580540937190422178407117759695197
备私钥
privateKey  99212890707702586423403586560516123688816915830506844876534947464669890270173
publicKey   4066670788180339434818057706073753563728493176529383949647043421305103177112833274244990482553429820005190263150190403413261964491159960007274805620197902
//测试代码
public static void createMyDid(){
    DidDataWrapper didData = didClient.createDid(false);
    String did = didData.getDid();
    String  baseDoc =
            "{\"context\":\"https://w3id.org/did/v1\"," +
                    "\"recovery\":" +
                    "{" +
                    "\"publicKey\":\"4066670788180339434818057706073753563728493176529383949647043421305103177112833274244990482553429820005190263150190403413261964491159960007274805620197902\"," +
                    "\"type\":\"Secp256k1\"" +
                    "}," +
                    "\"authentication\":" +
                    "{" +
                    "\"publicKey\":\"1648062039648339302524063279508895632770137069244278134081956539023412707736391318756182919431261356264811228156011285063580540937190422178407117759695197\"," +
                    "\"type\":\"Secp256k1\"" +
                    "}" +
                    "}";
    System.out.println("baseDoc = "+baseDoc);
    String sha = SHA256Utils.getSha256String(baseDoc);
    System.out.println("sha = "+ sha);
    BaseDidDocument base = new BaseDidDocument();
    base.setContext("https://w3id.org/did/v1");
    PublicKey authentication = new PublicKey();
    authentication.setPublicKey("1648062039648339302524063279508895632770137069244278134081956539023412707736391318756182919431261356264811228156011285063580540937190422178407117759695197");
    authentication.setType("Secp256k1");
    base.setAuthentication(authentication);
    PublicKey recovery = new PublicKey();
    recovery.setPublicKey("4066670788180339434818057706073753563728493176529383949647043421305103177112833274244990482553429820005190263150190403413261964491159960007274805620197902");
    recovery.setType("Secp256k1");
    base.setRecovery(recovery);
    String baseDidDocumentStr = JSONArray.toJSON(base).toString();
    System.out.println("baseDidDocumentStr = "+ baseDidDocumentStr);
    sha = SHA256Utils.getSha256String(baseDidDocumentStr);
    System.out.println("sha = "+ sha);
    try {
        did = DidUtils.generateDidIdentifierByBaseDidDocument(base);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    System.out.println("did = "+ did);
}
运行结果:
baseDoc = {"context":"https://w3id.org/did/v1","recovery":{"publicKey":"4066670788180339434818057706073753563728493176529383949647043421305103177112833274244990482553429820005190263150190403413261964491159960007274805620197902","type":"Secp256k1"},"authentication":{"publicKey":"1648062039648339302524063279508895632770137069244278134081956539023412707736391318756182919431261356264811228156011285063580540937190422178407117759695197","type":"Secp256k1"}}
sha = f1fbda792c9d7bcc09b0e8c9024ae68af09880e421f9a21313f6fd7e76c893a0
baseDidDocumentStr = {"context":"https://w3id.org/did/v1","recovery":{"publicKey":"4066670788180339434818057706073753563728493176529383949647043421305103177112833274244990482553429820005190263150190403413261964491159960007274805620197902","type":"Secp256k1"},"authentication":{"publicKey":"1648062039648339302524063279508895632770137069244278134081956539023412707736391318756182919431261356264811228156011285063580540937190422178407117759695197","type":"Secp256k1"}}
sha = f1fbda792c9d7bcc09b0e8c9024ae68af09880e421f9a21313f6fd7e76c893a0
did = 4SdogXgSRXdetxH28SdJM5dydtKd
大功告成,最后生成了DID: 4SdogXgSRXdetxH28SdJM5dydtKd

文章来源地址https://www.toymoban.com/news/detail-576287.html

到了这里,关于BSN-DID研究6--客户端生成DID的计算方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个支持Sora模型文本生成视频的Web客户端

    大家好,我是 Java陈序员 。 最近 Open AI 又火了一把,其新推出的文本生成视频模型 —— Sora,引起了巨大的关注。 Sora 目前仅仅只是发布预告视频,还未开放出具体的 API. 今天,给大家推荐一个最近十分火热的开源项目,一个支持使用 Sora 模型将文本生成视频的 Web 客户端。

    2024年03月09日
    浏览(56)
  • 基于ZXing.NET实现的二维码生成和识别客户端

    ZXing.Net 的一个可移植软件包,是一个开源的、多格式的1D/2D条形码图像处理库,最初是用Java实现的。已经过大量优化和改进,它已经被手动移植。它与.Net 2.0、.Net 3.5、.Net 4.x、.Net 5.x、.Net 6.x、.Net 7.x、Windows RT类库和组件、UWP、.Net Standard 1.x和2.0x、.Net Core App 3.x、Silverlight 4、

    2024年02月08日
    浏览(46)
  • 利用idea生成webservice客户端--详解步骤--(wsdl文件的使用)

    目录 一、idea安装webservice 1.点击左上file,选中settings​编辑 2.下载Web Service 3.给此项目添加webservice 4.添加webservice的依赖 二、利用idea根据wsdl文件自动生成webService客户端代码(然后比照着生成的测试类进行接口或方法的调用) 1.打开tools - WebServices - Generate Java Code From Wsdl,按照图中

    2024年02月08日
    浏览(56)
  • 【全】OpenSSL创建生成CA证书、服务器、客户端证书及密钥说明

    本文章对应的文档: 使用OpenSSL创建生成CA证书服务器客户端证书及密钥资源-CSDN文库 https://download.csdn.net/download/weixin_41885845/88746920 服务器需要CA证书、server证书、server私钥,客户端需要CA证。 服务器需要CA证书、server证书、server私钥,客户端需要CA证书,client证书、client私钥。

    2024年01月19日
    浏览(51)
  • 【计算机网络】 基于TCP的简单通讯(客户端)

    加载库 创建套接字 连接服务端 连接服务端我们使用的是connect()函数,分别为连接使用的socket,连接的地址信息,连接的地址信息长度。返回值为int类型,如果没有错误返回0,否则返回SOCKET_ERROR。 收发数据 关闭套接字、卸载库 这样我们的TCP协议简单通讯就写好了。 先运行

    2024年02月07日
    浏览(59)
  • 计算机网络 简单FTP客户端软件的实现

    文件传送协议FTP(File Transfer Protocol)是TCP/IP体系的一个重要协议,它采用Internet标准文件传输协议FTP的用户界面,向用户提供了一组用来管理计算机之间文件传输的应用程序。FTP是基于客户—服务器(C/S)模型而设计的,在客户端和FTP建立两个TCP连接。 FTP 的独特的优势同时

    2024年02月12日
    浏览(53)
  • mac下用git客户端生成ssh秘钥并配置到souretree进行使用

    一、使用git 生成 ssh 密钥 1、Mac 安装 git 客户端 打开终端,执行命令: 2、执行命令 3、检查是不是已经存在密钥 4、能进去说明已经存在,就删掉文件夹,重新创建 5、生成 SSH 密钥,执行以下命令,并连续 3次 Enter 键即可。 会在.ssh目录下生成 id_rsa 、 id_rsa.pub 两个文件私钥

    2024年02月16日
    浏览(86)
  • openssl自签名CA根证书、服务端和客户端证书生成并模拟单向/双向证书验证

    1.1 生成CA证书私钥 openssl genrsa -aes256 -out ca.key 2048 1.2 取消密钥的密码保护 openssl rsa -in ca.key -out ca.key 1.3 生成根证书签发申请文件(csr文件) openssl req -new -sha256 -key ca.key -out ca.csr -subj \\\"/C=CN/ST=FJ/L=XM/O=NONE/OU=NONE/CN=localhost/emailAddress=test@test.com\\\" 上述参数含义 req----执行证书签发命令

    2024年04月25日
    浏览(42)
  • 51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息

    什么是背压: 这个是Reactive(反应) 的概念,当订阅者的消费能力,远低于发布者时,订阅者(也就是消费者)有通知取消或终止发布者生产数据的机制,这种机制可以称作为“背压”。 说白了就是:当消费者消费积压的时候,反向告诉推送生产者,我不需要你生产了,你

    2024年02月09日
    浏览(51)
  • 在Linux上使用openssl生成CA认证文件并为服务器和客户端颁发CA签名证书

    本文基于Linux上CentOS 7版本配合openssl与mod_ssl(需要使用yum下载)进行配置演示 目录 一.生成认证主要流程 1.虚拟出一个CA认证机构,为其生成公私钥以及自签证书 2.生成服务器方私钥,发送包含服务器方公私钥的申请文件给CA机构请求签发证书 3.生成客户端方私钥,发送包含服务

    2024年02月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包