跳到主要内容

附录 B. 密钥标记计算

本附录描述如何计算密钥标记(key tag)。密钥标记被用于高效选择包含给定 DNSKEY 资源记录的 DNSKEY RRset 中的记录。在 DNSKEY 资源记录的 RDATA 中的密钥标记字段是 RDATA 的无符号 16 位整数。密钥标记的值与 DNSKEY 资源记录的所有者名称(owner name)和算法(algorithm)一起用于选择 DNSKEY RR。

密钥标记 MUST 按照以下等价于 [RFC2535] 第 3.2.1 节中给出算法的伪代码计算。可以通过任何等效算法来生成相同的密钥标记值。

     ;;
;; 假设 "key" 包含 RDATA 部分的 DNSKEY 资源记录,
;; 顺序为:标志(Flags)、协议(Protocol)、算法(Algorithm)、公钥(Public Key)。
;;
;; 假设 "keytag" 是一个无符号整数。
;;
;; 该算法用于计算密钥标记,计算方法如下:
;;

Keytag = 0

IF (DNSKEY algorithm 为 RSASHA1 或 RSASHA1-NSEC3-SHA1) THEN
Keytag = 高 8 位(most significant 8 bits)的 Key 的最高有效字节

ELSE
对 Key 中的每一个八位组(octet)"i"(从 0 开始计数,按网络字节序 Network Byte Order):
若 i 为奇数,Keytag = Keytag + i 与 Key[i] 的乘积(按无符号 16 位计算)
若 i 为偶数,Keytag = Keytag + Key[i]

若 Key 的长度为奇数,则如上所述将 Keytag 与第 0 个八位组(即 Key[0])相加

Keytag = (Keytag AND 0xFFFF) + (Keytag >> 16)
Keytag = (Keytag AND 0xFFFF) + (Keytag >> 16)
Keytag = Keytag AND 0xFFFF

END IF

在上述伪代码中,只有当 DNSKEY 算法为 RSASHA1 或 RSASHA1-NSEC3-SHA1 时才是例外情况;对于这些算法,密钥标记 MUST 设置为密钥(公钥材料)中最高有效八位组的值。这种例外情况提高了此类算法密钥标记的分布质量。

注意:由于计算是在无符号 16 位整数上进行的,因此上述任何加法都可能发生回绕(wrap around)。实现 MUST 在计算过程中以无符号 16 位整数模运算(modulo 2^16)处理加法溢出,如伪代码所示。

B.1. 计算示例​

作为参考,下面给出一个具体的密钥标记计算示例。考虑以下 DNSKEY 资源记录(以区域文件表示法给出):

example.com. 3600 IN DNSKEY 257 3 5 (
AwEAAc……(此处省略完整密钥材料)
) ; key id = 12345

针对该记录的完整 RDATA(标志=257、协议=3、算法=5 以及随后的公钥八位组),应用上述算法得到的密钥标记为 12345。该值应与工具(如 dnssec-keygen)所报告的 key id 一致。

说明:本示例为演示密钥标记算法的结构而给出。实际部署中应使用标准 DNSSEC 工具生成并校验密钥标记值。


相关章节导航: