如何创建tarball,使其md5或sha512哈希具有确定性?
我目前正在通过运行tar --exclude-vcs --create --verbose --dereference --gzip --file mycode.tgz *
创建一个源代码文件目录的tarball,我想记录它的哈希,这样我就可以将它用作指纹,以便在未来检测更改。
然而,我注意到,如果我在不更改任何文件的情况下创建重复的tarball,那么在每个归档文件上运行Python hashlib.sha512(open('mycode.tgz').read()).hexdigest()
会返回不同的散列。
这是因为tar的压缩算法不是确定性的吗?如果是这样的话,我该如何高效地归档大量文件,以便计算一致的哈希来检测更改?
可能会生成一个生成确定性哈希的tar版本,但大多数需要一致的tar哈希的打包系统都使用原始tar之类的东西,而不是这样做。不幸的是,原始焦油对您的用例没有帮助。
然而,Git版本控制系统非常擅长生成目录树的一致散列(sha-1而不是sha-512)。
git add .
git write-tree
将打印一个一致的哈希,除非发生更改。将跟踪文件内容和模式更改。
找到这个问题后,我意识到我的档案实际上几乎完全相同,除了前几个字节包含时间戳。将我的代码更改为hashlib.sha512(open(fn).read()[8:]).hexdigest()
以去掉前几个字符解决了问题。
Gnu-tar可以设置一致哈希的时间戳。
tar --sort=name --owner=root:0 --group=root:0 --mtime='UTC 2019-01-01' ...
学分:https://stackoverflow.com/a/54908072
shell glob可能会在将文件添加到归档文件时打乱文件的顺序。也许可以尝试用以下内容指定确切的订单:
find . | sort | tar -T - --exclude-vcs --create --verbose --dereference --gzip --file mycode.tgz