ecdsa - 使用谷歌云 key 管理服务签署以太坊交易

标签 ecdsa go-ethereum google-cloud-kms sha-3 keccak

我一直在为以太坊交易管理器编写签名者服务,我需要使用 Google KMS Golang APIs 签署以太坊交易。 .我将在下面尝试总结我面临的问题。

Ethereum 在 R 中需要紧凑的 RLP 编码的 65 字节 ECDSA 签名 ||年代|| V格式。另一方面,Google KMS 的 ECDSA 签名具有额外的 header 组件(R 长度、S 长度等)以及可变长度的 R 和 S 组件。这使得这些签名与以太坊交易签名不兼容。

解决此问题的一种方法是解析从 Google KMS 获得的 ecdsa 签名中的 R 和 S 字节,计算并将 V 字节添加到末尾,然后使用此签名获得签名的以太坊交易。像这样:

var parsedSig struct{ R, S *big.Int }
_, err = asn1.Unmarshal(body, &parsedSig)
if err != nil {
    logger.WithError(err).Error("failed to parse signature bytes")
    return err
}

然而,由于以下一种或多种原因,这可能会失败:

  • 通过解析 R 和 S 组件并添加 V 组件来创建 65 字节长度的紧凑型 ECDSA 签名可能像听起来一样不可信。对于标准 ECDSA 签名,上述 R 和 S 组件并不总是 32 字节长度,这意味着通过连接组件创建的 ECDSA 签名可能并不总是 64 字节。
  • 以太坊中当前签署的交易是在 RLP 编码交易后从 Keccak-256 摘要哈希创建的,如下所示:
    // from go-ethereum
    func rlpHash(x interface{}) (h common.Hash) {
        hw := sha3.NewLegacyKeccak256()
        rlp.Encode(hw, x)
        hw.Sum(h[:0])
        return h
    }
    
    Asymmetric ECDSA Google KMS 中的 key 签名不支持 Keccak-256 SHA3 消息摘要。将 SHA-256 摘要用于以太坊交易有效吗? IMO 这会失败,因为所有交易签名验证都发生在 RLP 编码的 Keccak 哈希上。
  • 在检查了 secp256k1 implementation 之后,我不太确定如何计算 ECDSA 签名的 V 分量。 secp256k1_ecdsa_sign_recoverable() 函数。

我该如何着手解决上述这些问题,以便能够使用 Google KMS 的非对称椭圆曲线签名算法创建可验证的签名以太坊交易?

最佳答案

您可以使用 GCP 签署以太坊交易(使用 secp256k1)。不过,它需要对“v”值进行一些计算。这是一个包含完整过程的库:

https://pkg.go.dev/github.com/pascaldekloe/etherkeyms@v0.1.0/google

Would using a SHA-256 digest for ethereum transactions work?

我也有同样的疑惑。据我所知,曲线计算并不关心哈希算法。也许谷歌只使用尺寸分类?无论哪种方式,SHA-256 在这里都可以正常工作。

https://github.com/pascaldekloe/etherkeyms/blob/096d712031548e601994c859637009eb53a08e34/google/google.go#L101

关于ecdsa - 使用谷歌云 key 管理服务签署以太坊交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57421392/

相关文章:

c - OpenSSL ECDSA 签名有效性

go - 如何在 GoLang 中分离编码的 ecdsa 公钥和私钥

java - Nodejs 加密 ECDH 公钥十六进制为 X.509

ethereum - Ropsten与web3.js的网络连接(版本1.0.0-beta.34)

ethereum - 如何使用geth获取以太坊区 block 的数据

security - 二进制授权-部署失败-由Attestor拒绝。证明者无法证明GKE中的图像

java - 在 Java/Kotlin 中生成 ed25519 key

rpc - 去以太坊 |如何连接到在本地运行的公共(public) Ropsten(testnet)

java - 从 AWS Lambda 调用 Google Cloud KMS

node.js - 使用 Google Cloud KMS 进行 Firebase 实时数据库加密的最佳实践