我正在尝试实现 webauthn,但无法让签名验证正常工作。根据https://w3c.github.io/webauthn/#verifying-assertion我必须基本上验证以下数据的签名:
身份验证数据 || sha256(clientDataJSON)
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 验证它。这个签名的计算只是为了显示我在做什么——我当然不会相信服务器端的那个值。