[P1/高] AuditService computeHash 使用 JSON.stringify,对象 key 顺序不稳定导致 hash 不一致 #36

Open
opened 2026-07-21 21:56:01 +08:00 by thzxx · 0 comments
Owner

问题类型

缺陷 / 高 / 后端服务

文件位置

electron/services/audit.service.ts

问题描述

AuditService.computeHash 用于去重:

const hash = crypto.createHash('sha256').update(JSON.stringify(obj)).digest('hex');

JSON.stringify 对对象 key 顺序敏感:

  • {a: 1, b: 2} -> {"a":1,"b":2}
  • {b: 2, a: 1} -> {"b":2,"a":1}

相同语义的对象因 key 顺序不同产生不同 hash,去重失败。

影响

  • 重复审计日志被记录
  • 日志库膨胀
  • 去重失效

建议修复

function stableStringify(obj: unknown): string {
  if (obj === null || typeof obj !== 'object') return JSON.stringify(obj);
  if (Array.isArray(obj)) {
    return '[' + obj.map(stableStringify).join(',') + ']';
  }
  const keys = Object.keys(obj).sort();
  return '{' + keys.map(k => JSON.stringify(k) + ':' + stableStringify(obj[k])).join(',') + '}';
}

const hash = crypto.createHash('sha256').update(stableStringify(obj)).digest('hex');

或使用 fast-json-stable-stringify 库(符合开发规范"优先使用第三方成熟库")。

## 问题类型 缺陷 / 高 / 后端服务 ## 文件位置 `electron/services/audit.service.ts` ## 问题描述 AuditService.computeHash 用于去重: ```ts const hash = crypto.createHash('sha256').update(JSON.stringify(obj)).digest('hex'); ``` 但 `JSON.stringify` 对对象 key 顺序敏感: - `{a: 1, b: 2}` -> `{"a":1,"b":2}` - `{b: 2, a: 1}` -> `{"b":2,"a":1}` 相同语义的对象因 key 顺序不同产生不同 hash,去重失败。 ## 影响 - 重复审计日志被记录 - 日志库膨胀 - 去重失效 ## 建议修复 ```ts function stableStringify(obj: unknown): string { if (obj === null || typeof obj !== 'object') return JSON.stringify(obj); if (Array.isArray(obj)) { return '[' + obj.map(stableStringify).join(',') + ']'; } const keys = Object.keys(obj).sort(); return '{' + keys.map(k => JSON.stringify(k) + ':' + stableStringify(obj[k])).join(',') + '}'; } const hash = crypto.createHash('sha256').update(stableStringify(obj)).digest('hex'); ``` 或使用 fast-json-stable-stringify 库(符合开发规范"优先使用第三方成熟库")。
thzxx added the ??????? labels 2026-07-21 21:56:01 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MetonaTeam/metona-ai-desktop#36