Hash 验证NSEC3记录

Hash 验证NSEC3记录,hash,dns,dnssec,Hash,Dns,Dnssec,我正在摆弄DNSSEC,我想尝试验证由DNSSEC signzone从bind9 utils生成的NSEC3记录(我认为这些记录是有效的)。这是我的区域文件: $ORIGIN dnssectest.mvolfik.tk. $TTL 120 @ SOA dnssectestns.mvolfik.tk. email.example.com. 15 259200 3600 300000 3600 A 192.168.0.101 s3c A 192.168.0.101 $INCLU

我正在摆弄DNSSEC,我想尝试验证由
DNSSEC signzone
bind9 utils
生成的NSEC3记录(我认为这些记录是有效的)。这是我的区域文件:

$ORIGIN dnssectest.mvolfik.tk.
$TTL 120
@   SOA dnssectestns.mvolfik.tk. email.example.com. 15 259200 3600 300000 3600
    A   192.168.0.101
s3c A   192.168.0.101

$INCLUDE zsk.key
$INCLUDE ksk.key
ZSK和KSK是通过
dnssec keygen-a ECDSAP256SHA256 dnssectest.mvolfik.tk.
生成的(分别添加
-f KSK

然后,我使用命令
dnssec signzone-3 deadbeef-h5-o dnssectest.mvolfik.tk-k ksk.key zonefile zsk.key
(将NSEC3与
deadbeef
hex salt一起使用,重复5次)

我在
分区文件中得到了以下NSEC3记录。已签名
:(省略了RRSIG和DNSKEY,认为它们不相关;A和SOA没有改变)

现在我知道这个区域中唯一的域是
s3c.dnssectest.mvolfik.tk.
dnssectest.mvolfik.tk.
,我假设下面的Python脚本将获得与上面签名区域文件中相同的哈希值:(来自中的伪代码)

导入hashlib
def ih(盐、x、k):
如果k==0:
返回hashlib.sha1(x+salt.digest())
返回hashlib.sha1(ih(salt,x,k-1)+salt).digest()
打印(ih(bytes.fromhex(“死牛肉”),b“s3c.dnssectest.mvolfik.tk.”,5.hex())
打印(ih(bytes.fromhex(“死牛肉”),b“dnssectest.mvolfik.tk.”,5.hex())

然而,我得到了
b5837498347ba833ab33f15332829a589a80d82
545e01397a776ee73aa0372aea015408cc384574
。我做错了什么?

所以我查看了
dnspython
源代码,找到了函数。结果表明,名称必须是有线格式(意味着删除点,而不是在标签前面加长度字节-
\x03s3c\x10dnssectest\x07mvolfik\x02tk\x00
等,最后加空字节)。结果用base32(0-9A-V)编码,而不是十六进制。使用dnspython库可能更简单,但下面是完整(有点幼稚)的代码:

导入hashlib,base64 b32_trans=str.maketrans( “ABCDEFGHIJKLMNOPQRSTUVXYZ234567”、“0123456789ABCDEFGHIJKLMNOPQRSTUV” ) def ih(盐、x、k): 如果k==0: 返回hashlib.sha1(x+salt.digest()) 返回hashlib.sha1(ih(salt,x,k-1)+salt).digest() def nsec3(盐、名称、k): 如果不是name.endswith(“.”),则: 名称+=” 标签=名称。拆分(“.”) 名称\u wire=b“”。连接(len(l).到\u字节(1,“大”)+l.lower().encode()表示标签中的l) digest=ih(字节数.fromhex(salt),名称\u wire,k) 返回base64.b32encode(摘要).decode().translate(b32_trans) 打印(nsec3(“死牛肉”、“dnssectest.mvolfik.tk.”,5)) 打印(nsec3(“死牛肉”,“s3c.dnssectest.mvolfik.tk.”,5))
这将获得在NSEC3记录中看到的正确哈希值

            0   NSEC3PARAM 1 0 5 DEADBEEF
F66KKS17FM851AVA4EARFHS55I3TOO85.dnssectest.mvolfik.tk. 3600 IN NSEC3 1 0 5 DEADBEEF (
                    D60TA5J5RS4JD5AQK25B1BCUAHGP4DHC
                    A SOA RRSIG DNSKEY NSEC3PARAM )
D60TA5J5RS4JD5AQK25B1BCUAHGP4DHC.dnssectest.mvolfik.tk. 3600 IN NSEC3 1 0 5 DEADBEEF (
                    F66KKS17FM851AVA4EARFHS55I3TOO85
                    A RRSIG )