PHP带时效性加密解密函数实现方案

程一诺
程一诺
发布时间:2026-10-14 | 4人浏览过
原创

在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等工业级加密标准,而是采用了一种轻量级的混淆策略,适用于内部数据传输或非极端敏感场景:

  1. 动态混淆:每次加密都会生成随机的6位字符头($key_b),使得相同明文在不同时间生成的密文完全不同,增加暴力破解难度。
  2. 完整性保护:密文头部附加了主体内容的MD5前8位。解密时若数据被修改,校验将失败并返回false。
  3. 时效控制:当指定 $expiry 时,函数会将当前时间相对于有效期的“周期数”编码进密文中。解密时重新计算周期数,若两者不一致,说明已过期,导致后续校验或异或结果异常而解密失败。

适用场景与建议

  • 会话令牌:可用于生成具有生命周期的临时访问令牌。
  • 短信验证码/链接:适合需要设置短期有效性的URL签名。

需要注意的是,由于使用了简单的异或和MD5,该方案不推荐用于极高安全等级的金融或密码存储场景。对于一般业务逻辑中的防篡改和时效控制,此代码提供了足够的复杂度与便捷性。

以上就是带时效性PHP加密解密函数的详细内容,更多关于PHP数据安全技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表