1 DID
1.1 通用形式
标识符(VaultysId)由以下组成:
- 一个类型(1字节)
type
- 一个版本(1字节)
v
=0
- 一个证明(32字节)
p
- 一个签名公钥(可变)
s
- 一个加密公钥(可变)
e
1.1.1 序列化和反序列化
我们使用 messagepack
序列化。MessagePack 是一种类似于 JSON 的压缩器 https://msgpack.org/。选择这种设计的考虑如下:
- 我们不需要数据的存储空间非常小,因为存储大小不是问题
- 我们希望对第三方实现足够友好
- 这种序列化也用于 saltpack https://saltpack.org/,以便流式传输加密数据,并且可以用于加密部分。
注意:实现可能会有所不同,即如果使用另一种实现,则 VaultysId 可能会有所不同。还可以更改 messagePack 数据的某些部分,但仍然可以反序列化为相同的数据。(请参阅测试)
VaultysId = type | messagepack({v, p, s, e})
消息包的参数顺序很重要,因为它可能会 影响指纹的定义。
指纹可能取决于消息包实现。
指纹绝对不应该在协议级别使用。它可以用作对 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...0000s
= 由 Fido2 Attestation 提取的 COSE 公钥e
由 Fido2 设备生成 而不是 由其处理
由于 Fido2 设备没有备份建议的备份,因此使用以下密钥以便将 VaultysId 移植到各种设备上:
secret = type | messagepack({v, fid, t, s, se})
其中:
fid
是创建时由 attestation 给出的 Fido2 idt
是用于连接设备的 webauthn 传输(以防止在 webauthn 接口中处理复杂的 UI)。t = hybrid | ble | nfc | usb
术语hybrid
、ble
、nfc
、usb
是在 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 用于