分布式 ID 会泄露业务规模吗?
简化版
会。连续自增、号段和可解码 Snowflake 可能暴露创建时间、节点/地域、增长速度与大致业务量,并让攻击者枚举相邻资源。 内部仍可使用高性能 ID,但外部接口应使用随机不可猜标识或受控映射,同时坚持资源级鉴权、限流和审计;“ID 难猜”不能替代授权。
详细版
攻击者可从 Snowflake 的时间位估算生成时间,从 WorkerId/RegionId 推测生成来源;若能持续采集同一业务的多个 ID,还可结合时间窗口、活跃 worker 和序列占用观察业务趋势。不能把两个 Snowflake ID 直接相减当成订单数,因为时间、worker 和序列位会造成巨大空档;自增 ID 才更容易通过最大值或差值估算总量。即使不存在直接越权,规模趋势和拓扑信息也可能属于商业敏感数据。
对外可使用 UUIDv4/随机 128 位 token,或将内部 bigint 映射为独立 public_id;不建议只做固定可逆 Base62,因为仍能被枚举或还原。所有查询仍检查 resource.owner == caller,并对连续 404、扫描速率和跨租户访问告警。
完整版教学
一、ID 会泄露哪些信息
顺序号暴露相对创建次序与大致总量;时间型 ID 暴露精确或近似创建时间;worker/region 位暴露生成来源;业务前缀暴露渠道和类型。这些字段组合起来,可帮助竞品估算订单、帮助攻击者定位新资源。
记忆钩子:唯一 ID 不是秘密,但它的结构可能是一条免费的业务数据接口。
二、用 Snowflake 做一个推演
假设已知 epoch 和位布局,ID 右移 22 位即可取出毫秒时间差。攻击者可以从样本直接恢复近似生成时间和 worker;若一分钟内持续拿到大量同业务样本,还能观察活跃 worker、序列密度与增长趋势。不过,两个 ID 的数值差主要包含时间字段推进,不能直接换算成这一分钟的订单量。
timestamp = (id >> 22) + customEpoch
worker = (id >> 12) & 0x3ff
sequence = id & 0xfff
这些结构信息不等于真实订单数,因为还存在采样偏差、多个业务共用生成器和序列空洞,但仍可能暴露敏感时间、拓扑与趋势。
三、可枚举 ID 如何放大越权漏洞
接口 /orders/10001 若只校验登录、不校验订单归属,攻击者遍历 10002、10003 就能读取他人数据。随机 ID 会提高猜测成本,但授权缺陷仍然存在;一旦 ID 从日志、链接或分享中泄露,随机性也救不了。
| 防线 | 作用 | 能否替代鉴权 |
|---|---|---|
| 随机 public_id | 防批量猜测 | 否 |
| owner/tenant 校验 | 阻止越权 | 是核心防线 |
| 限流/WAF | 降低扫描速度 | 否 |
| 审计告警 | 发现攻击 | 否 |
四、内外 ID 分离
数据库内部用 64 位有序 ID 保持索引效率,外部增加 128 位随机 public_id 唯一索引。API、URL 和事件对不可信参与方只暴露 public_id,内部服务按授权映射到主键。映射字段一旦对外发布应稳定,不能每次请求随机变化。
随机空间要足够大并使用安全随机源。短 6 位码只有约百万空间,不适合大量资源的长期公开标识。
五、编码与加密的边界
Base62 只是表示方式,不隐藏数值;简单异或或固定置换可被样本推断。需要可逆隐藏时使用经过评审的格式保持加密/带密钥映射,但密钥轮换、碰撞和排序需求会增加复杂度。多数场景直接存随机 public_id 更清晰。
不要在客户端暴露 Snowflake epoch 与布局后再声称“别人看不懂”。安全设计应假设算法公开。
六、检测和响应
监控单主体请求不同 ID 数、连续 404/403、递增访问模式、跨租户命中和导出量。响应中 403 与 404 的取舍可减少资源存在性泄露,但日志内部仍要保留真实原因。客服和分享链接要避免把内部 ID 扩散到第三方分析平台。
若 ID 结构已经暴露,不能靠改 epoch 立即修复历史链接。应补授权、限流和 public_id,逐步迁移 API,并评估历史规模信息泄露。
七、常见误区与追问
- 误区:Base62 后别人就看不出自增。 编码可逆,模式仍可能被推断。
- 误区:UUID 随机所以无需资源鉴权。 ID 泄露后仍会越权。
- 误区:Snowflake 只泄露时间,不泄露规模。 多点采样可估算增长趋势与 worker 分布。
- 误区:修改自定义 epoch 就足够保密。 可通过已知创建时间样本反推。
- 追问:随机 public_id 会影响数据库性能吗? 不用作聚簇主键,只建必要唯一二级索引可控制代价。
- 追问:对外需要短码怎么办? 限定有效期/作用域、足够熵、速率限制并做碰撞处理。
- 追问:返回 404 还是 403? 对不应知晓资源存在性的调用统一 404,内部审计记录授权失败。
八、加强记忆
ID 安全要分“结构泄露、资源枚举、授权缺失”三层处理。内外 ID 分离降低结构和扫描风险,随机 public_id 提高猜测成本,资源级鉴权才阻止越权,限流与审计负责发现滥用。不要把编码、随机性或算法保密当作权限系统。