gpt4 book ai didi

javascript - 在 webauthn 中计算用于签名验证的哈希

转载 作者:行者123 更新时间:2023-12-05 06:28:09 33 4
gpt4 key购买 nike

我正在尝试实现 webauthn,但无法使签名验证正常工作。根据https://w3c.github.io/webauthn/#verifying-assertion我必须基本上验证以下数据的签名:

授权数据|| sha256(客户端数据JSON)

authData 和 sha256 散列应该是“二进制连接的”。我不知道他们的意思,确切地说,但我认为他们只是想将字节彼此相邻,虽然不知道什么是“二进制”。

因此,给定一个名为 attestation 的 PublicKeyCredential,我可以生成用于生成签名的数据,如下所示:

var auth_data = new Uint8Array(attestation.response.authenticatorData);
var data_hash = sha256(new Uint8Array(attestation.response.clientDataJSON));
var signed = new Uint8Array(auth_data.length + data_hash.length);

signed.set(auth_data);
signed.set(data_hash, auth_data.length);

我当然尝试过直接验证这个“签名”值,我也尝试过散列它。他们都没有验证。我在计算签名数据时做错了什么?

我在服务器端(C++ 中)有等效的代码,我在其中构建相同的值,然后使用 OpenSSL 对其进行验证。这个带符号的计算只是为了展示我在做什么 - 我当然不会相信服务器端的值。

最佳答案

签名格式authenticatorData || clientDataJSONHash 仅用于assertion(身份验证)签名,navigator.credentials.create() 返回一个attestation(注册)签名.您的代码应该用于验证 navigator.credentials.get() 响应,而不是 .create() 响应。

证明签名通常不会使用新创建的 credential private key 进行签名, 但带有身份验证器的 attestation private key .此外,签名数据的格式和验证程序由 attestation statement format 决定。 .这样做的目的是现有硬件可能只支持以特定方式生成签名,因此这些不同的证明格式允许这些硬件实现与 WebAuthn 一起工作,而无需硬件或固件升级。

验证证明签名总是需要解析 attestation statement 中的 CBOR和 authenticator data .这是因为签名是在CBOR编码的证明对象中传递的,传递的是凭证公钥in the authenticator data .虽然credential.response.getPublicKey()也返回相同的凭据公钥,它的这种表示没有签名。身份验证器数据被签名覆盖,因此凭证公钥必须是 parsed from the authenticator data使签名有意义。

如果您的应用程序不关心证明,您可以简单地不验证证明签名,而只验证 future 的断言签名。您仍然可以存储 attestation object以防您改变主意并希望将来关心证明。

关于javascript - 在 webauthn 中计算用于签名验证的哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54631177/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com