短ID混淆Sqids
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_f1b049da/shortidsqids20260717。
技能介绍
要解决的问题
当你需要把数据库里的自增主键、订单号这类数字 ID 对外分享时,直接暴露会有两类麻烦:一是可遍历,攻击者顺着 1001 到 1002 就能拉取大量记录;二是不方便,长数字拼进链接后难以记忆和传播。你需要一种能压缩长度、带轻微混淆、还能随时还原回原始 ID 的短码方案。
技能如何工作
这个技能基于 Sqids 编码库,把非负整数 ID 转换为短字符串,核心流程只有两步:
- 编码:调用
encodeId(n),内部执行sqids.encode([n]),得到一个长度不低于 6 的短码。 - 解码:调用
decodeId(code),内部执行sqids.decode(code)[0],还原回原始数字。
它内置四条硬约束,保证行为可预期:
- 只处理非负整数,输入为负数或非整数会直接失败。
minLength建议 ≥ 6,防止短码过短导致碰撞率上升。- 编解码往返必须一致,
decodeId(encodeId(n))恒等于n。 - 成功与失败均有明确提示,便于上层逻辑捕获异常。
适用边界与注意点
- 不是安全方案:Sqids 提供的是轻量混淆,不是加密。短码能挡住随意扫描,但无法抵御有明确攻击目标的逆向分析,敏感场景仍需配合权限校验。
- 仅面向数字 ID:它不接受字符串、UUID 或复合结构,如果你的 ID 是 UUID 格式,需要先映射为整数再编码。
- 碰撞风险随
minLength下降而上升:当你把最小长度设得过小(例如 4),高并发下出现重复短码的概率会显著增加,建议保持minLength在 6 以上。 - 解码结果需二次校验:
decodeId返回的是number | undefined,拿到undefined说明短码非法或已失效,调用方必须做空值判断。
使用场景
- 团队要做短链服务,需要把数据库自增主键编码为短字符串拼进链接,并能从短链解码还原原 ID 以定位详情页。
- 后端开发对外 JSON 接口,不想直接暴露自增主键,需要用 Sqids 把数字 ID 编成六位以上短码返回,解码时做输入校验。
- 电商订单系统需要把长数字订单号编码成短码生成分享链接,接收方解码后与原单号比对完成合法性校验。
- 社区平台要对帖子 ID 做轻量混淆,避免访问者按连续数字遍历内容,要求编解码往返结果完全一致。
适合人员
- 后端开发工程师,需要在 API 响应中隐藏自增主键、防止数字 ID 被连续遍历读取。
- 短链或短码服务的开发者,需要把长数字 ID 编码为可解码还原的短字符串用于生成分享链接。
- 全栈工程师,正在设计对外资源标识,希望短码长度可控且编解码往返行为稳定一致。
- 内容社区技术负责人,想对帖子或评论的连续数字 ID 做轻量混淆,降低被批量爬取的风险。