跳到主要内容

3. The NSEC3 Resource Record (NSEC3 资源记录)

3. The NSEC3 Resource Record (NSEC3 资源记录)

NSEC3 资源记录 (Resource Record, RR) 为 DNS 资源记录集 (Resource Record Sets) 提供认证拒绝存在 (authenticated denial of existence)。

NSEC3 RR 列出了存在于 NSEC3 RR 原始所有者名称 (original owner name) 处的 RR 类型。它包括区域哈希顺序 (hash order) 中的下一个哈希所有者名称 (next hashed owner name)。区域中完整的 NSEC3 RR 集合指示了 RR 的原始所有者名称处存在哪些 RRSet, 并在区域中形成一条哈希所有者名称链。这些信息用于提供 DNS 数据的认证拒绝存在。为了提供对区域枚举的保护, NSEC3 RR 中使用的所有者名称是原始所有者名称的加密哈希 (cryptographic hashes), 作为单个标签预置到区域名称。NSEC3 RR 指示使用哪个哈希函数来构造哈希, 使用哪个盐 (salt), 以及在原始所有者名称上执行了多少次哈希函数的迭代 (iterations)。5 节完整描述了哈希技术。

未签名委托 (unsigned delegations) 的哈希所有者名称可以从链中排除。一个 NSEC3 RR 的范围覆盖了未签名委托的所有者名称或 "next closer" 名称的哈希, 被称为 Opt-Out NSEC3 RR, 并由标志的存在指示。

NSEC3 RR 的所有者名称是哈希所有者名称的 base32 编码, 作为单个标签预置到区域名称。

NSEC3 RR 的类型值为 50。

NSEC3 RR RDATA 格式与类无关, 描述如下。

类 (class) 必须与原始所有者名称的类相同。

NSEC3 RR 应该具有与 SOA 最小 TTL 字段相同的 TTL 值。这符合负缓存 (negative caching) [RFC2308] 的精神。

3.1. RDATA Fields (RDATA 字段)

3.1.1. Hash Algorithm (哈希算法)

Hash Algorithm 字段标识用于构造哈希值 (hash-value) 的加密哈希算法。

此字段的值在 11 节定义的 NSEC3 哈希算法注册表中定义。

3.1.2. Flags (标志)

Flags 字段包含 8 个单比特标志, 可用于指示不同的处理。所有未定义的标志必须为零。本规范定义的唯一标志是 Opt-Out 标志。

3.1.2.1. Opt-Out Flag (Opt-Out 标志)

如果设置了 Opt-Out 标志, NSEC3 记录覆盖零个或多个未签名委托。

如果清除了 Opt-Out 标志, NSEC3 记录覆盖零个未签名委托。

Opt-Out 标志指示此 NSEC3 RR 是否可以覆盖未签名委托。它是 Flags 字段中的最低有效位。有关此标志使用的详细信息, 请参见 6 节。

3.1.3. Iterations (迭代)

Iterations 字段定义了哈希函数已执行的额外次数。更多的迭代导致哈希值对字典攻击 (dictionary attacks) 具有更高的弹性, 但代价是服务器和解析器的计算成本更高。有关此字段使用的详细信息, 请参见 5 节, 有关该值的限制, 请参见 10.3 节。

3.1.4. Salt Length (盐长度)

Salt Length 字段定义了 Salt 字段的长度 (以八位字节为单位), 取值范围从 0 到 255。

3.1.5. Salt (盐)

Salt 字段在哈希之前附加到原始所有者名称, 以防御预先计算的字典攻击 (pre-calculated dictionary attacks)。有关如何使用盐的详细信息, 请参见 5 节。

3.1.6. Hash Length (哈希长度)

Hash Length 字段定义了 Next Hashed Owner Name 字段的长度, 取值范围从 1 到 255 个八位字节。

3.1.7. Next Hashed Owner Name (下一个哈希所有者名称)

Next Hashed Owner Name 字段包含哈希顺序中的下一个哈希所有者名称。此值为二进制格式。给定所有哈希所有者名称的有序集合, Next Hashed Owner Name 字段包含紧跟给定 NSEC3 RR 的所有者名称之后的所有者名称的哈希。区域中最后一条 NSEC3 RR 中的 Next Hashed Owner Name 字段的值与区域中第一条 NSEC3 RR 在哈希顺序中的哈希所有者名称相同。请注意, 与 NSEC3 RR 的所有者名称不同, 此字段的值不包含附加的区域名称。

3.1.8. Type Bit Maps (类型位图)

Type Bit Maps 字段标识存在于 NSEC3 RR 的原始所有者名称处的 RRSet 类型。

3.2. NSEC3 RDATA Wire Format (NSEC3 RDATA 线路格式)

NSEC3 RR 的 RDATA 如下所示:

                     1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Hash Alg. | Flags | Iterations |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Salt Length | Salt /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Hash Length | Next Hashed Owner Name /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Type Bit Maps /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Hash Algorithm 是单个八位字节。

Flags 字段是单个八位字节, Opt-Out 标志是最低有效位, 如下所示:

 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
| |O|
+-+-+-+-+-+-+-+-+

Iterations 表示为 16 位无符号整数, 最高有效位在前。

Salt Length 表示为无符号八位字节。Salt Length 表示 Salt 字段的长度 (以八位字节为单位)。如果值为零, 则省略后续的 Salt 字段。

Salt (如果存在) 编码为二进制八位字节序列。此字段的长度由前面的 Salt Length 字段确定。

Hash Length 表示为无符号八位字节。Hash Length 表示 Next Hashed Owner Name 字段的长度 (以八位字节为单位)。

下一个哈希所有者名称不是 base32 编码的, 与 NSEC3 RR 的所有者名称不同。它是未修改的二进制哈希值。它不包括包含区域的名称。此字段的长度由前面的 Hash Length 字段确定。

3.2.1. Type Bit Maps Encoding (类型位图编码)

Type Bit Maps 字段的编码与 NSEC RR 使用的编码相同, 在 [RFC4034] 中描述。为了清晰起见, 在此处进行解释和澄清。

RR 类型空间分为 256 个窗口块 (window blocks), 每个窗口块表示 16 位 RR 类型空间的低 8 位。每个至少有一个活动 RR 类型的块使用单个八位字节窗口号 (从 0 到 255) 进行编码, 单个八位字节位图长度 (从 1 到 32) 指示用于窗口块位图的八位字节数, 以及最多 32 个八位字节 (256 位) 的位图。

块在 NSEC3 RR RDATA 中以递增的数字顺序存在。

Type Bit Maps Field = ( Window Block # | Bitmap Length | Bitmap )+

其中 "|" 表示连接。

每个位图编码窗口块内 RR 类型的低 8 位, 按网络位顺序。第一位是位 0。对于窗口块 0, 位 1 对应于 RR 类型 1 (A), 位 2 对应于 RR 类型 2 (NS), 依此类推。对于窗口块 1, 位 1 对应于 RR 类型 257, 位 2 对应于 RR 类型 258。如果位设置为 1, 则表示 NSEC3 RR 的原始所有者名称存在该类型的 RRSet。如果位设置为 0, 则表示 NSEC3 RR 的原始所有者名称不存在该类型的 RRSet。

由于窗口块 0 中的位 0 指的是不存在的 RR 类型 0, 因此必须将其设置为 0。验证后, 验证器必须忽略窗口块 0 中位 0 的值。

表示 Meta-TYPE 或 QTYPE 的位 (如 [RFC2929] 的 3.1 节中指定) 或在仅保留给 QTYPE 和 Meta-TYPE 的范围内的位必须设置为 0, 因为它们不会出现在区域数据中。如果遇到, 必须在读取时忽略。

不得包含没有类型存在的块。必须省略位图中的尾随零八位字节。每个块的位图长度由该块内数值最大的类型代码确定, 该类型代码在 NSEC3 RR 的原始所有者名称处存在的 RR 类型集合中。未指定的尾随八位字节必须解释为零八位字节。

3.3. Presentation Format (呈现格式)

RDATA 部分的呈现格式如下:

  • Hash Algorithm 字段表示为无符号十进制整数。该值最大为 255。

  • Flags 字段表示为无符号十进制整数。该值最大为 255。

  • Iterations 字段表示为无符号十进制整数。该值介于 0 和 65535 之间 (包括边界值)。

  • Salt Length 字段不表示。

  • Salt 字段表示为不区分大小写的十六进制数字序列。序列中不允许有空格。当 Salt Length 字段的值为 0 时, Salt 字段表示为 "-" (不带引号)。

  • Hash Length 字段不表示。

  • Next Hashed Owner Name 字段表示为不带填充的、不区分大小写的 base32 数字序列, 没有空格。

  • Type Bit Maps 字段表示为 RR 类型助记符序列。当助记符未知时, 必须使用 [RFC3597] 的 5 节中描述的 TYPE 表示。