NSEC3 是什么
NSEC3(TYPE 50)是 NSEC 的隐私增强版:owner name 与「下一个名字」都用哈希表示(默认 SHA-1 加盐与迭代次数),既保留证明名字不存在的能力,又不把真实名字直接暴露在响应里(RFC 5155)。配套的 NSEC3PARAM(TYPE 51)用来声明本区域使用的哈希参数。
基本信息
| 类型 | NSEC3(TYPE 50)、NSEC3PARAM(TYPE 51) |
|---|---|
| 字段 | 哈希算法、标志、迭代次数、盐、下一哈希、类型位图 |
| 规范 | RFC 5155 |
| 迭代建议 | RFC 9276 建议取 0,避免被用于放大攻击 |
| 标志位 | bit 0 为 opt-out,用于跳过不签名的委托 |
| 部署位置 | 公网区域的常见选择 |
典型使用场景
- 公网区域的 DNSSEC 部署(优先选择 NSEC3)
- opt-out 场景:跳过不签名的委托,减少记录数量
- 排障:验证失败时核对两侧的哈希参数是否一致
- 安全评估:评估区域枚举的实际难度与成本
- 成本控制:迭代次数与记录体积对解析延迟的影响
- 迁移实施:从 NSEC 切换到 NSEC3 的步骤与验证
观察参数与记录
观察参数与记录
# 查看区域声明的 NSEC3 参数
dig +short example.com NSEC3PARAM
# 1 0 5 AABBCCDD → 算法 1(SHA-1)、flags 0、迭代 5、盐 AABBCCDD
# 观察 NSEC3 记录(owner name 已哈希,看不到真实名字)
dig +dnssec +noall +answer example.com NSEC3 | headNSEC3 参数读法
| 参数 | 含义 | 建议 |
|---|---|---|
| 哈希算法 | 1 表示 SHA-1 | 实际部署仍以 1 为主 |
| flags | bit 0 为 opt-out | 需要跳过不签名委托时使用 |
| 迭代次数 | 额外的哈希轮数 | RFC 9276 建议取 0 |
| 盐 | 附加到哈希的随机串 | 轮换需整体重签,不建议频繁变更 |
迭代次数过高会让验证解析器承担额外 CPU 开销,历史上曾被用于放大攻击;当前建议是取 0 次迭代。
opt-out 会让「不存在的名字」在某些情况下得不到完整否定证明,配置前要理解它对安全性的影响。
NSEC3 只是提高了枚举成本,并没有完全阻止枚举:哈希后的名字仍可被字典与爆破离线攻击。
盐的轮换需要整体重签区域,操作窗口内容易出现签名不一致,非必要不要频繁变更。
NSEC3 不是 NSEC 的语法升级,而是另一套记录类型;切换时需要重新生成整条否定证明链。