短码混淆算法设计方案
一、背景与需求
1.1 业务需求
在视频分享系统中,需要为每个视频生成一个短码(Short Code),用于:
- 生成短链接:
https://example.com/v/{shortCode}
- 便于用户分享和记忆
- 隐藏内部的自增 VideoId
1.2 技术约束
约束项 | 说明 |
---|---|
输入 | VideoId 的低20位(0 - 1,048,575) |
输出 | Base62 编码的短码(4-8位字符) |
唯一性 | 不能碰撞(一对一映射) |
对称性 | 可逆(能从短码反推原始值) |
安全性 | 不能看出是连续的自增ID |
1.3 核心挑战
连续的 VideoId 会暴露业务信息:
1 | VideoId: 1000001 → 短码: 4SC1 |
攻击者可能:
- 推测视频总量
- 爬取所有视频
- 发现新视频的规律
二、候选方案对比
方案1️⃣:简单位混淆(位交换/旋转)
算法:
1 | // 高低10位交换 |
优点:
- ✅ 可逆(对称)
- ✅ 无碰撞(一对一)
- ✅ 计算极快
缺点:
- ❌ 混淆效果差
- ❌ 连续ID依然接近(1→1024, 2→1025)
- ❌ 容易被逆向分析
结论: ❌ 不满足安全性要求
方案2️⃣:哈希函数(MD5/SHA/MurmurHash)
算法:
1 | int obfuscate(int value) { |
优点:
- ✅ 雪崩效应好(1→0x3A2F, 2→0x8B91)
- ✅ 看起来完全随机
- ✅ 工业级成熟算法
缺点:
- ❌ 不可逆(无法从短码反推ID)
- ❌ 会碰撞(20位空间太小,生日攻击)
- ❌ 需要额外存储映射关系
碰撞概率计算:
1 | 根据生日悖论: |
结论: ❌ 不满足无碰撞要求
方案3️⃣:Feistel 网络(最终选择) ✅
算法:
1 | int obfuscate(int value) { |
优点:
- ✅ 完美可逆(XOR自反性保证)
- ✅ 绝对无碰撞(双射函数)
- ✅ 雪崩效应好(多轮扩散)
- ✅ 计算高效(仅位运算)
- ✅ 密码学级别(DES/3DES的核心)
- ✅ 灵活可调(轮数可调整安全性)
缺点:
- 无明显缺点
结论: ✅ 最佳方案
三、方案对比总结表
方案 | 可逆 | 无碰撞 | 雪崩效应 | 性能 | 复杂度 | 推荐度 |
---|---|---|---|---|---|---|
位交换 | ✅ | ✅ | ❌ 弱 | ⚡️⚡️⚡️ | 简单 | ⭐️ |
哈希函数 | ❌ | ❌ | ✅ 强 | ⚡️⚡️ | 简单 | ⭐️ |
模逆运算 | ✅ | ✅ | ⚠️ 中 | ⚡️ | 中等 | ⭐️⭐️⭐️ |
Feistel网络 | ✅ | ✅ | ✅ 强 | ⚡️⚡️ | 中等 | ⭐️⭐️⭐️⭐️⭐️ |
四、Feistel 网络详解
4.1 历史背景
- 发明者:Horst Feistel(IBM,1973年)
- 经典应用:DES、3DES、Blowfish、Twofish
- 核心优势:无论 F 函数多复杂,整体都可逆
4.2 算法验证
4.4 轮数选择
轮数 | 安全性 | 性能 | 适用场景 |
---|---|---|---|
2轮 | 弱 | 最快 | 仅需基本混淆 |
3轮 | 中 | 快 | 一般应用 |
4轮 | 好 | 平衡 | 短码生成(我们的选择) |
8轮 | 强 | 较慢 | 密码学应用 |
16轮 | 很强 | 慢 | DES 标准 |
为什么选择4轮?
- 经验表明:3-4轮可达到充分雪崩效应
- 性能与安全的最佳平衡
- 20位空间不需要过多轮次
4.5 实际效果演示
测试连续ID:
1 | 输入 VideoId (低20位) → 混淆后的值 → Base62短码 |
观察结果:
- ✅ 连续ID → 完全分散的短码
- ✅ 无明显规律可寻
- ✅ 每个ID对应唯一短码
六、安全性分析
6.1 抗攻击能力
攻击类型 | 描述 | 防御效果 |
---|---|---|
顺序推测 | 通过短码推测下一个视频 | ✅ 强 - 无法预测 |
碰撞攻击 | 寻找两个相同短码 | ✅ 强 - 数学不可能 |
暴力破解 | 遍历所有可能值 | ✅ 强 - 2^20 = 100万次 |
模式识别 | 分析短码分布规律 | ✅ 强 - 均匀分布 |
逆向工程 | 从短码反推算法 | ⚠️ 中 - 轮密钥需保密 |
7.1 基准测试
测试环境:
- CPU: Apple M1
- JDK: OpenJDK 17
- 测试次数: 1,000,000 次
测试结果:
1 | 操作 平均耗时 吞吐量 |
结论: 性能完全满足生产要求,单核每秒可生成 125万+ 短码。