短链接怎么加密后还原php_双向加密解密流程汇总【汇总】
技术百科
星夢妙者
发布时间:2025-12-31
浏览: 次 短链接加密本质是ID映射而非密码学加密,采用Base62编码+自增ID映射实现高效、安全、无密钥的短码生成与还原,可辅以异或等轻量混淆防枚举。
短链接加密本质是 ID 映射,不是密码学加密
短链接服务里所谓“加密”,实际是把原始 URL 对应的数据库自增 id(比如 12345)转换成一串短字符串(比如 aB3xK),还原时再把 aB3xK 解回 12345,查库取原 URL。它不涉及 AES、RSA 等双向密码学加解密,也不需要密钥管理——混淆 ≠ 加密。
强行套用 openssl_encrypt 或 mcrypt 反而引入安全风险(如 IV 泄露、填充攻击)和性能开销,且无法支持高并发短码生成与反查。
推荐方案:Base62 编码 + 自增 ID 映射
这是生产环境最常用、最轻量、最可控的方式。核心逻辑是
:入库后取 lastInsertId() → 转 Base62 → 存入短码字段;访问时 Base62 解码 → 得到 ID → 查库。
-
Base62字符集为0-9a-zA-Z(共 62 字符),比 Base64 少+/,避免 URL 编码问题 - PHP 中无需扩展,用
strtr()和base_convert()组合即可实现(注意base_convert()不支持 62 进制,需手写) - 避免重复:插入前先查是否存在该短码,或用唯一索引 + 重试机制
- 示例编码函数:
function idToShort($id) {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$short = '';
while ($id > 0) {
$short = $chars[$id % 62] . $short;
$id = (int)($id / 62);
}
return $short ?: '0';
}
function shortToId($short) {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$id = 0;
for ($i = 0; $i < strlen($short); $i++) {
$id = $id * 62 + strpos($chars, $short[$i]);
}
return $id;
}
想加一层混淆?用固定异或或位移,别碰真实加密函数
如果业务要求“不让 ID 规律暴露”(比如防止爬虫枚举),可在 Base62 前对原始 id 做轻量混淆,例如:
- 异或一个固定数:
$obfId = $id ^ 0x5A3F9C1E; - 左移再异或:
$obfId = (($id - 必须保证运算可逆,且结果仍为正整数、不溢出(尤其在 32 位 PHP 上)
- 切勿使用
md5()、sha1()等单向哈希,它们不可还原 - 更别用
openssl_encrypt()输出二进制或 base64,会导致短码变长、含非法字符
为什么不要用 openssl\_encrypt / mcrypt 做短链加解密
常见错误是把短链接当成敏感数据去“加密”,结果踩坑:
-
openssl_encrypt输出是二进制或 base64 字符串(如U2FsdGVkX1+...),长度远超 6~8 字符,失去“短”意义 - IV 必须随文传输或固定,固定 IV 会降低安全性;随文传输又增加存储/解析负担
- 不同 PHP 版本对
mcrypt支持不一,已废弃;openssl模式、填充、密钥长度稍有偏差就decrypt失败,调试极痛苦 - 数据库查短码时,你没法用
WHERE short = ?直接匹配加密后的乱码——除非全表解密扫描,性能归零
真正需要加密的,是原始 URL 本身(比如含用户 token),那应该单独字段 AES 加密存储,而不是拿它去生成短码。
# 这是
# 也不
# 它不
# 爬虫
# 可在
# 而非
# 转换成
# 不支持
# 稍有
# 并发
# 编码
# 字符串
# 数据库
# php
# ssl
# 不要用
# 加解密
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么更改计算机名_Windows11系统
- Win11系统占用空间大怎么办 Win11深度瘦身
- 如何在Golang中使用内置函数_Golangle
- Python面向对象实战讲解_类与设计模式深入理解
- Windows如何拦截腾讯视频广告_Windows
- 如何在Golang中优化文件读写性能_使用缓冲和并
- php控制舵机角度怎么调_php发送pwm信号控制
- 如何使用Golang捕获测试日志_Golang t
- 如何使用Golang实现微服务事件驱动_使用消息总
- Python对象比较排序规则_集合使用说明【指导】
- Win11怎么设置快速访问_Windows11文件
- Win11笔记本怎么看电池健康度_Win11电池报
- Win11 explorer.exe频繁崩溃_修复
- c++的位运算怎么用 与、或、异或、移位操作详解【
- 如何使用Golang实现容器健康检查_监控和自动重
- Python网络日志追踪_请求定位解析【教程】
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- Win11怎么设置屏保_Windows 11屏幕保
- Win11怎么设置ip地址_Windows 11手
- php485返回空数组怎么回事_php485数据接
- Win11怎么开启移动热点_Windows11共享
- 如何使用Golang读取日志文件_Golang b
- Win11怎么关闭资讯和兴趣_Windows11任
- Windows10系统怎么查看CPU温度_Win1
- Windows 11怎么设置默认解压软件_Wind
- 如何使用Golang实现文件加密_Golang c
- PHP主流架构如何做单元测试_工具与流程【详解】
- Windows10如何查看保存的WiFi密码_Wi
- 如何使用Golang template生成文本模板
- Win11怎么设置默认邮件应用_Windows11
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- Golang如何遍历目录文件_Golang fil
- 如何使用Golang实现路由分组管理_Golang
- Win11怎么关闭通知中心_Windows11系统
- Win11任务栏怎么放到顶部_Win11修改任务栏
- 如何更改Windows资源管理器的默认启动位置?(
- 如何使用 Python 合并文件夹内多个 Exce
- Windows蓝屏错误0x00000018怎么处理
- c++中如何计算坐标系中两点间距离_c++勾股定理
- c++怎么编写动态链接库dll_c++ __dec
- 如何使用Golang开发简单的聊天室消息存储_Go
- Windows服务启动类型恢复方法_错误修改导致的
- Go语言中slice追加操作的底层共享机制详解
- Linux如何安装Golang环境_Linux下G
- Python与GPU加速技术_CUDA与Numba
- Win11怎么查看显卡温度 Win11任务管理器查
- C++如何使用std::optional?(处理可
- c# 在高并发下使用反射发射(Reflection
- php打包exe怎么传递参数_命令行参数接收方法【
- Mac如何修复应用程序权限问题_Mac磁盘工具修复

QQ客服