![[数字安全]DSA 数字签名算法:从联邦标准到历史遗留,工程师该补的这一课](http://pic.xiahunao.cn/yaotu/[数字安全]DSA 数字签名算法:从联邦标准到历史遗留,工程师该补的这一课)
如果你还在老系统里看到 DSA 证书、DSA SSH key或者 DSA 签名的软件包不用意外。它曾经是美国政府选定的数字签名标准如今已经进入只读阶段新签名不再被批准旧签名还得继续验。理解 DSA不只是复习一个老算法更是看清密码学标准怎么演进、算法敏捷性为什么重要以及一个设计良好的算法怎么会变成维护负担。一、DSA 到底是什么DSA全称 Digital Signature Algorithm数字签名算法。它是一种公钥密码算法但用途很窄只做数字签名。和 RSA 不同RSA 能加密、解密、签名DSA 不能加密也不能做密钥交换。它只负责证明一件事这条消息来自某个私钥持有者并且消息在签名之后没有被改过。DSA 的数学基础是有限域上的离散对数问题。NIST 在 1991 年提出 DSA1994 年把它纳入数字签名标准 FIPS 186。DSA 本身可以看作 Schnorr 和 ElGamal 签名方案的变体经过标准化后用于政府和商业系统。常见误解是把 DSA 和 ECDSA 混在一起。ECDSA 是 DSA 在椭圆曲线上的对应版本思路相似但底层数学不同。DSA 用的是有限域离散对数ECDSA 用的是椭圆曲线离散对数。二、DSA 能提供什么价值DSA 通过一套签名和验证机制给出三个核心保证。身份认证验证者能确认签名来自某个特定私钥的持有者从而确认签名者身份。完整性签名后的消息只要被改动签名就会失效。接收方知道数据没有被篡改。不可否认性只要私钥一直在签名者控制之下签名者事后就不能否认自己签过这条消息。这些性质让 DSA 在政府通信、软件分发和早期安全协议里很有吸引力尤其是那些只需要签名验证、不需要加密的场景。三、DSA 是什么时候出现和公告的NIST 在 1991 年 8 月 30 日公布了 DSA作为数字签名标准草案。这件事在当时很受关注原因有两个。第一这是美国联邦标准第一次强制指定单一签名算法而不是允许多种算法并存。第二DSA 的设计有 NSA 参与。密码学界因此担心标准里可能藏后门也担心政府对密码标准的控制过强。后续标准演进大致如下。1994 年FIPS 186 正式发布。2009 年FIPS 186-3 通过密钥长度从最早的 512 到 1024 位扩展到更大范围。2013 年FIPS 186-4 进一步细化了要求。2023 年 2 月FIPS 186-5 发布DSA 被移除出签名生成方法。它只允许用于验证在该标准生效日期之前创建的旧签名。也就是说DSA 在今天不是完全不能用而是只能用于兼容历史数据。新系统不应该再生成 DSA 签名。四、DSA 用在过哪些地方DSA 在它的活跃期进入了不少实际系统。TLS 和 SSL 证书早期 HTTPS 部署会使用 DSA 签名的证书。浏览器和服务器支持 DSA 作为证书签名算法让网站通过离散对数问题证明身份而不是依赖 RSA 的整数分解。代码签名软件发行方用 DSA 给可执行文件和更新包签名。签名用来确认代码来自声称的开发者并且在传输过程中没有被修改。Java applet 和部分 Linux 包管理系统里都能见到这种用法。SSH 密钥认证SSH 协议支持 DSA 密钥做主机认证和用户认证。DSA 密钥对可以向远程服务器证明用户身份不需要传密码。很多系统管理员当年都生成过 DSA key。政府和国防通信DSA 本来就是联邦标准因此在美国政府机构、承包商的安全消息系统和文档签名场景里有采用。五、DSA 的优点在它的生命周期里DSA 确实有一些实用优势。签名生成快在相同安全级别下很多实现里 DSA 生成签名的速度比 RSA 快。选好随机 nonce 之后签名值的计算很高效。签名体积小DSA 签名比同等安全级别的 RSA 签名更短。比如 1024 位 DSA 的签名是 320 位而 1024 位 RSA 签名是 1024 位。这在带宽紧张的环境里有意义。标准定义清楚作为联邦标准DSA 对参数生成、密钥长度和互操作性都有明确规范开发者知道该实现什么。免专利费DSA 虽然涉及专利但 NIST 让它在全球范围内可以免专利费使用降低了采用门槛。六、DSA 的缺点随着密码学环境成熟DSA 的问题越来越明显。只能签名DSA 不能加密也不能做密钥交换。系统如果既要保密又要认证就得再引入 RSA 或对称加密。复杂度和密钥管理成本都会上升。严重依赖高质量随机数DSA 每次签名都需要一个唯一、不可预测的随机值也就是 nonce。如果 nonce 被重用或者可预测私钥就能从签名里恢复。这不是理论问题。2010 年 PlayStation 3 被破解利用的正是 ECDSA 的 nonce 重用漏洞。验证慢DSA 的签名验证比 RSA 验证更耗时。在验证频繁、签名很少的系统里DSA 会成为性能瓶颈。密钥长度膨胀为了对抗计算能力增长DSA 需要越来越长的密钥。3072 位 DSA 密钥提供的安全强度大致只相当于 256 位椭圆曲线密钥但存储和计算开销大得多。行业采用有限虽然 DSA 是联邦标准但它从未像 RSA 那样普及。很多商业 CA 和软件厂商更愿意用 RSA因为 RSA 用途更广。NIST 自己在移除 DSA 时也提到行业使用有限是原因之一。七、相关安全标准和落地建议如果组织里还有系统在用 DSA操作建议很直接。停止生成新的 DSA 签名FIPS 186-5 已经不再批准 DSA 用于签名生成。新开发应使用 ECDSA、EdDSA 或合适密钥长度的 RSA。只验证旧签名DSA 仍可用于验证 2023 年 2 月 3 日之前创建的签名。这样系统可以继续校验历史数据不必立刻全部重签。迁移到现代算法可选替代包括 ECDSA P-256 或 P-384、EdDSA Ed25519、RSA 3072 位及以上。它们要么性能更好要么密钥更小或者两者兼有。规划后量子迁移NIST 已经给出后量子迁移方向。按 NIST IR 8547 的路线图RSA 和 ECC 在 2030 年后会逐步弃用2035 年后不再允许。长期系统应开始评估 ML-DSA也就是 Dilithium 这类后量子签名算法。审计现有 DSA 部署找出仍在使用 DSA 签名的地方。分清哪些是生成签名哪些只是验证签名。仍在生成 DSA 签名的系统要优先迁移因为这已经不符合当前标准。八、写在最后DSA 完成了它的历史任务。在需要标准化、免专利费的签名机制时它提供了一个可用方案。但它的局限也很致命尤其是只能签名以及对 nonce 误用的脆弱性。它更像一个过渡技术而不是长期答案。对工程师来说DSA 的教训不是“它失败了”而是密码学标准一定会演进系统从第一天起就要考虑算法敏捷性。今天用 ECDSA 或 Ed25519不代表可以高枕无忧。后量子迁移的时间表已经摆在那里越早把算法替换设计成可插拔能力未来付出的代价越小。参考资料FIPS 186-5, Digital Signature Standard (DSS), NIST, 2023FIPS 186-4, Digital Signature Standard (DSS), NIST, 2013NIST IR 8547 (Initial Public Draft), Transition to Post-Quantum Cryptography StandardsNIST FIPS 186-5 公告与 DSA 移除说明