0

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

以及如何使用私钥签署挑战,以便可以使用公钥对其进行验证

谢谢

4

2 回答 2

0
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 编码将密钥导出到客户端

于 2022-01-07T15:52:14.857 回答
-1

Web 身份验证协议(以及在其之上构建的 FIDO2 CTAP2 协议)具有针对代表用户身份验证的设备的质询/响应协议,称为Authenticator

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

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

基础身份验证质询没有来自依赖方的加密签名。相反,加密签名由身份验证器生成 - 身份验证器在注册时生成一个新的密钥对,然后从该密钥提供签名以证明拥有,从而证明身份验证。由于fido2没有验证器支持,它不需要生成密钥对(在潜在的测试代码之外)。

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

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

于 2022-01-05T07:53:33.280 回答