PHP带时效性加密解密函数实现方案
在Web开发中,敏感数据的传输往往需要兼顾安全性与有效性控制。本内容介绍一个自定义的PHP加解密函数,支持动态密钥、完整性校验以及基于时间的自动失效机制。
核心功能概述
该加密函数主要解决两个问题:一是防止数据在传输过程中被篡改或轻易还原,二是控制数据的有效周期。一旦超过预设的时间阈值,加密字符串将无法被正确解密,从而实现了“时效性”加密。
第1步:理解参数结构
调用函数时需关注以下关键参数,以决定加密策略:
$tex:待处理的明文或密文字符串。$key:用于生成混淆密钥的盐值(Salt),建议保密。$type:操作类型,设置为"encode"进行加密,"decode"进行解密。$expiry:有效期秒数。设为0表示无时效限制;大于0则开启时间验证机制。
第2步:完整代码实现
以下是包含详细注释的功能代码,可直接集成到项目中。代码采用了异或运算(XOR)结合Base64编码进行核心处理,并引入了MD5哈希进行前后缀校验。
<?php
function encode_pass($tex,$key,$type="encode",$expiry=0){
// 定义字符集用于生成随机前缀
$chrArr=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'0','1','2','3','4','5','6','7','8','9');
if($type=="decode"){
// 解密时长度检查
if(strlen($tex)<14)return false;
// 提取头部8位作为校验码
$verity_str=substr($tex, 0,8);
// 移除校验码获取主体
$tex=substr($tex, 8);
// 验证完整性:当前文本前8位的MD5是否等于存储的校验码
if($verity_str!=substr(md5($tex),0,8)){
return false;
}
}
// 构建随机密钥部分
// 解密时使用预留位置读取随机标识,加密时生成随机字符串
$key_b=$type=="decode"?substr($tex,0,6):$chrArr[rand()%62].$chrArr[rand()%62].$chrArr[rand()%62].$chrArr[rand()%62].$chrArr[rand()%62].$chrArr[rand()%62];
// 组合随机密钥与用户提供的盐值
$rand_key=$key_b.$key;
// 处理时效性逻辑
$modnum=0;$modCount=0;$modCountStr="";
if($expiry>0){
if($type=="decode"){
// 解密时提取时效相关信息
$modCountStr=substr($tex,6,1);
$modCount=$modCountStr=="a"?10:floor($modCountStr);
$modnum=substr($tex,7,$modCount);
// 计算当前周期并与存入周期比对
$rand_key=$rand_key.(floor((time()-$modnum)/$expiry));
}else{
// 加密时记录时间状态
$modnum=time()%$expiry;
$modCount=strlen($modnum);
$modCountStr=$modCount==10?"a":$modCount;
$rand_key=$rand_key.(floor(time()/$expiry));
}
// 截取Base64后的实际数据进行解密预处理,或标记加密对象
$tex=$type=="decode"?base64_decode(substr($tex, (7+$modCount))):"xugui".$tex;
}else{
// 无时效模式下的基础处理
$tex=$type=="decode"?base64_decode(substr($tex, 6)):"xugui".$tex;
}
// 生成最终的混淆密钥哈希
$rand_key=md5($rand_key);
// 核心加密/解密:逐字节异或
$texlen=strlen($tex);
$reslutstr="";
for($i=0;$i<$texlen;$i++){
$reslutstr.=$tex{$i}^$rand_key{$i%32};
}
// 封装输出结果
if($type!="decode"){
$reslutstr=trim(base64_encode($reslutstr),"==");
// 组装时效字段
$reslutstr=$modCount?$modCountStr.$modnum.$reslutstr:$reslutstr;
$reslutstr=$key_b.$reslutstr;
// 添加头部MD5校验
$reslutstr=substr(md5($reslutstr), 0,8).$reslutstr;
}else{
// 解密后需去除标记并验证合法性
if(substr($reslutstr,0, 5)!="xugui"){
return false;
}
$reslutstr=substr($reslutstr, 5);
}
return $reslutstr;
}
// 测试用例
$psa=encode_pass("woshi ceshi yong de ","taintainxousad","encode",120);
echo $psa;
echo "\r\n解密:";
echo encode_pass($psa,"taintainxousad",'decode',120);
?>工作原理解析
该算法并未使用标准的AES等工业级加密标准,而是采用了一种轻量级的混淆策略,适用于内部数据传输或非极端敏感场景:
- 动态混淆:每次加密都会生成随机的6位字符头(
$key_b),使得相同明文在不同时间生成的密文完全不同,增加暴力破解难度。 - 完整性保护:密文头部附加了主体内容的MD5前8位。解密时若数据被修改,校验将失败并返回false。
- 时效控制:当指定
$expiry时,函数会将当前时间相对于有效期的“周期数”编码进密文中。解密时重新计算周期数,若两者不一致,说明已过期,导致后续校验或异或结果异常而解密失败。
适用场景与建议
- 会话令牌:可用于生成具有生命周期的临时访问令牌。
- 短信验证码/链接:适合需要设置短期有效性的URL签名。
需要注意的是,由于使用了简单的异或和MD5,该方案不推荐用于极高安全等级的金融或密码存储场景。对于一般业务逻辑中的防篡改和时效控制,此代码提供了足够的复杂度与便捷性。
以上就是带时效性PHP加密解密函数的详细内容,更多关于PHP数据安全技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









