DSA 数字签名算法
DSA 是 FIPS 186 系列早期的数字签名算法,基于有限域离散对数问题,签名长度固定,参数生成与校验都比较复杂。FIPS 186-5 已不再包含 DSA,也不再批准它用于新系统;存量系统应把签名迁移到 ECDSA、Ed25519 或 RSASSA-PSS。它与 ECDSA 同属离散对数家族,同样依赖严格的随机数生成。
基本信息
| 历史标准 | FIPS 186-4 中仍包含 DSA |
|---|---|
| 现状 | FIPS 186-5 不再批准 DSA,新系统不应选用 |
| 共同缺陷 | 与 ECDSA 一样依赖一次性随机数,随机数复用会泄漏私钥 |
| 参数问题 | 1024 位参数组存在共享弱参数风险 |
| 迁移目标 | ECDSA、Ed25519、RSASSA-PSS |
典型使用场景
- 清点存量证书与签名算法,识别仍在使用 DSA 的系统
- 迁移规划:按证书链与客户端支持度分批替换
- 排查老系统之间的签名互操作问题
- 安全测评中回答是否使用了已弃用算法
- 理解随机数复用风险,避免在新代码中重犯同类错误
识别遗留密钥与算法
识别遗留密钥与算法
openssl dsaparam -out dsaparam.pem 2048 # 生成 DSA 参数(测试用)
openssl gendsa -out dsa.key dsaparam.pem # 生成 DSA 私钥
openssl dsa -in dsa.key -text -noout | head -5 # 查看关键参数
openssl x509 -in old.crt -noout -text | grep -i 'signature algorithm' # 证书签名算法算法状态对照
| 算法 | 当前状态 | 建议 |
|---|---|---|
| DSA | FIPS 186-5 不再批准 | 迁移到 ECDSA 或 Ed25519 |
| RSA PKCS#1 v1.5 | 仍可用 | 新系统优先 RSASSA-PSS |
| ECDSA | 推荐 | 注意随机数的生成方式 |
| Ed25519 | 推荐 | 确定性签名,实现更简单 |
DSA 的参数组生成与校验比 ECDSA 复杂,手工实现风险高;它同样依赖一次性随机数,复用随机数的后果与 ECDSA 一样严重,可直接恢复私钥。迁移时要同时处理算法替换与随机数生成方式这两件事。
清点方法:从证书的签名算法字段、配置里的算法白名单、以及代码中的签名调用三处入手,列出仍使用 DSA 的位置与负责人;再按「对外影响优先」的顺序迁移。迁移完成后保留一段时间的双算法兼容,避免客户端升级不同步导致中断。
清点提醒:不少老系统会把 DSA 与 RSA 材料混在同一个密钥库里,只看证书类型容易漏项,还要核查私钥算法与签名用途;这类混装库在迁移时最容易出现「换了证书但旧密钥还在用」的情况。