2 个不稳定版本
0.5.0 | 2024年3月6日 |
---|---|
0.4.0 | 2021年5月14日 |
#17 在 #file-storage
82KB
1.5K SLoC
hashdeep-compare
hashdeep-compare 是一个用于比较 Hashdeep 文件存储审计工具生成的日志文件的比较工具。
为什么使用 hashdeep-compare?Hashdeep 不够吗?
Hashdeep 可以为存储卷或目录中的每个文件生成哈希摘要报告,适合用于取证记录、比特衰减检测或确认将更改提交到备份之前目录和文件的变化。可以将多个 Hashdeep 输出日志保存下来,形成存储卷状态的记录。Hashdeep 支持将日志文件与实时存储卷进行比较,但不支持日志文件之间的比较。hashdeep-compare 就是为此而创建的。
通过保存日志文件并使用 hashdeep-compare,可以在不考虑当前可用性的情况下比较存储卷的内容。这允许对历史 hashdeep 日志进行回顾性分析,以比较不同时间点的文件和目录状态,支持新的用例,例如:确定文件被移动的时间,或确认某个修改或损坏的文件在特定日期是否仍然完整。
如果您担心文件归档比特衰减,或者只想比较重要目录的归档记录内容,使用 Hashdeep 和 hashdeep-compare 可能是一个方便的解决方案。
如何使用 hashdeep-compare
hashdeep-compare 是一个具有四个功能的命令行工具
-
hash
:调用 hashdeep 并生成与 hashdeep-compare 兼容的日志文件。hashdeep-compare hash path/to/target_dir path/to/output_log.txt
此功能是可选的,但建议使用以确保日志兼容性。上述函数调用等同于直接调用
hashdeep -l -r -o f path/to/target_dir > path/to/output_log.txt 2> path/to/output_log.txt.errors
。请注意,如果输出文件或错误文件已存在,则命令将被终止(hashdeep-compare 不会覆盖现有文件)。 -
sort
:按文件路径对 hashdeep 日志中的条目进行排序。hashdeep-compare sort path/to/未排序的输入.文本路径/to/排序后的输出.txt
hashdeep不保证日志条目的排序,实际上在运行之间排序往往不一致。排序允许使用文本比较工具比较hashdeep日志,这可能是比较具有简单差异日志的最简单方法。请注意,如果输出文件已存在,则命令将被中止(hashdeep-compare不会覆盖现有文件)。
-
root
:通过从其文件路径中删除前缀来更改hashdeep日志根。任何不以该前缀开始的文件路径条目都将被省略在输出之外。hashdeep-比较根路径/to/输入.文本路径/to/输出.txt文件路径/前缀/
这个子命令是一种简单的从hashdeep运行中恢复的方法,因为它在调用目录上无意中在所有文件路径前添加了父目录。
警告:前缀作为简单的文本应用,不涉及任何与路径相关的规则。如果使用前缀"test"在文件路径"testdir/file.txt"上,则生成的文件路径将是"dir/file.txt"。这样分割路径组件的文本可能不是您想要的,但可能会有一些巧妙的用途。
请注意,如果输出文件已存在,则命令将被中止(hashdeep-compare不会覆盖现有文件)。
-
part
:hashdeep-compare的真实力量:所有条目都将被分成集合,这些集合有效地描述了两个日志文件的相似性和差异性。hashdeep-比较部分路径/to/第一日志.文本路径/to/第二日志.文本路径/to/输出文件基本路径
输出文件基本路径将被用于通过添加描述日志条目后缀来命名输出文件;它可能包括子目录。不会创建不存在的子目录;如果指定了子目录,则命令将被中止。请注意,如果任何生成的输出文件已存在,则命令将被中止(hashdeep-compare不会覆盖现有文件)。
分区算法
使用推荐设置调用时,Hashdeep为每个文件创建一个类似于以下单行日志条目
3364240,aff470b119f69a7ad5e6999e5e6a3346,bf4fdd9d86cf23e66b456827b5dfe6e2ae52ebc9f32c7de6623aca7b665b3337,./路径/示例文件名.扩展名
这是一个以逗号分隔的字符串,表示文件的属性:字节大小、MD5哈希、SHA256哈希和文件路径。前三项标识文件内容(使用两种不同的哈希算法来防止哈希冲突)。如果两个不同文件的条目中的这三项都相同,hashdeep-compare将确定这两个文件具有相同的内容。如果至少有一项不同,它们具有不同的内容。
定义
- 条目:Hashdeep日志中的一行,记录来自目标卷的单个文件
- 哈希:条目的文件大小、MD5和SHA256(条目行的前3部分)
- 名称:条目的文件路径(条目行的最后一部分)
- 匹配:算法匹配的选择条目
- 匹配对:来自两个输入文件中的每个文件的正好一个条目的匹配
- 匹配组:来自输入文件之一的匹配条目,但不是匹配对
hashdeep-compare分区算法比较两个输入日志中的所有文件条目,并根据匹配的哈希和/或名称组织它们。
当分区算法开始时,两个输入日志中的所有条目都将被加载到工作集中。匹配规则按固定顺序应用,当识别到匹配时,匹配的条目将从工作集中移除。当算法完成时,每个条目都将被分区到恰好一个匹配中,或被分区到一个特殊的不匹配遗留条目集中。
当输入日志1和2分别是同一文件卷的较早和较晚的记录时,这些匹配类型可以表明日志创建之间所做的文件更改类型。
匹配规则,按顺序与隐式文件更改匹配
- 完全匹配对:未更改的文件
- 完全匹配组:不应发生(重复名称表示无效的Hashdeep日志)
- 名称匹配对:已修改的文件
- 名称匹配组:不应发生(重复名称表示无效的Hashdeep日志)
- 哈希匹配对:移动/重命名的文件
- 哈希匹配组(两个日志条目):模糊的重命名/移动/复制/删除
- 哈希匹配组(仅来自日志1的条目):重复文件被删除
- 哈希匹配组(仅来自日志2的条目):重复文件被创建
匹配规则执行完毕后,剩余条目中不再存在匹配的名称或哈希。
- 不可匹配(来自日志1的条目):被删除的文件
- 不可匹配(来自日志2的条目):被创建的文件
因为每个日志条目恰好表示在一个匹配或不匹配集中,算法结果表示两个输入日志的总内容。
结果存储在每个匹配规则各自的单独文件中,以及不可匹配条目的两个文件。这些文件是通过向part
命令提供的输出文件基本参数添加以下后缀创建的:
- _full_match_pairs
- _full_match_groups_file1_only
- _full_match_groups_file2_only
- _full_match_groups_file1_and_file2
- _name_match_pairs
- _name_match_groups_file1_only
- _name_match_groups_file2_only
- _name_match_groups_file1_and_file2
- _hashes_match_pairs
- _hashes_match_groups_file1_only
- _hashes_match_groups_file2_only
- _hashes_match_groups_file1_and_file2
- _no_match_entries_file1
- _no_match_entries_file2
因为每个类别都写入自己的输出文件,您可以使用任何文本编辑器来分析结果,并快速确认任何应该为空的类别实际上确实为空(即:输出文件为空)。
补充:处理部分无效的输入日志
在读取hashdeep日志时,hashdeep-compare执行两个内容检查
- 在日志标题中:确认行数、hashdeep版本和记录的日志格式。如果这些与hashdeep-compare测试套件使用的不相同,则发出警告。这是为了警告用户,如果hashdeep的不同版本(或其他东西)可能已生成可能导致意外结果的日志文件。
- 检查每条日志条目的正确格式:hashdeep-compare会忽略格式错误的行。如果发现任何这样的行,则在警告消息中报告忽略的这些行的数量。
(注意:这些检查是为了额外的安全性。 我从未见过hashdeep生成无效行:如果您有一个这样的文件,您在依赖输出之前应该弄清楚原因。)
(更新2024.3.5:hashdeep将通过在文件名中添加新行来生成无效行。由于hashdeep输出格式的基于行的结构,可能没有优雅的方法来向hashdeep-compare添加对这些文件的支持。)
不管生成多少警告,hashdeep-compare始终会使用所有格式正确的条目来生成请求的输出。警告本身永远不会阻止hashdeep-compare成功完成。
依赖关系
~3–12MB
~141K SLoC