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-5.2 的 php.ini 中文版[金步国翻译]
Apr 17 PHP
PHP-redis中文文档介绍
Feb 07 PHP
php设计模式之命令模式的应用详解
May 21 PHP
深入for,while,foreach遍历时间比较的详解
Jun 08 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
Jun 18 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
php数组函数array_walk用法示例
May 26 PHP
php操作access数据库的方法详解
Feb 22 PHP
PHP中TP5 上传文件的实例详解
Jul 31 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 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导出Word文档的原理和实例
2013/10/21 PHP
PHP判断指定时间段的2个方法
2014/03/14 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
ExtJS判断IE浏览器类型的方法
2014/02/10 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
js实现微博发布小功能
2017/01/12 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
python实现弹窗祝福效果
2019/04/07 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Python Gitlab Api 使用方法
2019/08/28 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
全球最大的服务市场:Fiverr
2017/01/03 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
财产公证书
2014/04/10 职场文书
资料员岗位职责
2015/02/10 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
质量承诺书格式范文
2015/04/28 职场文书
企业百日安全活动总结
2015/05/07 职场文书
企业工会工作总结2015
2015/05/13 职场文书
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技