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 套件