BARGHEST-ngo/Evtree

GitHub: BARGHEST-ngo/Evtree

Evtree 是一个用于法医证据完整性保护的 Go 库,通过 Merkle 树与可信时间戳解决证据篡改与链-of- custody 审计难题。

Stars: 1 | Forks: 0

# Evtree Evtree(Evidence Tree)是一个用于法医证据完整性的 Go 库,提供基于 Merkle 树的完整性验证器、事件链记录、RFC 3161 可信时间戳、结构化审计跟踪以及防篡改密封功能。 在核心层面,该库计算一组文件的确定性、与目录相关的 Merkle 树哈希。给定一个文件条目列表,每个条目由相对路径、字节大小、SHA-256 摘要和修改时间描述,库会从文件路径重建目录层次结构,并递归地对每个目录节点进行哈希。叶子节点通过将域分离字节(0x00)前置到文件元数据的规范字符串表示,然后计算 SHA-256 摘要来构造。内部目录节点通过按名称对子节点进行字典序排序、连接子节点哈希并使用不同的域分离字节(0x01)进行哈希来计算。该结构确保最终根哈希对文件内容以及文件树的分层组织都敏感,并且无论文件条目以何种顺序提供,结果都是完全确定的。 在采集过程中,库将文件条目收集到一个带签名的证据采集记录中,同时包含案件元数据——包括案件编号、物证引用、鉴定人身份、设备标识符和组织详细信息——提供证据获取情境的记录化描述。无法在采集期间读取的文件(无论由于访问限制还是设备错误)都会被记录为证据错误,包含时间戳和失败原因,而不是导致采集中止。这确保了部分采集被记录而非静默丢弃,在处理被扣押设备上被锁定或受保护的文件时至关重要。 一旦生成证据采集,库支持 RFC 3161 可信时间戳。根哈希被提交给可信时间戳权威机构(TSA),后者返回一个绑定哈希到特定时间点的密码学签名令牌。该令牌被存储在采集记录中,并可在任何阶段通过重新计算根哈希并与令牌中嵌入的哈希进行比较来验证。因为令牌由独立第三方签名,它直接解决了依赖系统时钟(可被操纵)的弱点,将采集锚定在一个外部可验证的时间源上。 这对于维护数字取证调查中的事件链尤为重要。当从设备获取证据时,任何后续处理、传输或存储都会引入偶然或故意修改的可能性。在采集时刻计算的单根哈希充当整个证据集合的加密封印。在后续任何阶段,无论是分析、同行评审还是法庭呈现,都可以从手头的文件重新计算相同的哈希并与原始值进行比较。如果任何文件的单个字节发生变化,或者文件被添加、删除或移动到不同目录,根哈希将不同,立即揭示证据已被篡改。因为树结构镜像了目录层次结构,还可以隔离受影响的层次分支,而无需重新哈希整个集合,精确识别在两次采集之间被添加、删除或修改的文件。这提供了防篡改检测机制以及审计证据完整性的高效手段。 该库主要用于 [MESH](https://github.com/BARGHEST-ngo/MESH),其中通过 [androidqf](https://github.com/mvt-project/androidqf) 提供对获取的法医工件的防篡改完整性验证。 本工作受 [ECo-Bag: An elastic container based on merkle tree as a universal digital evidence acquisition](https://www.sciencedirect.com/science/article/abs/pii/S2666281724000404) 启发。感谢作者及韩国大学。 ## 安装 ``` go get github.com/BARGHEST-ngo/Evtree ``` ## 参考 ### 采集 | 函数 | 描述 | |---|---| | `Acquire(root string, meta CaseMetadata) (Acquisition, []EvidenceError, error)` | 遍历目录并生成证据采集 | | `AcquireDir(root string) ([]FileEntry, []EvidenceError, error)` | 遍历目录并返回原始文件条目 | | `MerkleFromDir(root string) (Hash32, error)` | 计算目录的根 Merkle 哈希 | ### 完整性 | 函数 | 描述 | |---|---| | `Compare(comp1, comp2 Acquisition) ([]Added, []Deleted, []Modified, error)` | 比较两次采集并返回变更 | | `Verify(root string, meta CaseMetadata, comp1 string) (Result, []EvidenceError, error)` | 重新采集实时目录并与保存的采集在一次调用中比较 | | `Timestamp(acquisition *Acquisition, tsaURL string) error` | 向 TSA 请求 RFC 3161 时间戳并将其存储在采集中 | | `VerifyTimestamp(acquisition Acquisition) error` | 验证存储的 RFC 3161 时间戳令牌与采集根哈希 | ### 存储 | 函数 | 描述 | |---|---| | `(Acquisition) Save(filename string) error` | 将采集序列化为 JSON | | `LoadAcquisition(path string) (Acquisition, error)` | 从 JSON 加载采集 | | `Seal(acquisition Acquisition, evidenceDir string, recipient age.Recipient, outPath string) error` | 将证据目录加密为防篡改的 age 加密 ZIP 归档,并在其中写入采集清单作为分离的 JSON 文件 | | `Unseal(sealedPath string, identity age.Identity, outDir string) (Acquisition, error)` | 解密密封归档并提取其内容,返回采集清单 | ## 待办事项 - 审计跟踪 API — 可追加的记录采集、传输、比较和验证事件的结构化日志 - 数字签名 — 使用鉴定人的私钥对根哈希进行签名以实现不可否认性 ## 用法 ``` meta := evtree.CaseMetadata{ CaseNumber: "2024-001", ExhibitRef: "EX-01", Examiner: "J. Smith", Organisation: "Digital Forensics Lab", DeviceModel: "Pixel 7", } // Acquire evidence at time of seizure acquisition, errs, err := evtree.Acquire("/path/to/evidence", meta) if err != nil { log.Fatal(err) } if len(errs) > 0 { // handle files that could not be read } // Anchor to a trusted timestamp if err := evtree.Timestamp(&acquisition, evtree.DefaultTSA); err != nil { log.Fatal(err) } // Save to disk if err := acquisition.Save("evidence.json"); err != nil { log.Fatal(err) } // Later: reload, verify timestamp, and compare against a re-acquired directory acquisition1, err := evtree.LoadAcquisition("evidence.json") if err != nil { log.Fatal(err) } if err := evtree.VerifyTimestamp(acquisition1); err != nil { log.Fatal(err) } acquisition2, _, err := evtree.Acquire("/path/to/evidence", meta) if err != nil { log.Fatal(err) } added, deleted, modified, err := evtree.Compare(acquisition1, acquisition2) if err != nil { log.Fatal(err) } fmt.Printf("Added: %d Deleted: %d Modified: %d\n", len(added), len(deleted), len(modified)) ```
标签:EVTX分析, Golang库, Go语言, Merkle树, RFC 3161, Zenmap, 取证, 取证工具, 哈希树, 域分离字节, 安全存储, 审计追踪, 密封证据, 排序哈希, 操作系统检测, 数字取证, 数据完整性, 文件哈希, 日志审计, 时间戳, 案例编号, 检查员身份, 目录感知, 目录树哈希, 确定性哈希, 程序破解, 自动化脚本, 设备标识符, 证据完整性, 证据获取, 部分采集, 链式保管, 错误记录, 防篡改, 验证完整性