什么是 ECDSA?
ECDSA 是 Elliptic Curve Digital Signature Algorithm(椭圆曲线数字签名算法)的缩写。它是一种使用椭圆曲线数学创建和验证数字签名的公钥密码算法。加密货币钱包使用 ECDSA,证明交易已获某个私钥持有者授权。私钥用于创建签名,相应的公钥则供区块链节点验证签名。验证过程中无需公开私钥。有效的 ECDSA 签名还可以证明,自签名创建以来,签名的交易数据未被更改。现行NIST 数字签名标准将 ECDSA 列为受支持联邦密码应用中的一种获批数字签名技术。
ECDSA 是一种算法,而非区块链、钱包、加密货币、加密方法或椭圆曲线。完整实现还需要选择曲线、域参数、哈希函数、私钥生成方法、签名编码和消息格式规则。加密货币为什么使用 ECDSA
去中心化加密货币网络必须在不依赖单一中心化账户数据库的情况下验证支出授权。ECDSA 允许用户通过秘密私钥控制账户或可支出输出。用户要转移加密资产时,钱包会构建交易并对所需交易数据签名。其他网络参与者会根据公钥和协议验证规则验证签名。在当前经典计算假设下,如果正确生成签名,且没有私钥,伪造签名极其困难。这样一来,区块链节点可以拒绝未经授权的转账,同时允许有效交易在公共网络中流转。与一些较早的公钥系统相比,在经典安全级别相近时,ECDSA 生成的密钥和签名相对紧凑。紧凑签名很重要,因为每增加一个字节,都可能提高网络带宽、区块链存储和交易成本。ECDSA 是签名算法,不是加密算法
ECDSA 用于证明授权和消息完整性,但不会隐藏已签名的数据。尽管包含 ECDSA 签名,大多数公开的加密货币交易仍可被区块链参与者查看。签名不会加密目标地址、转账金额、交易手续费或智能合约指令。加密会将可读信息转换为密文,需要解密密钥才能还原。而 ECDSA 会生成数学证据,证明某条消息已获私钥授权。隐私需要通过独立的密码技术、协议设计或应用控制来实现。椭圆曲线基础
ECDSA 在有限域上的椭圆曲线点所构成的数学群中运行。常见的曲线形式写作
生成点通常表示为
生成点的阶通常表示为
NIST 椭圆曲线域参数建议记录了该标准涵盖的应用所获批准的曲线。
私钥和公钥
ECDSA 私钥是一个秘密整数,通常表示为
该值必须在 1 到
这种关系通常写作
根据
对于安全曲线和正确生成的密钥,据信无法通过实际计算从
什么是 secp256k1?
secp256k1 是与加密货币 ECDSA 联系最紧密的椭圆曲线。它用于传统 Bitcoin 交易签名和 Ethereum 外部拥有账户签名。该曲线在一个大素数域上的方程为
持续维护的libsecp256k1 项目为 secp256k1 提供经过优化的 ECDSA 签名、验证、密钥生成、解析和公钥恢复功能。
如何创建 ECDSA 签名
签名过程从私钥、消息、密码哈希函数和选定的曲线参数开始。消息会按照加密货币协议的确切序列化规则进行处理。序列化消息经过哈希后生成摘要,通常表示为
签名者会选择一个每次签名使用的秘密值,通常称为 nonce,表示为
签名者计算曲线点
第一个签名值
如果
第二个签名值按以下公式计算:
如果
生成的 ECDSA 签名是一对数值
如何验证 ECDSA 签名
验证者首先需要消息、签名、公钥、曲线参数和所需的哈希规则。如果
验证者计算
然后计算
验证者计算曲线点
如果
当
ECDSA 签名能证明什么
有效的 ECDSA 签名可以证明,控制相应私钥的人签署了指定数据。它还能让验证者发现签名消息是否遭到更改。签名本身不能独立证明签名者的法律身份。只有通过其他证据、注册信息、通信记录或交易历史,公钥才能与个人或组织建立联系。被盗私钥生成的签名,在数学上与原持有者生成的签名无法区分。区块链节点验证的是密码学,而非签名者是否自愿操作。用户签署恶意交易时,仍然创建了有效签名。ECDSA nonce 的关键作用
签名 nonce
确定性 ECDSA
确定性 ECDSA 会根据私钥和消息摘要生成签名 nonce,而不是在每次签名时都请求新的随机值。RFC 6979 确定性签名流程定义了一种广泛使用的基于带密钥哈希结构的方法。
在相同的确定性流程下,相同私钥和消息通常会生成相同 nonce 和签名。这可以减少每次签名操作对独立随机数生成器质量的依赖。确定性签名不能弥补私钥生成过程薄弱的问题。原始私钥仍需要足够的熵。确定性实现还必须防御计时攻击、故障攻击、内存泄漏和消息处理错误。部分实现会在确定性 nonce 生成过程中加入额外随机性,以防御特定故障或侧信道情况。哈希的重要性
ECDSA 通常签署密码摘要,而不是直接处理任意长度的消息。区块链协议会精确定义哈希前包含哪些交易字段,以及这些字段如何序列化。更改任何一个已签名字段都应生成不同的摘要,使原签名失效。不同加密货币可以使用不同的哈希函数和交易承诺规则,同时采用相同的 ECDSA 曲线。因此,同一条人类可读的消息在不同应用中可能会生成不同签名。开发者不得自行制定非正式的序列化规则,因为含糊的编码可能导致两个系统对同一组签名字节作出不同解释。安全协议还会使用域分离,防止为一种用途创建的签名被用于授权另一种用途。ECDSA 签名编码
数学意义上的 ECDSA 签名包含两个整数:
其他加密货币系统会采用定长紧凑编码,为
Bitcoin 和 ECDSA
Bitcoin 传统上使用 secp256k1 曲线上的 ECDSA,为许多交易输出的支出授权。钱包会根据适用脚本和签名哈希规则所确定的交易专属摘要进行签名。Bitcoin 节点会验证公钥、签名、脚本条件和所有其他共识要求。签名本身并不能证明输入包含足够价值,也不能证明交易符合所有协议规则。Bitcoin 的BIP 66 规范对相关脚本操作验证的 ECDSA 签名引入了严格 DER 编码的共识要求。
这一变化减少了解析器之间的差异,避免共识行为依赖不断变化的第三方解析规则。Bitcoin Taproot 支出采用 BIP 340 定义的 Schnorr 签名,而非其新签名路径中的 ECDSA。传统的 ECDSA 输出类型仍然存在,也仍可用于支出。严格签名解析为何重要
共识软件不仅必须对签名方程达成一致,还必须对哪些字节序列构成有效签名达成一致。如果一个节点接受某种特殊编码,而另一个节点拒绝它,节点可能会对交易或区块是否有效产生分歧。这种分歧可能导致网络对区块链的认知发生分叉。严格解析会排除表示相同数学值的其他编码。加密货币实现应精确定义整数正负号、前导零、长度、取值范围和尾随数据。共识关键的密码学要求不同软件版本和编程语言在字节级别完全一致。Ethereum 和 ECDSA
Ethereum 外部拥有账户使用 secp256k1 曲线上的 ECDSA 授权交易。发送方会对交易摘要签名;该摘要包含 nonce、目标地址、数额、数据、手续费参数和交易类型等字段。Ethereum 签名包含
较早的资料通常将恢复值称为
EIP-2 协议变更会拒绝
Ethereum 重放保护
如果同一笔已签名交易在多个区块链环境中都被接受,有效签名就可能带来风险。Ethereum 的EIP-155 重放保护设计将链标识符纳入交易签名流程。
这样可以将授权绑定到特定链环境。现代 Ethereum 类型化交易也会将交易类型和链专属字段纳入签名内容。要求链下签名的应用仍需自行设置域分离、nonce、有效期限和合约标识符。在不了解签名所覆盖的确切消息和域之前,不应将有效 ECDSA 签名视为安全。公钥恢复
标准 ECDSA 验证假设验证者已知公钥。可恢复 ECDSA 会增加少量信息,帮助确定与某个签名及消息对应的公钥。多个候选曲线点可能满足签名方程的部分条件,因此恢复标识符用于指出目标候选点。在某些交易格式中,这一功能可以减少传输完整公钥的需要。公钥恢复不会泄露私钥。libsecp256k1中的可选恢复模块支持适用于特定应用的可恢复 secp256k1 签名。
应用仍需验证恢复后的公钥、签名范围、消息格式和域。ECDSA 签名可塑性
ECDSA 在数学上具有一种固有的签名可塑性。如果
协议通常只接受一种规范形式来降低此问题,例如只接受
Low-S 签名
Low-
如果签名者算出的值较高,可以将其替换为
Bitcoin 软件通常会生成规范化的 Low-
ECDSA 与 Schnorr 签名的区别
ECDSA 和 Schnorr 是不同的签名算法,但可以使用同一条 secp256k1 椭圆曲线。Schnorr 签名的线性结构更简单,能够支持高效的多重签名和签名聚合方案。基础 ECDSA 不具备同样直接的线性聚合特性。Bitcoin 的BIP 340 规范定义了 secp256k1 曲线上的定长 64 字节 Schnorr 签名。
BIP 340 还介绍了 ECDSA 固有的可塑性,以及 ECDSA 形式化分析中所用的更复杂安全假设。引入 Schnorr 并不意味着现有 ECDSA 签名已失效或在实际中可被伪造。它为较新的协议功能提供了另一种具有实用特性的签名设计。ECDSA 与 EdDSA 的区别
EdDSA 是基于 Edwards 曲线数学的另一类签名方案。Ed25519 是常见的 EdDSA 实例。确定性签名和简化实现行为是 EdDSA 的重要设计目标。未经单独设计,Ed25519 密钥不能用作 secp256k1 ECDSA 密钥;随意转换并不安全。两者的签名大小、公钥格式、曲线运算、哈希流程和验证规则均不相同。支持两种算法的系统必须清楚标明各个密钥和签名适用的算法。ECDSA 与 BLS 签名的区别
BLS 签名使用适用于双线性配对的椭圆曲线,其数学特性与 ECDSA 不同。在明确的安全规则下,BLS 可以支持多个签名的紧凑聚合。Ethereum 验证者使用 BLS 签名履行权益证明共识职责,而普通 Ethereum 外部拥有账户使用 secp256k1 ECDSA。因此,验证者密钥不能与执行账户密钥互换使用。当许多参与者签署相关消息时,BLS 聚合可以减少数据量,但也会引入配对运算和不同的验证要求。ECDSA 和多重签名钱包
区块链脚本可以要求多个独立的 ECDSA 签名后才能支出资产。这是一种传统的多重签名设计,因为每个必需的签名者都会生成单独的签名。门限 ECDSA 使用更复杂的交互协议,由多个参与者共同创建一个外观普通的 ECDSA 签名。正确执行时,任何参与者都无需重构完整私钥。门限 ECDSA 的设计难度很高,因为参与者必须协调 nonce 生成并抵御恶意行为。即使基础 ECDSA 算法安全,存在缺陷的门限协议仍可能泄露共享私钥。生产系统应采用经过充分审查的协议,而不是自行设计多方签名方程。硬件钱包和 ECDSA
硬件钱包可以在专用设备内部生成并保存 ECDSA 私钥。设备会接收交易数据、显示可用详情,并在用户批准后于内部完成签名。私钥应保留在受保护的环境中。这种隔离可以降低连接手机或电脑上的恶意软件直接获取私钥的风险。如果用户批准了显示内容具有误导性的交易,硬件钱包也无法让恶意交易变得安全。安全的交易显示、固件完整性、助记词保护和供应链安全仍然至关重要。侧信道防护和故障防护同样重要,因为物理测量或诱发错误可能暴露秘密签名值。侧信道攻击
侧信道攻击会从 ECDSA 实现的物理行为中提取信息。可能的信号包括运行时间、功耗、电磁辐射、缓存访问和内存模式。依赖秘密值的分支或查表操作可能泄露私钥或 nonce 信息。恒定时间实现旨在使可观察到的运算模式不受秘密值影响。当前 libsecp256k1 项目记录了签名和公钥生成中的恒定时间及恒定内存访问行为。恒定时间代码可以降低重要风险,但无法应对所有物理、编译器、硬件或操作系统攻击。故障攻击
故障攻击会在设备生成 ECDSA 签名时故意造成错误。攻击者可能操纵电压、时钟、温度、内存或计算流程。在某些实现中,错误签名可能泄露足够的数学信息,使攻击者恢复私钥。高安全等级的签名设备可能会在输出签名前自行验证生成的签名。设备还可以采用冗余计算、故障传感器、加固芯片和受限错误消息。签名设备一旦被他人实际接触,就应视为发生了重要安全事件。无效公钥和曲线点
ECDSA 验证者不应盲目接受任意字节串作为公钥。实现可能需要确认编码有效,且该点位于预期曲线上。还应拒绝无穷远点,并执行任何必要的子群检查。在私钥运算中使用攻击者控制的无效点,可能引发无效曲线攻击或小子群攻击。具体验证要求取决于曲线、协议和操作类型。与非正式的自定义实现相比,经过审查的密码学库通常能更安全地处理这些细节。私钥生成
ECDSA 私钥必须通过密码学安全的熵源生成。人工选择的短语、生日、引文、重复数字和普通随机数函数都不安全。密钥还必须位于所选曲线的有效标量范围内。看起来是 256 位的数值,并不自动意味着它是安全生成的私钥。钱包通常会通过分层确定性派生流程,从主种子派生多个 ECDSA 密钥。任何获得该主种子的人都可能重建所有派生账户。如果恢复短语泄露,ECDSA 本身的安全性也无法弥补这一问题。ECDSA 和钱包地址
公钥不一定等同于加密货币地址。Bitcoin 地址通常会编码与公钥信息相关的哈希值或脚本条件。Ethereum 地址根据未压缩 secp256k1 公钥哈希的一部分派生。地址格式可以加入网络标识符和错误检测信息。钱包可能会通过不同派生路径,从一个主种子生成多个地址。用户不应假设在所有协议状态下,知道地址就能得知完整公钥。如果公钥和曲线安全,知道公钥也无法在经典计算下实际恢复私钥。交易签名与消息签名
交易签名根据协议定义的规则授权区块链操作。消息签名可以证明对密钥的控制权,而不直接发送区块链交易。钱包登录请求、代币授权、订单、治理投票和许可消息都可能使用 ECDSA 签名。即使是链下签名,如果智能合约或服务之后会提交该签名,也可能授权有价值的操作。如果实际签名数据授予了资产转移权限,那么看似登录请求的操作也可能具有危险性。钱包应尽可能显示签名域、合约、链、nonce、有效期和人类可读的操作内容。如果签名包含无法解释的数据或意外权限,用户应拒绝签署。重放攻击
重放攻击是指在签名者未授权的其他环境中重用有效签名。攻击者并未伪造签名。攻击者利用的是消息绑定不完整的问题。安全的签名消息会包含链标识符、账户 nonce、合约地址、应用域、操作类型和有效期等信息。一次性 nonce 可以阻止同一授权在同一应用中被重复使用。开发者应确认,只有在授权操作成功后才会消耗 nonce。实现错误
ECDSA 故障通常源于实现或密钥管理错误,而非直接破解椭圆曲线离散对数问题。常见问题包括重复使用 nonce、随机数存在偏差、接受无效密钥、哈希错误、序列化含糊、缺少范围检查和签名解析不安全。其他问题还包括侧信道、故障攻击、调试日志泄露、依赖项遭入侵和内存泄漏。开发者应使用持续维护、经过大量测试且安全模型明确的库。密码学代码应与普通应用代码分别审查,因为微小错误就可能暴露由密钥保护的所有资产。自定义编写 ECDSA 代码为何危险
ECDSA 公式看上去简单,似乎可以用短程序实现。生产级安全远不止复现签名和验证方程。实现还必须执行恒定时间标量运算、安全求逆、正确模约简、严格解析、曲线点验证和安全内存处理。实现也必须正确处理零值和无效点等少见情况。即使程序通过了几项常规签名测试,仍可能通过运行时间或 nonce 偏差泄露私钥。开发者应使用成熟库和官方测试向量,而不要将教程代码改用于加密货币托管。ECDSA 安全强度
ECDSA 的安全性取决于曲线强度、哈希函数、私钥熵、nonce 生成和实现方式。安全的 256 位椭圆曲线通常对应约 128 位经典安全强度。这并不意味着攻击者猜中密钥的概率是 1/128。该数值是在相关攻击模型下对计算工作量的近似描述。哈希函数还必须满足协议安全目标所需的碰撞抗性和原像抗性。操作控制薄弱会使实际安全性远低于数学层面的安全强度。ECDSA 和量子计算
如果存在足够强大的容错量子计算机,ECDSA 将无法抵御其攻击。Shor 算法可以解决椭圆曲线离散对数问题,并从公钥恢复私钥。目前没有公开的量子计算机能够在实际加密货币规模上破解完整规模的 secp256k1 ECDSA。长期运行的区块链系统仍需制定迁移计划,因为协议升级、钱包变更和闲置资金转移可能需要多年。如果未来研发出具有密码学意义的量子硬件,已在链上公开公钥的账户可能成为更优先的攻击目标。对于“当前 ECDSA 已经被破解”之类缺乏依据的说法,应保持谨慎。后量子签名替代方案
后量子数字签名依赖被认为能够抵御经典计算机和大型量子计算机的数学问题。NIST 于 2024 年 8 月最终发布了ML-DSA 标准 FIPS 204和SLH-DSA 标准 FIPS 205。
这些签名系统与 ECDSA 在密钥大小、签名大小、计算成本和实现要求方面均不同。在区块链上替换 ECDSA,并不像更换钱包库那么简单。迁移可能影响地址格式、交易大小、硬件钱包、智能合约、网络验证、账户恢复和闲置资金。部分协议可能会在过渡期间采用混合授权,同时要求提供现有 ECDSA 签名和后量子签名。开发者如何安全使用 ECDSA
开发者应使用目标协议要求的确切曲线、哈希函数、消息格式和签名编码。私钥必须通过密码学安全的生成或派生流程创建。签名 nonce 应采用经过审查的确定性方法,或使用具有同等保护能力的安全随机数方案。库应执行严格的签名解析、标量范围检查、公钥验证和协议要求的规范化。秘密密钥运算应使用恒定时间实现。应用必须实现域分离、重放保护、清晰的交易显示和适当的 nonce 管理。测试套件应包含无效签名、高
加密用户如何保护 ECDSA 密钥
用户应通过信誉良好的软件或专用签名硬件创建钱包。恢复短语和私钥应离线保存,绝不能与客服人员或网站分享。签署前,应在可信显示屏上核对交易详情。用户应核实目标地址、网络、金额、手续费、合约和权限范围。高价值资产可以通过多重签名策略、分散备份、硬件隔离和独立的日常支出钱包进行保护。不应将同一恢复短语导入不必要的应用。在许多区块链系统中,有效签名是无法撤销的授权证据,因此预防比补救更可靠。ECDSA 常见错误
一个常见错误是认为 ECDSA 会加密加密货币交易。另一个错误是认为公钥始终与钱包地址完全相同。第三个错误是对两条消息重复使用同一签名 nonce。第四个错误是使用普通随机数函数生成私钥或 nonce。第五个错误是在未严格解析的情况下接受非规范或格式错误的签名。第六个错误是忘记
常见问题
ECDSA 是什么的缩写?
ECDSA 是 Elliptic Curve Digital Signature Algorithm(椭圆曲线数字签名算法)的缩写。ECDSA 在加密货币中有什么用途?
它用于生成和验证签名,以授权区块链交易和其他钱包操作。ECDSA 会加密交易吗?
不会。ECDSA 可以证明授权和完整性,但不会隐藏普通的公开区块链数据。什么是 ECDSA 私钥?
它是一个用于创建签名并派生相应公钥的秘密整数。什么是 ECDSA 公钥?
它是从私钥派生的椭圆曲线点,用于验证签名。Bitcoin 的 ECDSA 使用什么曲线?
Bitcoin 的传统 ECDSA 交易签名使用 secp256k1 椭圆曲线。Ethereum 账户签名使用什么曲线?
Ethereum 外部拥有账户使用 secp256k1 曲线上的 ECDSA。ECDSA 中的 r 和 s 是什么?
它们是 ECDSA 签名中的两个整数分量。ECDSA nonce 是什么?
它是签名生成过程中每次签名使用的秘密标量。ECDSA nonce 为什么绝不能重复使用?
不同消息的签名重复使用 nonce,可能使观察者计算出私钥。什么是确定性 ECDSA?
这是一种通过 RFC 6979 等既定流程,根据私钥和消息摘要派生 nonce 的签名方法。确定性 ECDSA 能消除对随机性的需求吗?
不能。原始私钥仍需要足够的熵,实现也必须能够抵御故障和侧信道攻击。什么是 ECDSA 签名可塑性?
对于同一条消息和公钥,
什么是 Low-S 签名?
这是指
什么是 DER 编码?
DER 是一种结构化二进制编码,常用于表示 ECDSA 签名中的
ECDSA 签名会泄露私钥吗?
正确生成的签名不应泄露私钥,但 nonce 重用、nonce 偏差、侧信道和实现错误都可能暴露密钥。ECDSA 能恢复丢失的私钥吗?
不能。对于安全生成且已丢失的私钥,签名和公钥都无法提供实际可行的恢复方法。有人能伪造 ECDSA 签名吗?
如果使用安全参数、密钥、nonce、哈希和实现,伪造签名在计算上被认为难以实际完成。ECDSA 和 ECC 是一回事吗?
不是。ECC 是椭圆曲线密码学的统称,ECDSA 则是该领域中的一种数字签名算法。ECDSA 和 Schnorr 是一回事吗?
不是。即使两者都使用 secp256k1,它们仍是不同的签名算法。Taproot 使用 ECDSA 吗?
Taproot 的新签名路径使用 BIP 340 Schnorr 签名,而非 ECDSA。智能合约可以验证 ECDSA 签名吗?
可以。许多区块链环境都提供原生操作或库,用于验证 secp256k1 ECDSA 签名。有效 ECDSA 签名能证明法律身份吗?
不能。除非有其他证据将该密钥与法律身份关联起来,否则签名只能证明对私钥的控制权。有效签名能保证交易安全吗?
不能。用户可能会有效签署恶意转账、无限额授权、欺骗性订单或不安全的智能合约操作。量子计算机可以破解 ECDSA 吗?
足够强大的容错量子计算机可以破解 ECDSA,但目前没有公开的系统能够在加密货币规模上做到这一点。ECDSA 现在仍然安全吗?
如果密钥和 nonce 安全,且实现正确,ECDSA 仍能抵御已知的实际经典攻击。结语
ECDSA 是一种基础数字签名算法,可在不公开私钥的情况下授权加密货币交易。它结合私有标量、椭圆曲线公钥、消息摘要和秘密签名 nonce,生成
严格编码、Low-
您可能也喜欢
反恐融资(CTF)
框架
波动性爆发
热门
目前热门备受市场关注的加密货币
最高成交量
按交易量计算交易量最大的加密货币

