# ML-DSA是什么？定义、例子与常见误区

> ML-DSA 是 NIST 于 2024 年 8 月在 FIPS 204 中标准化的基于格的后量子数字签名算法，源自 CRYSTALS-Dilithium。

Source: https://ssl.sh/zh/glossary/ml-dsa/
Last updated: 2026-11-10

ML-DSA 是一种安全性基于模格问题的[数字签名](https://ssl.sh/zh/glossary/digital-signature/)方案，由 NIST 在 FIPS 204 中标准化，定义了 ML-DSA-44、ML-DSA-65、ML-DSA-87 三组参数，强度依次递增。NIST 还在 FIPS 205 中标准化了基于哈希的替代方案 SLH-DSA，其公钥更小，但签名更大、速度更慢。

## 为什么重要
要让 TLS 的身份认证扛得住未来的量子攻击者，证书签名和握手签名终究要从 [RSA](https://ssl.sh/zh/glossary/rsa/) 和 [ECDSA](https://ssl.sh/zh/glossary/ecdsa/) 迁移出去。最大的障碍是体积：ML-DSA-44 的签名有 2,420 字节，而 ECDSA P-256 签名只有约 64 字节；一次典型握手要携带多个签名和公钥，包括叶子证书公钥、叶子与中间证书上的签名、CertificateVerify 签名和内嵌的 SCT。全部换成 ML-DSA，每次握手会多出好几 KB。由于身份认证无法被"事后破解"，这项迁移不如基于 [ML-KEM](https://ssl.sh/zh/glossary/ml-kem/) 的后量子密钥交换紧迫。

## 例子
FIPS 204 中的尺寸，以及用 OpenSSL 3.5 及以上版本生成密钥：

```text
Parameter set   Public key     Signature
ML-DSA-44       1,312 bytes    2,420 bytes
ML-DSA-65       1,952 bytes    3,309 bytes
ML-DSA-87       2,592 bytes    4,627 bytes
```

```bash
openssl genpkey -algorithm ML-DSA-65 -out mldsa65.key
openssl pkey -in mldsa65.key -pubout -out mldsa65.pub
```

## 常见误区
- **应该先上后量子证书，再上后量子密钥交换。** 顺序正好相反：录下的流量可以日后解密，而签名只需在被验证的那一刻抗伪造。
- **ML-DSA 可以直接替换 ECDSA。** 它的密钥和签名大了几十倍，会影响握手、CT 日志和硬件安全模块。
- **ML-DSA 和 ML-KEM 干的是同一件事。** ML-DSA 负责签名，ML-KEM 负责建立共享密钥。

## 相关术语

- [后量子密码](https://ssl.sh/zh/glossary/post-quantum-cryptography/): 后量子密码（PQC）是专为抵御大规模量子计算机攻击而设计的公钥密码算法，用来替代可能被量子计算机破解的 RSA 和 ECC。
- [数字签名](https://ssl.sh/zh/glossary/digital-signature/): 数字签名是用私钥对消息计算出的一个值，任何持有对应公钥的人都能验证它，从而确认消息来源和内容未被篡改。
- [ML-KEM](https://ssl.sh/zh/glossary/ml-kem/): ML-KEM 是 NIST 于 2024 年 8 月在 FIPS 203 中标准化的后量子密钥封装机制，源自 CRYSTALS-Kyber，用于抗量子的密钥建立。
- [ECDSA](https://ssl.sh/zh/glossary/ecdsa/): ECDSA 是基于椭圆曲线的数字签名算法，在 TLS 证书中作为 RSA 的替代方案，密钥和签名更小、签名运算更快。
- [Ed25519](https://ssl.sh/zh/glossary/ed25519/): Ed25519 是在 Curve25519 爱德华兹形式上实现的 EdDSA 签名方案，由 RFC 8032 定义，公钥 32 字节，签名 64 字节且为确定性签名。
- [RSA](https://ssl.sh/zh/glossary/rsa/): RSA 是 1977 年提出的公钥算法，TLS 用它对证书和握手进行签名，在 TLS 1.3 之前还用它传输会话密钥。
