Aller au contenu principal

1 DID

1.1 通用形式

标识符(VaultysId)由以下组成:

  • 一个类型(1字节)type
  • 一个版本(1字节)v = 0
  • 一个证明(32字节)p
  • 一个签名公钥(可变)s
  • 一个加密公钥(可变)e

1.1.1 序列化和反序列化

我们使用 messagepack 序列化。MessagePack 是一种类似于 JSON 的压缩器 https://msgpack.org/。选择这种设计的考虑如下:

注意:实现可能会有所不同,即如果使用另一种实现,则 VaultysId 可能会有所不同。还可以更改 messagePack 数据的某些部分,但仍然可以反序列化为相同的数据。(请参阅测试)

VaultysId = type | messagepack({v, p, s, e})

attention

 消息包的参数顺序很重要,因为它可能会影响指纹的定义。

attention

指纹可能取决于消息包实现。

attention

指纹绝对不应该在协议级别使用。它可以用作对 VaultysId 列表进行索引的一种方式。不建议将指纹用作密钥交换验证(例如在 PGP 密钥交换中)。

1.1.2 指纹

指纹 = sha256(VaultysId) 的前40个字符

1.1.3 DiD

去中心化标识 = did:vaultys:<fingerprint>

1.1.4 密钥

为了备份 VaultysId 密钥,使用以下序列化 secret = type | messagepack({v, p, ss, se}) 其中:

  • ss 是公钥 s 的密钥
  • se 是公钥 e 的密钥

2.2 定义的类型

在当前协议状态中有3种定义的类型 type = 0:用于标识设备(服务器、计算机等) type = 1:用于标识个人。 type = 3:通过 Fido2 设备标识个人。

1.2.1 类型 3 序列化

由于 Fido2 没有证明概念,因此设置以下参数:

  • p = 0000...0000
  • s = 由 Fido2 Attestation 提取的 COSE 公钥
  • e 由 Fido2 设备生成 而不是 由其处理

由于 Fido2 设备没有备份建议的备份,因此使用以下密钥以便将 VaultysId 移植到各种设备上: secret = type | messagepack({v, fid, t, s, se}) 其中:

  • fid 是创建时由 attestation 给出的 Fido2 id
  • t 是用于连接设备的 webauthn 传输(以防止在 webauthn 接口中处理复杂的 UI)。 t = hybrid | ble | nfc | usb 术语 hybridblenfcusb 是在 Fido2 规范中找到的。 例如,t = 0011 表示 Fido2 设备只能使用 NFC 和 USB 传输进行访问

有关信息,我们的 attestation 创建实现使用以下参数:

navigator.credentials.create({
publicKey: {
challenge: randomBytes(32),
rp: {
name: "Vaultys ID",
},
user: {
id: Buffer.from("Vaultys ID", "utf-8"),
name: "Vaultys ID",
displayName: "Vaultys Wallet ID",
},
attestation: safari ? "none" : "direct",
authenticatorSelection: {
authenticatorAttachment: "cross-platform",
userVerification: "preferred"
},
pubKeyCredParams: [
{
"type": "public-key",
"alg": -7, // P256
},
{
"type": "public-key",
"alg": -8, // Ed25519/EdDSA
},
]
}
})

1.2.2 类型 3 签名

Webauthn 签名有其自己的有效载荷,我们使用 attestation 用于