你信得过手头那套日志系统吗?就算你是管理员,也没人敢拍胸脯说日志绝对没被动过。一个在学习Go语言的开发者,偏偏不信“我们有审计、有权限控制”这套说辞,直接用哈希链造了一条可验证的防篡改日志——任何人,包括管理员,只要事后改动一条记录,整条链立刻断裂,根本没有悄无声息篡改的可能。
他把项目拆成了几个最简模块,核心思想一句话就能说透:每条日志都包含前一条的哈希值。有人改掉某条记录,哪怕直接把存储文件里的字节换了,后续所有哈希值都会对不上。验证的时候根本不用“信任”系统,自己算一遍就行。
清单方式梳理如下:
1. 数据模型,穷到只剩八个字段
一个叫 AuditorEntry 的结构体,就八项—— ID、时间戳、操作人、动作、文档名、文档哈希、前一条哈希、本条哈希。没有花活,PreviousHash 就是那条把记录串成链的单向指针。
2. 哈希计算,不带自己玩
算本条哈希前,先把 EntryHash 字段置空。不然就等于试图哈希一个依赖自身结果的值,死循环。清空后序列化剩余字段,过一道 SHA-256,得到的才是可复现的哈希。新条目的 PreviousHash 直接填上一条的 EntryHash,一条单向链表就此成型。
3. 验证,就是重新算一遍
验证函数从头到尾遍历日志,对每条记录重新执行哈希计算,对比存储的 EntryHash。同时检查 PreviousHash 是否等于前一条的 EntryHash,首条则必须匹配预置的创世哈希。但凡有人改动过条目2的文档,就算把条目2的 EntryHash 改得和重新计算的哈希一致,条目3的 PreviousHash 依然指向旧值——破裂不可逆,除非把下游全重写一遍。
4. 管理员也绕不开的枷锁
哪怕你是运维,有最高权限直接编辑物理文件,也没用。修补一个哈希就得修补后面所有,而“一次性完美重写整条链且不被后续验证发现”的可能性基本不存在。你不需要信任何人,代码跑完就是证据。
5. 看似玩具,实则早已遍地开花
这种哈希链记录模式,就是 Amazon QLDB 内部账本、证书透明度日志、乃至 git 的提交链共同采用的原语。真正有用的场景根本不需要拿“区块链”包装,比如医疗记录事后是否被改动、合同电子证据的时间线是否完整,拉一条哈希链做验证,便宜且直接。作者还放出了在线演示页面,让你亲手改一条字段,看验证标记从绿色锁死变成红色,直观感受什么叫“链条断裂”。
热门跟贴