签名
数字签名方案用于在IC基础架构的各个部分中对消息进行身份验证。签名是域分隔的,这意味着每条消息都以一个唯一的字节字符串作为前缀,以达到这对于签名的目的。IC支持普通签名以及通过Web身份验证生成的签名。
通过 对域分隔符和消息的联系进行签名,来计算签名。
只能通过Web身份验证的的签名方案
使用SHA-256作为哈希函数的曲线P-256 ECDSA(也称为 secp256r1)以及Koblitz曲线上的 secp256k1
通过使用域分隔符和消息的连接作为Web验证断言中的Challenge来计算签名。
通过验证 challenge 字段是否包含域分隔符和消息的连接的base64url编码,并按照WebAuthn w3c建议中的规定进行signature 验证 authenticatorData · SHA-256(utf8(clientDataJSON)),来检查签名。
公用密钥被编码为DER封装的COSE密钥,如下所述。
签名是具有三个必填字段的Map的CBOR编码:
authenticator_data(blob):WebAuthn身份验证器数据。
client_data_json(text):JSON格式的WebAuthn客户端数据。
signature(blob):WebAuthn w3c建议中指定的签名,对于ECDSA签名来说这是DER编码。
DER包裹的COSE格式使用SubjectPublicKeyInfo类型,其他的公共密钥(例如,参见RFC 8410,第4节),以及OID 1.3.6.1.4.1.56387.1.1(iso.org.dod.internet.private)。 enterprise.dfinity.mechanisms.der-wrapped-cose)。该BIT STRING字段subjectPublicKey包含COSE编码。有关COSE编码的详细信息,请参阅WebAuthn w3c建议或RFC 8152。
提示:
A DER wrapping of a COSE key is shown below. It can be parsed via the command sed "s/#.*//" | xxd -r -p | openssl asn1parse -inform der.
30 5E # 长度为94字节的序列
30 0C # 长度为12个字节的序列
06 0A 2B 06 01 04 01 83 B8 43 01 01 # OID 1.3.6.1.4.1.56387.1.1
03 4E 00 # 长度为78的BIT STRING编码,
A501 0203 2620 0121 5820 7FFD 8363 2072 # 长度位于字节边界
FD1B FEAF 3FBA A431 46E0 EF95 C3F5 5E39 # 内容是验证过的COSE密钥
94A4 1BBF 2B51 74D7 71DA 2258 2032 497E # ECDSA在曲线P-256 上
ED0A 7F6F 0009 2876 5B83 1816 2CFD 80A9
4E52 5A6A 368C 2363 063D 04E6 ED
您还可以在在线ASN.1 JavaScript解码器中查看包装。
最后更新于