首页/安全/加密与证书速查/ECDSA 椭圆曲线数字签名
加密算法基础95 条

ECDSA 椭圆曲线数字签名

基于椭圆曲线离散对数难题的签名算法(FIPS 186-5),密钥与签名短:P-256 公钥约 64 字节、签名 DER 编码约 70-72 字节,广泛用于 TLS 与代码签名。

加密与证书速查安全更新于 2026-10-13

ECDSA 是什么

ECDSA 是基于椭圆曲线离散对数难题的数字签名算法,标准见 FIPS 186-5 与 SEC 1。相比 RSA,它在同等安全强度下密钥与签名都短得多:P-256 的签名约 70 字节、公钥约 64 字节,因此更适合证书体积敏感与高并发握手场景。TLS、代码签名与部分硬件签名接口都大量使用它。

基本信息

标准FIPS 186-5 / SEC 1
常用曲线P-256(约 128 位强度)、P-384(约 192 位)、P-521(约 256 位)
签名结构整数对 (r, s),常用 DER 编码,也可用固定长度 P1363 格式
随机数要求每次签名需唯一且不可预测的 k,或使用 RFC 6979 的确定性 k
签名长度DER 编码约 70-72 字节(P-256),长度可变
典型用途TLS 证书、代码签名、JWT ES256、设备身份认证

典型使用场景

  • TLS 证书:ECDSA 证书配合 ECDHE 套件,握手数据量小于 RSA
  • 代码与固件签名:签名短,适合受限存储的引导程序与嵌入式设备
  • JWT 与开放平台:ES256/ES384 用于令牌与接口签名
  • 设备身份:IoT 与安全芯片内置椭圆曲线引擎做双向认证
  • 时间戳与凭证签发:作为 CA 私钥算法,兼顾强度与体积
  • 高并发握手:证书链更小,减少握手字节数与 CPU 开销

签名与验签(OpenSSL)

签名与验签(OpenSSL)
# 生成 P-256 密钥对(prime256v1 即 secp256r1)
openssl ecparam -name prime256v1 -genkey -noout -out ec.key
openssl ec -in ec.key -pubout -out ec.pub
# 先哈希再签名,DER 编码;验签失败先确认格式与哈希一致
openssl dgst -sha256 -sign ec.key -out sig.bin data.bin
openssl dgst -sha256 -verify ec.pub -signature sig.bin data.bin
# 查看曲线名与公钥,确认没有被换成其他曲线
openssl ec -in ec.key -text -noout | head -6
# DER 与 P1363(r||s 定长)互转,跨系统对接的常见故障点
openssl pkeyutl -sign -inkey ec.key -rawin -in data.bin -out sig2.bin

曲线与强度对照

曲线近似安全强度私钥/公钥长度适用场景
P-256(secp256r1)约 128 位32 / 64 字节通用选择,TLS 与代码签名主流
P-384(secp384r1)约 192 位48 / 96 字节更长期数据保护与高等级合规
P-521(secp521r1)约 256 位66 / 132 字节与 SHA-512 搭配的超高等级场景
secp256k1约 128 位32 / 64 字节区块链生态常用,与 P-256 不可互换
ECDSA 的安全性极大依赖随机数 k:k 重复或可预测时,攻击者用两次签名即可联立方程解出私钥。历史上多起事故都源于此。因此要么使用经过验证的库(内部按 RFC 6979 生成确定性 k),要么使用硬件随机源;绝不要自研签名实现。
ECDSA 签名是 DER 编码的整数对,长度随 r、s 的高位情况变化,导致同一算法的签名字节数不固定。需要定长签名的场景(部分硬件接口、固定长度报文)要改用 P1363 格式(r 与 s 各按曲线长度补齐后拼接),转换错误是跨系统验签失败的首要原因。
ECDSA 只做签名,不做加密与密钥协商:密钥协商用 ECDH/ECDHE,加密通常走混合加密。把 ECDSA 密钥拿去协商共享秘密是常见概念混用,会在实现层直接报错。

落地清单

  • 密钥生成在受控环境完成,私钥文件权限设为 600,导出公钥后才交付对方
  • 曲线名在不同工具里写法不同(prime256v1 与 secp256r1),配置前先用 ecparam -list_curves 核对
  • 签名与验签的哈希算法写进接口约定,例如约定 ES256 即 P-256 配 SHA-256
  • 证书申请时把曲线与算法写进 CSR,避免 CA 签发出算法与预期不符的证书
  • 验签失败按顺序排查:格式(DER 或 P1363)、哈希、曲线、公钥来源,四项固定核对
  • 存量 RSA 证书迁移到 ECDSA 前先确认客户端支持度,老设备可能只认 RSA 套件

易错点

  • 随机数 k 重用或可预测:两次同 k 的签名即可反解私钥,属于灾难级缺陷;必须依赖成熟库或硬件随机源
  • DER 与 P1363 格式混用:验签失败却查不出配置问题,先确认对方期望的编码格式与哈希算法
  • 曲线不一致:一方用 secp256k1、另一方用 P-256 时签名不可互验,配置里要明确曲线名(prime256v1 与 secp256r1 同物异名)
  • 把 ECDSA 当加密算法或把密钥长度当安全强度:256 位曲线约等于 128 位强度,签名与加密的角色也不可互换
  • 刻意在 s 上做低 s 规范化处理不当:部分场景要求 low-s 形式,未处理会被严格的验签方拒绝

数据来源与参考

  • FIPS 186-5(ECDSA)
  • SEC 1(椭圆曲线密码学)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌