Go 1.27 的 crypto/mldsa:FIPS 204 签名进入 crypto/x509 与 crypto/tls,和 1.26 的 crypto/hpke 各管一段
Go 1.27 于 2026 年 8 月 19 日发布,发布博客见 go.dev/blog/go1.27。标准库新增中,安全方向最值得关注的是 crypto/mldsa:它实现 FIPS 204 的后量子 ML-DSA 签名方案,并集成到 crypto/x509 与 crypto/tls。
相关链接:
crypto/mldsa 能干什么
crypto/mldsa 提供 ML-DSA 签名的生成与验证能力。ML-DSA 原称 Dilithium,是 NIST 后量子数字签名标准,标准化编号为 FIPS 204。
它解决的是签名问题:用私钥签名、用公钥验证,用于认证和完整性。不是密钥交换,也不是公钥加密。
在证书与握手层怎么出现
发布说明明确写了 crypto/mldsa 已集成到 crypto/x509 和 crypto/tls。这意味着:
- 在证书层,ML-DSA 可以出现在 X.509 证书的签名与验证路径中。例如证书签名算法、证书链验证可能涉及 ML-DSA。
- 在握手层,TLS 握手认证依赖签名算法;集成后,ML-DSA 可以进入 TLS 握手的认证签名路径。
具体 API 形态、默认启用策略、是否与经典签名混合、证书 OID 和 TLS 配置项,需自行验证。这里能确认的是集成点,不是完整行为。
和 Go 1.26 crypto/hpke 的关系
Go 1.26 的 release notes 写明:新增 crypto/hpke 包,实现 RFC 9180 定义的 Hybrid Public Key Encryption(HPKE),并包含对后量子混合 KEM 的支持。
两者不是替代关系:
crypto/hpke面向 KEM/公钥加密,负责密钥封装和共享密钥建立。crypto/mldsa面向签名,负责认证、完整性和证书/握手身份验证。
后量子迁移通常需要两边都考虑:KEM 保护密钥交换,签名保护身份和握手认证。Go 1.27 的 crypto/mldsa 补的是签名侧;Go 1.26 的 crypto/hpke 补的是 KEM 侧,且已经支持 PQ 混合 KEM。
如果系统只上 ML-DSA,密钥交换侧是否 PQ 安全取决于协议配置;如果只上 HPKE,证书认证侧是否 PQ 安全也取决于签名配置。不要把 HPKE 的混合 KEM 当成签名,也不要把 ML-DSA 当成 KEM。
迁移与兼容注意
后量子迁移通常把 PQ 签名与经典签名配对使用,形成 hybrid:任一方被攻破时,信任可以优雅降级。Go 1.27 的 crypto/x509 / crypto/tls 集成是否自动采用 hybrid、如何显式配置,需自行验证。
实际迁移还要看互操作:对端是否支持 ML-DSA、证书链如何构建、TLS 扩展和签名算法如何协商。这些细节需自行验证。
版本门槛也要注意:crypto/mldsa 是 Go 1.27 新增。Go 1.28 draft notes 见 tip.golang.org/doc/next,其中要求 Go 1.28 使用 Go 1.26.0+ 进行 bootstrap,预期发布时间为 2027 年 2 月。实验性特性不要直接当成稳定 API。
Go 1.27 其他标准库变化
同一版本还有几项标准库新增:
encoding/json/v2:提供高层 JSON 处理,支持可配置选项和更严格的默认行为;配套encoding/json/jsontext负责低层流式处理。uuid:原生支持 UUID 的生成与解析。simd与架构相关的simd/archsimd:实验性 SIMD 支持。net/http/httptest新增NewTestServer:提供内存假网络,适合配合testing/synctest使用。
Go 1.26 的实验特性与背景
Go 1.26 还引入了实验性 simd/archsimd,需要 GOEXPERIMENT=simd,平台为 amd64;以及实验性 runtime/secret,需要 GOEXPERIMENT=runtimesecret,用于安全擦除临时数据,支持 Linux 上的 amd64/arm64。
回到签名本身:ML-DSA 是 NIST 后量子数字签名标准,FIPS 204。后量子迁移的常见做法,是把 PQ 签名与经典签名配对成 hybrid,让信任在任一算法被攻破时仍可降级。Go 1.27 把 crypto/mldsa 接进 crypto/x509 和 crypto/tls,意味着 Go 标准库的 PQ 签名路径开始进入证书与握手层;具体可用范围和配置方式,以 Go 1.27 release notes 和实际代码为准。