PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)


Posted in PHP onApril 28, 2010

这样我们就可以拿此函数来做很多用途了,比如:单点登录的token加密传输啦,临时密码啦等等

/** 
* @param string $string 原文或者密文 
* @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE 
* @param string $key 密钥 
* @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效 
* @return string 处理后的 原文或者 经过 base64_encode 处理后的密文 
* 
* @example 
* 
* $a = authcode('abc', 'ENCODE', 'key'); 
* $b = authcode($a, 'DECODE', 'key'); // $b(abc) 
* 
* $a = authcode('abc', 'ENCODE', 'key', 3600); 
* $b = authcode('abc', 'DECODE', 'key'); // 在一个小时内,$b(abc),否则 $b 为空 
*/ 
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 3600) { 
$ckey_length = 4; 
// 随机密钥长度 取值 0-32; 
// 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。 
// 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方 
// 当此值为 0 时,则不产生随机密钥 
$key = md5($key ? $key : EABAX::getAppInf('KEY')); 
$keya = md5(substr($key, 0, 16)); 
$keyb = md5(substr($key, 16, 16)); 
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; 
$cryptkey = $keya.md5($keya.$keyc); 
$key_length = strlen($cryptkey); 
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; 
$string_length = strlen($string); 
$result = ''; 
$box = range(0, 255); 
$rndkey = array(); 
for($i = 0; $i <= 255; $i++) { 
$rndkey[$i] = ord($cryptkey[$i % $key_length]); 
} 
for($j = $i = 0; $i < 256; $i++) { 
$j = ($j + $box[$i] + $rndkey[$i]) % 256; 
$tmp = $box[$i]; 
$box[$i] = $box[$j]; 
$box[$j] = $tmp; 
} 
for($a = $j = $i = 0; $i < $string_length; $i++) { 
$a = ($a + 1) % 256; 
$j = ($j + $box[$a]) % 256; 
$tmp = $box[$a]; 
$box[$a] = $box[$j]; 
$box[$j] = $tmp; 
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 
} 
if($operation == 'DECODE') { 
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { 
return substr($result, 26); 
} else { 
return ''; 
} 
} else { 
return $keyc.str_replace('=', '', base64_encode($result)); 
} 
}
PHP 相关文章推荐
IIS环境下快速安装、配置和调试PHP5.2.0
Dec 17 PHP
帖几个PHP的无限分类实现想法~
Jan 02 PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
使用phpQuery采集网页的方法
Nov 13 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
php截取字符串函数分享
Feb 02 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
Oct 17 PHP
thinkphp 手机号和用户名同时登录
Jan 20 PHP
php可变长参数处理函数详解
Feb 22 PHP
PHP钩子与简单分发方式实例分析
Sep 04 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
php post换行的方法
Feb 03 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
Apr 28 #PHP
PHP 文件上传全攻略
Apr 28 #PHP
PHP GD 图像处理组件的常用函数总结
Apr 28 #PHP
PHP 开发环境配置(测试开发环境)
Apr 28 #PHP
PHP 开发环境配置(Zend Studio)
Apr 28 #PHP
PHP 开发环境配置(Zend Server安装)
Apr 28 #PHP
PHP开发环境配置(MySQL数据库安装图文教程)
Apr 28 #PHP
You might like
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
php树型类实例
2014/12/05 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
详解webpack异步加载业务模块
2017/06/23 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
python采集微信公众号文章
2018/12/20 Python
Python中整数的缓存机制讲解
2019/02/16 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
高校生生产实习自我鉴定
2013/09/21 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
2014年协会工作总结
2014/11/22 职场文书
小学科学教学计划
2015/01/21 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
Redis分布式锁Redlock的实现
2021/08/07 Redis
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python