php加密之discuz内容经典加密方式实例详解


Posted in PHP onFebruary 04, 2017

本文实例讲述了php加密之discuz内容经典加密方式。分享给大家供大家参考,具体如下:

导读:有的时候,我们希望对表里的某些敏感字段进行加密,想了好长时间没有比较好的解决方案,后台在网上查了查,放心discuz论坛的这种方案对这种情况解决的不错,特copy过来,给大家分享一下,代码如下:

header ( "Content-type:text/html;charset=UTF-8" );
echo $string='花园路888号';
echo '<hr/>加密有效期10秒,密文内容:';
// $string='1111';
$sss=authcode($string,'','',10);
echo $sss;
echo '<hr/>加密后立即解密:...';
echo authcode($sss);
sleep(6);
echo '<hr/>6秒后解密...';
$aaaa=authcode($sss);
var_dump($aaaa);
sleep(5);
echo '<hr/>再次5秒后解密...';
$aaaa=authcode($sss);
var_dump($aaaa);
/**
 *
 * @param string $string    明文或密文字符串
 * @param string $operation    DECODE表示解密,其它表示加密
 * @param string $key    密钥
 * @param int $expiry    密文有效期,0代码永不过期
 * @return string
 */
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
    $ckey_length = 4;
    // 密匙
    $key = md5 ( $key ? $key : $GLOBALS ['discuz_auth_key'] );
    // 密匙a会参与加解密
    $keya = md5 ( substr ( $key, 0, 16 ) );
    // 密匙b会用来做数据完整性验证
    $keyb = md5 ( substr ( $key, 16, 16 ) );
    // 密匙c用于变化生成的密文
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr ( $string, 0, $ckey_length ) : substr ( md5 ( microtime () ), - $ckey_length )) : '';
    // 参与运算的密匙
    $cryptkey = $keya . md5 ( $keya . $keyc );
    $key_length = strlen ( $cryptkey );
    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
    $string = $operation == 'DECODE' ? base64_decode ( substr ( $string, $ckey_length ) ) : sprintf ( '0d', $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') {
        // substr($result, 0, 10) == 0 验证数据有效性
        // substr($result, 0, 10) - time() > 0 验证数据有效性
        // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0,
        // 16) 验证数据完整性
        // 验证数据有效性,请看未加密明文的格式
        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 {
        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
        return $keyc . str_replace ( '=', '', base64_encode ( $result ) );
    }
}

以上代码运行结果:

花园路888号
加密有效期10秒,密文内容:ce9eelLd6jpd7hZJTRg+/fgg8cD9VG+1NsHvkavEKhdvhk7jcfDoQTYSAAw
加密后立即解密:...花园路888号
6秒后解密...
string'花园路888号' (length=15)
再次5秒后解密...
string'' (length=0)
PHP 相关文章推荐
php桌面中心(三) 修改数据库
Mar 11 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
Jan 11 PHP
Yii中使用PHPExcel导出Excel的方法
Dec 26 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
May 11 PHP
PHP生成plist数据的方法
Jun 16 PHP
php实现的简单检验登陆类
Jun 18 PHP
PHP递归创建多级目录
Nov 05 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 PHP
解析laravel使用workerman用户交互、服务器交互
Apr 28 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
Feb 04 #PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 #PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 #PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
Feb 04 #PHP
Yii2实现多域名跨域同步登录退出
Feb 04 #PHP
PHP使用mysqli操作MySQL数据库的简单方法
Feb 04 #PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
Feb 04 #PHP
You might like
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
PHP基于IMAP收取邮件的方法示例
2017/08/07 PHP
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
python 实现客户端与服务端的通信
2020/12/23 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
毕业生求职简历中的自我评价
2013/10/18 职场文书
自动化系在校本科生求职信
2013/10/23 职场文书
毕业生面试求职信
2014/06/23 职场文书
六一儿童节致辞
2015/07/31 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫