如何生成 fido2.cose 导入 ES256 fido2 密钥对

how to generate fido2.cose import ES256 fido2 key pairs

我正在使用 fido2 python 包,我想知道如何生成 EC 对 (ES256) public 和私钥。

以及如何使用私钥签署挑战 所以可以用 public 键

来验证它

谢谢

Web 身份验证协议(以及建立在它之上的 FIDO2 CTAP2 协议)有一个 challenge/response 协议针对代表用户身份验证的设备,称为 Authenticator

fido2 python 库旨在用于与身份验证器对话,而不是模拟身份验证器本身。与身份验证者对话的角色称为依赖方。

系统通常将依赖方角色进一步划分为客户端和服务器角色 - 客户端与身份验证器通信,但实际上它是中继与服务器之间的通信。在 WebAuthn 中,浏览器、站点 javascript 它是 运行,以及任何底层平台支持都被视为客户端的一部分。如果您有本机代码通过 USB 或 NFC 与身份验证器通信(在允许您的平台上),则该本机代码被视为身份验证器。

基础身份验证质询没有来自依赖方的加密签名。相反,加密签名是由认证者创建的——认证者在注册时生成一对新的密钥,然后提供来自该密钥的签名以证明拥有并因此证明认证。由于 fido2 不支持身份验证器,因此无需生成密钥对(在潜在测试代码之外)。

请注意,这触及了基础 WebAuthn 和 FIDO2 平台信任模型的本质——用户必须信任客户端。出于这个原因,一些平台已经锁定了对身份验证器硬件(USB、NFC 和 BLE 与硬件的通信)的低级访问,而是提供系统 API。本机应用程序必须具有作为 WebAuthn 客户端代表特定 Web 来源运行的权利,并且浏览器必须从平台请求特殊权利才能代表所有 Web 域。

这不会影响使用 fido2 实现服务器功能,但如果您打算使用它来实现任何客户端功能,我建议您仔细检查平台支持。

from cryptography.hazmat.primitives.asymmetric import ec
from fido2 import cbor
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()

并用于导出密钥:

private_key_pem = private_key.private_bytes(encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.BestAvailableEncryption(b'password'))
x, y = int2bytes(public_key.public_numbers().x), int2bytes(public_key.public_numbers().y)
public_key = cbor.encode({1: 2, 3: -7, -1: 1, -2: x, -3: y})

现在可以通过 base64 / cbor 编码将密钥导出到客户端