【问题标题】:In ethers.js, can recoverPublicKey be used for signature verification?ethers.js中是否可以使用recoverPublicKey进行签名验证?
【发布时间】:2022-11-28 22:36:28
【问题描述】:

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

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

在 ethers.js 中有一个具有 2 个输入、哈希和签名的函数:

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 签名的方式只有一个候选公钥 是可行的”

【问题讨论】:

    标签: blockchain ethereum ecdsa ethers.js secp256k1


    【解决方案1】:

    它返回签署消息的公钥

    ethers.utils.recoverPublicKey(摘要,签名)⇒字符串< 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 参数仍然完全 不含糊。

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

    【讨论】:

      猜你喜欢
      • 2020-01-22
      • 1970-01-01
      • 2013-07-01
      • 2017-02-20
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多