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 相关文章推荐
php中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
PHP设计模式 注册表模式
Feb 05 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
May 04 PHP
PHP生成自定义长度随机字符串的函数分享
May 04 PHP
PHP写日志的实现方法
Nov 05 PHP
php实现的mongodb操作类实例
Apr 03 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
Yii2语言国际化自动配置详解
Aug 22 PHP
PHP JWT初识及其简单示例
Oct 10 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
Apr 10 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 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
php若干单维数组遍历方法的比较
2011/09/20 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
php curl发送请求实例方法
2019/08/01 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
几种响应式文字详解
2017/05/19 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
python共享引用(多个变量引用)示例代码
2013/12/04 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
《卖木雕的少年》教学反思
2014/04/11 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers