菜单

密码学与安全

相关源文件

本文档涵盖了 go-ethereum 客户端中使用的加密功能和安全机制。这包括用于交易身份验证的 ECDSA 签名操作、用于 EIP-4844 blob 交易的 KZG 加密,以及用于资源管理的特定平台安全功能。

有关存储安全和 Merkle Patricia Trie 的信息,请参阅 Merkle Patricia Trie。有关共识层安全机制的信息,请参阅 Engine API

概述

geth 中的加密与安全系统围绕几个核心组件构建,这些组件提供不同类型的加密操作和安全保证。

来源: crypto/signature_cgo.go1-87 crypto/signature_nocgo.go1-194 crypto/kzg4844/kzg4844.go1-180

ECDSA 签名系统

ECDSA 签名系统使用 secp256k1 椭圆曲线为以太坊交易提供加密身份验证。实现根据构建配置自动选择原生 C 库和纯 Go 实现。

核心功能

签名系统公开了几项处理完整签名生命周期的关键函数:

功能目的输入/输出
签名创建 ECDSA 签名(hash, privateKey) → [R ǁ S ǁ V]
Ecrecover从签名中恢复公钥(hash, signature) → publicKey
VerifySignature在不恢复的情况下验证签名(pubkey, hash, [R ǁ S]) → bool
SigToPub将签名转换为公钥(hash, signature) → *ecdsa.PublicKey
CompressPubkey将公钥压缩为 33 字节*ecdsa.PublicKey → []byte
DecompressPubkey解压 33 字节公钥[]byte → *ecdsa.PublicKey

实现架构

来源: crypto/signature_cgo.go17-18 crypto/signature_nocgo.go17-18 crypto/signature_cgo.go53-59 crypto/signature_nocgo.go78-96

签名格式与安全

签名系统使用特定的格式,其中签名被编码为 [R || S ǁ V],在末尾带有恢复 ID (V)。实现包含了重要的安全措施:

  • 可塑性签名拒绝:拒绝 s > N/2 的签名,以防止交易可塑性。
  • 严格的输入验证:哈希输入必须正好是 32 字节。
  • 曲线验证:仅支持 secp256k1 曲线。
  • 恢复 ID 处理:以太坊格式(末尾 V)和比特币格式(开头 V)之间的转换。

来源: crypto/signature_nocgo.go78-96 crypto/signature_cgo.go53-59 crypto/signature_test.go78-86

KZG4844 加密

KZG4844 系统实现了 EIP-4844 blob 交易所需的加密操作,包括多项式承诺和证明。与签名系统一样,它也提供了 C 和 Go 实现之间的自动选择。

数据类型和操作

来源: crypto/kzg4844/kzg4844.go39-82 crypto/kzg4844/kzg4844.go107-150

实现选择

KZG 系统使用运行时开关在 C 和 Go 实现之间进行切换,由 useCKZG 原子布尔值控制。这允许用户在性能优化的 C 库和更具可移植性的 Go 实现之间进行选择。

来源: crypto/kzg4844/kzg4844.go84-105 crypto/kzg4844/kzg4844_ckzg_cgo.go31-67 crypto/kzg4844/kzg4844_gokzg.go26-46

特定平台实现

KZG 系统使用构建标签来确定哪些实现可用。

  • CKZG (C 实现):当 `ckzg && !nacl && !js && !wasip1 && cgo && !gofuzz` 时可用。
  • GoKZG (Go 实现):始终可用作为备用。
  • 无操作实现:适用于不受支持的平台,这些平台在使用时会引发恐慌。

来源: crypto/kzg4844/kzg4844_ckzg_cgo.go17 crypto/kzg4844/kzg4844_ckzg_nocgo.go17

特定平台安全功能

代码库包含多种特定平台安全和资源管理功能,可适应不同的操作系统和构建环境。

资源限制与监控

来源: metrics/cpu_enabled.go17-18 metrics/cpu_disabled.go17-18 metrics/cputime_unix.go17-18 cmd/utils/diskusage.go17-18 common/fdlimit/fdlimit_bsd.go17-18

构建标签策略

代码库使用全面的构建标签策略来选择适当的实现。

组件构建标签目的
CPU 指标!ios && !js && !wasip1 && !tinygo在具有系统调用的平台上启用
CPU 时间!windows && !js && !wasip1在类 Unix 系统上使用 rusage
磁盘使用情况!windows && !openbsd && !wasip1标准 Unix 磁盘统计信息
FD 限制freebsd || dragonflyBSD 特定的 int64 rlimit 字段
ECDSA!nacl && !js && !wasip1 && cgo基于 CGO 的 secp256k1
KZGckzg && !nacl && !js && !wasip1 && cgo基于 C 的 KZG 实现

此策略可确保根据目标平台的性能,在构建时选择最合适的实现。

来源: metrics/cpu_enabled.go17-18 crypto/signature_cgo.go17-18 crypto/kzg4844/kzg4844_ckzg_cgo.go17

实现安全注意事项

内存安全与资源管理

加密实现包含一些重要的安全考量

  1. 密钥材料清零:在 CGO 实现中使用后,私钥会被清零
  2. 输入验证:严格验证哈希长度、签名长度和曲线参数
  3. 可塑性预防:拒绝高 S 值签名以防止交易可塑性
  4. 初始化安全:在加密上下文中使用 sync.Once 进行一次性初始化
  5. 平台回退:在高级功能不可用时进行优雅降级

错误处理与验证

来源: crypto/signature_nocgo.go78-81 crypto/signature_cgo.go54-55 crypto/signature_test.go78-86 crypto/kzg4844/kzg4844.go84-105