hexforge / guides / timestamps

GUIDE 07 / FORENSICS

时间戳与日志还原

秒、毫秒和时区是最常见的三个坑。先保留原值,再统一到 UTC,最后按需要显示本地时间。

先判断单位

Unix 时间戳通常表示从 1970-01-01 00:00:00 UTC 起经过的时间。当前年代的秒级值通常约 10 位,毫秒级值约 13 位,微秒级值约 16 位,但位数只是初筛。

示例可能单位解释
17000000002023-11-14 22:13:20 UTC
1700000000000毫秒同一时刻的毫秒表示
1700000000000000微秒部分数据库与日志使用

若转换后落在 1970 年附近或远超题目年代,首先检查单位,而不是认为日志损坏。

UTC 与本地时间要同时保留

Unix 数值本身不带时区,但可读日期可能带。分析时建议把所有事件转换成 UTC,并另外记录原日志时区。仅写“09:30”没有意义,应写成包含日期和偏移的形式,例如 2026-09-18T09:30:00+08:00

不同来源的时间语义

  • Web 访问日志可能记录服务器时区或明确偏移。
  • JWT 的 iatnbfexp 通常使用 Unix 秒。
  • JavaScript Date.now() 返回毫秒。
  • 文件系统时间可能受文件系统精度、复制行为和时钟偏差影响。
  • 抓包时间取决于采集设备时钟,可能与服务器日志不同步。

构建事件时间线

为每条证据保留“原值、解析规则、UTC、来源、可信度”。不要只复制转换后的可读时间,因为日后无法检查单位是否选错。

source: access.log
raw:    1700000000
rule:   Unix seconds
utc:    2023-11-14T22:13:20Z
note:   server clock may be +4s
注意时钟偏差

如果多个来源始终相差固定秒数,可能是设备时钟不同步。先估计偏差,再判断事件先后,不要强行修改原始记录。

常见错误

  • 把 13 位毫秒值按秒转换。
  • 比较没有时区的日期字符串。
  • 把文件“修改时间”直接当作行为发生时间。
  • 四舍五入后丢失同一秒内的事件顺序。
  • 根据当前电脑时区显示结果,却未在报告中说明。

推荐流程

  1. 保留原始数值和日志行。
  2. 根据位数与上下文提出单位假设。
  3. 转换后检查日期是否合理。
  4. 统一成 ISO 8601 UTC。
  5. 记录来源时区和可能的时钟偏差。
  6. 再按时间排序并关联事件。