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语法(3)
Oct 09 PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
May 31 PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
PHP中类的继承和用法实例分析
May 24 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
Jul 25 PHP
详解PHP处理密码的几种方式
Nov 30 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
PHP调用接口API封装的例子
Oct 11 PHP
php7连接MySQL实现简易查询程序的方法
Oct 13 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
php+oracle 分页类
2006/10/09 PHP
中篇:安装及配置PHP
2006/12/13 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
PHP中输出转义JavaScript代码的实现代码
2011/04/22 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
php代码架构的八点注意事项
2016/01/25 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
javascript常用函数(2)
2015/11/05 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
用python 制作图片转pdf工具
2015/01/30 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
安全生产承诺书
2014/03/26 职场文书
家长学校培训材料
2014/08/20 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
80后婚前协议书范本
2014/10/24 职场文书
法定代表人证明书
2014/11/28 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书