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 相关文章推荐
桌面中心(二)数据库写入
Oct 09 PHP
网站用php实现paypal整合方法
Nov 28 PHP
纯php打造的tab选项卡效果代码(不用js)
Dec 29 PHP
php Calender(日历)代码分享
Jan 03 PHP
查找php配置文件php.ini所在路径的二种方法
May 26 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
利用PHP函数计算中英文字符串长度的方法
Nov 11 PHP
PHP列出MySQL中所有数据库的方法
Mar 12 PHP
php三元运算符知识汇总
Jul 02 PHP
标准版Eclipse搭建PHP环境的详细步骤
Nov 18 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 PHP
php提高脚本性能的4个技巧
Aug 18 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桌面中心(四) 数据显示
2007/03/11 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
php微信开发接入
2016/08/27 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
jquery remove方法应用详解
2012/11/22 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
python编程开发之类型转换convert实例分析
2015/11/13 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
python3学生名片管理v2.0版
2018/11/29 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
pyqt5 QProgressBar清空进度条的实例
2019/06/21 Python
实例详解Python装饰器与闭包
2019/07/29 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
Jar包的作用是什么
2014/03/30 面试题
银行实习生的自我评价
2013/12/09 职场文书
新领导上任欢迎词
2014/01/13 职场文书
商场促销活动方案
2014/02/08 职场文书
小学生元旦广播稿
2014/02/21 职场文书
创新型城市实施方案
2014/03/06 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
辞职信怎么写?
2019/05/21 职场文书