您能使用 OpenSSL 在文件目录上生成 md5 或 sha 哈希吗?

您能使用 OpenSSL 在文件目录上生成 md5 或 sha 哈希吗?

我对在两个存档的目录副本之间存储文件/目录完整性指标感兴趣。大约有 1TB 的数据以递归方式存储在硬盘上。有没有办法使用 OpenSSL 为所有文件生成一个哈希值,用于比较两个数据副本,或者在以后验证数据是否发生变化?

答案1

您可以递归生成所有哈希值,将哈希值连接成一个文件,然后生成该文件的哈希值。

答案2

您不能对它们全部进行累积哈希处理以生成单个哈希,但您可以先压缩它们然后计算哈希值:

$tar -czpf archive1.tar.gz folder1/
$tar -czpf archive2.tar.gz folder2/
$openssl md5 archive1.tar.gz archive2.tar.gz

递归地散列每个文件:

$find . -type f -exec openssl md5 {} +

答案3

除非所有元数据(创建日期等)都相同,否则对 tar 执行 md5 校验永远不会起作用,因为 tar 将其存储为其存档的一部分。

我可能会对所有文件的内容进行 md5 求和:

find folder1 -type f | sort | tr '\n' '\0' | xargs -0 cat | openssl md5
find folder2 -type f | sort | tr '\n' '\0' | xargs -0 cat | openssl md5

答案4

最好为每个文件列出一个哈希值,然后检查每个哈希值。如果您对所有文件进行哈希处理,而其中一个文件损坏了,那么您将不知道哪个文件损坏了。但是,如果您为每个文件列出哈希值,脚本可以告诉您何时任何哈希值不匹配(这将告诉您文件已损坏或更改)。

此外,递归散列find比管道更简单:

find . -type f -print0 | xargs -0 openssl dgst -sha256 -r >> hashes.sha256

您需要通过 附加输出>>,因为 xargs 将调用openssl多次,但只在需要的时候处理所有文件(例如,不是每个文件一次调用)。-r用于 coreutils 哈希文件语法。您不想使用 OpenSSL 的-outxargs因为它会在每次调用时覆盖文件。此外,您可能希望捕获 STDERR,以防 OpenSSL 无法读取/打开某些文件:2>> error.log

如果存储不是瓶颈,那么您可以使用参数-P n并行xargs运行多个 OpenSSL 进程(不推荐用于硬盘)。

注意:GNU coreutils(md5sum 等)使用 OpenSSL 作为哈希库。但是,如果您的核心实用程序非常过时,您可能仍想使用 OpenSSL:对硬件的支持SHA-哈希加速是最近才添加到 OpenSSL 中的。SHA1/SHA256 在没有加速的情况下可以比 MD5 更快,而且在有加速的情况下绝对可以达到千兆位/秒的范围。

相关内容