审计日志的价值在于不可抵赖:被改过的日志比没有日志更危险——纠纷的追溯、内部的追责都建立在「日志没被动过」的信任上。哈希链让每一笔日志咬住上一笔,篡改任何一处都会让链条断裂现形。
---哈希链:每笔日志咬住上一笔
AuditChain.lastHash = AuditChain.lastHash or "GENESIS"
function AuditChain.append(entry)
local payload = table.concat({
tostring(entry.at), entry.operator,
entry.action, entry.uid,
}, "|")
-- 新哈希 = 哈希(上笔哈希 + 本笔内容)
local h = Cipher.hash(AuditChain.lastHash .. payload)
entry.hash = h
entry.prev = AuditChain.lastHash
AuditChain.lastHash = h
AuditChain.buffer[#AuditChain.buffer + 1] = entry
return h
end
---链条的验证:逐笔回放比对
function AuditChain.verify(entries)
local prev = "GENESIS"
for _, e in ipairs(entries) do
local payload = table.concat({
tostring(e.at), e.operator,
e.action, e.uid,
}, "|")
if Cipher.hash(prev .. payload) ~= e.hash
or e.prev ~= prev then
return false, e -- 断裂点即被篡改的条目
end
prev = e.hash
end
return true
end
哈希链的原理:每笔日志的哈希包含上一笔的哈希——改动任何一笔的内容,该笔的哈希变化会让后续全部的对不上,篡改的位置与范围在链条的断裂点暴露。验证的回放从创世块开始逐笔比对,链条的完整性可被任何一方独立验证。哈希的算法选择安全的单向函数,碰撞的可行性在工程上忽略。
---链条的锚点:每小时固化到异地
setontimerex(114, 3600)
function AuditChain.anchor()
local h = AuditChain.lastHash
-- 异地存储当前的链尾哈希
RemoteAnchor.store(h, os.time())
end
---锚点的校验:本地链与异地锚点比对
function AuditChain.verifyAnchor()
local localHash = AuditChain.lastHash
local remote = RemoteAnchor.latest()
if remote.hash ~= localHash then
Ops.alert("日志链异常:本地与异地锚点不符")
return false
end
return true
end
哈希链的本体在本地可以被整段替换,防篡改的锚点放在异地:每小时的链尾哈希固化到异地的存储,本地的链条与异地的锚点比对——整段伪造的日志对不上异地的锚点,篡改的成本被抬到不可行。锚点的存储与日志的存储物理分离:不同的权限、不同的机房,攻破一处动不了另一处。锚点的校验每天自动跑一次,链条的断裂当天发现而不是等到纠纷的当天。日志的访问与哈希链的验证权限分离:能查日志的人不能动锚点,能管锚点的人查不了明文——权限的分立让自我的审计成为可能。
链条的完整性每日自动校验,断裂的告警按最高级别处理;锚点的写入成功率监控,锚点的断档期即为可信度的折扣期。
哈希的输入曾经漏了时刻字段,同一操作的两笔日志哈希相同,链的语义受损,全字段的输入修复。锚点的存储曾经与日志同库,一锅端的风险让锚点形同虚设,异地的分立是底线。验证的回放曾经从最新的锚点开始,中间的篡改被绕过,验证必须从创世块全链回放。
审计的写入与哈希链绑定,未入链的日志视为无效。异地的锚点与备份策略分层:锚点的小时级、备份的日级。链的验证报告进月度的合规检查,完整性是审计的生命。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 强化连败七次是什么体验?幸运值机制给失败的玩家一个隐性的承诺:每次失败累加幸运值,幸运值越高下一次的成功…
实战应用:用在哪里 被偷袭死掉的怨气需要一个出口:仇人系统记录对自己下过杀手的人,仇人的位置在列表里可见,复仇的机制让恩怨有…
实战应用:用在哪里 拍卖行的出价是一场与时间的博弈:出价的按钮、倒计时的紧迫、截拍瞬间的悬念——拍卖界面的要点是出价的流程、…
实战应用:用在哪里 面对面的交易是传奇最经典的交互:两人面对面、各自放入物品与金币、双方确认后成交。交易的协议要点是会话的建…
实战应用:用在哪里 活动结束给 3 万玩家发奖励:一次性群发让邮件表瞬间多 3 万行、投递的队列堵塞正常的通信。批量邮件的分…
实战应用:用在哪里 审计日志的价值在于不可抵赖:被改过的日志比没有日志更危险——纠纷的追溯、内部的追责都建立在「日志没被动过…