繁体   English   中英

ethers.js中是否可以使用recoverPublicKey进行签名校验?

[英]In ethers.js, can recoverPublicKey be used for signature verification?

在比特币 wiki 中,他们描述了用于使用 ECDSA 和 Secp256k1 验证签名的算法。 该算法有 3 个输入:签名、消息 hash 和 publicKey。

https://en.bitcoin.it/wiki/Elliptic_Curve_Digital_Signature_Algorithm

在 ethers.js 中有 aa function 和 2 个输入,hash 和签名:

ethers.utils.recoverPublicKey( digest , signature )

https://docs.ethers.io/v5/api/utils/signing-key/

我很想认为验证签名是否正确只是将 publicKey 与 recoverPublicKey 的结果进行比较:

publicKey === ethers.utils.recoverPublicKey( digest , signature )

但是,我犹豫要不要做出这样的断言,因为根据这个问题: https://bitcoin.stackexchange.com/questions/107954/does-every-private-key-have-two-public-keys-ie-y- and-negated-y-secp256k1私钥可以有多个关联的公钥,因此我担心对于相同的输入 recoverPublicKey 可能会返回几个不同的有效答案,从而使相等性无效。

此外,在高效加密标准 1 (SEC 1) ( https://www.secg.org/sec1-v2.pdf ) 的第 4.1.6 节中。 公钥恢复操作,它说:

“潜在地,可以从签名中恢复多个候选公钥。以很小的成本,签名者可以以只有一个候选公钥可行的方式生成 ECDSA 签名”

它返回签署消息的公钥

ethers.utils.recoverPublicKey( digest, signature ) ⇒ string< DataHexString< 65 >> 返回私钥的未压缩公钥(即第一个字节将为 0x04),该私钥用于签署提供签名的摘要。

如果您想验证公钥,则必须从元掩码中获取公钥以查看它们是否相等。 metamask曾经有eth_getEncryptionPublicKey方法来获取公钥,但它已被弃用。 我不确定现在使用什么方法:

  window.ethereum.request({
    method: 'eth_getEncryptionPublicKey',
    params: [accounts],
    });

醚有这个方法

 ethers.utils.verifyMessage( message , signature ) ⇒ string< Address >

返回生成签名的签名消息的地址。 签名可能有一个非规范的 v(即不需要是 27 或 28),在这种情况下,它将被规范化以计算recoveryParam ,然后用于计算地址; 这允许使用 v 来编码附加数据的系统(例如 EIP-155),因为 v 参数仍然是完全明确的。

我认为这种方法会更容易使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM