如何找到一个一致的tarball散列



如何创建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

最新更新