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

 更新时间:2017年7月6日 23:34  
小编推荐的这篇文章介绍了php加密之discuz内容经典加密方式实例详解,非常实用,有兴趣的同学快来看看吧。 本文实例讲述了php加密之discuz内容经典加密方式。分享给
小编推荐的这篇文章介绍了php加密之discuz内容经典加密方式实例详解,非常实用,有兴趣的同学快来看看吧。

本文实例讲述了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/>加密后立即解密:...';

echoauthcode($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

 */

functionauthcode($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 )) {

            returnsubstr($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中生成UUID的自定义函数,有兴趣的同学快来看看吧。

UUID 全称是 Universally unique identifier,它是一种识别符,使用任意的计算机都可以生成,不需要一个中央数据库进行管理,即可以保证几乎没有重复的几率。而 UUID 的值域之大,据说给世界上每一粒沙子分配一个 UUID,也不会有重复的。

最近在改 WordPress 的代码,需要用到 UUID。但是,PHP 中居然没有生成 UUID 的函数,只好自己写一个。

 代码如下复制代码

if(!function_exists('com_create_guid')) {

 functioncom_create_guid() {

  returnsprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

    mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),

    mt_rand( 0, 0xffff ),

    mt_rand( 0, 0x0fff ) | 0x4000,

    mt_rand( 0, 0x3fff ) | 0x8000,

    mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )

  );

 }

}

上述代码可以生成一个 UUID version 4。UUID 目前有 5 个版本,其中第四版是完全随机的,生成起来比较容易。而其中的 com_create_guid,是 Windows 中 PHP 的一个函数,它直接调用 COM 的 CreateGuid 函数来生成 UUID,但是在 Linux 没有对应的函数库,只好自己写了。为了方便在不同的平台上使用,就创建了一个同名的函数。其它的代码就是生成随机数了。

至于用法,就直接调用 com_create_guid() 即可。

小编分享的这篇文章介绍了获知PHP程序占用多少内存的方法,有兴趣的同学可以参考一下文中所给代码。

下面是使用示例: 

 代码如下复制代码
<?php 
echo memory_get_usage(), '
'; // 313864 
$tmp = str_repeat('http://www.nowamagic.net/', 4000); 
echo memory_get_usage(), '
'; // 406048 
unset($tmp); 
echo memory_get_usage(); // 313952 
?>

上面的程序后面的注释代表了它们的输出(单位为 byte(s)),也就是当时 PHP 脚本使用的内存(不含 memory_get_usage() 函数本身占用的内存)。
由上面的例子可以看出,要想减少内存的占用,可以使用 PHP unset() 函数把不再需要使用的变量删除。类似的还有:PHP mysql_free_result() 函数,可以清空不再需要的查询数据库得到的结果集,这样也能得到更多可用内存。
PHP memory_get_usage() 函数还可以有个参数,$real_usage,其值为布尔值。默认为 FALSE,表示得到的内存使用量不包括该函数(PHP 内存管理器)占用的内存;当设置为 TRUE 时,得到的内存为不包括该函数(PHP 内存管理器)占用的内存。
所以在实际编程中,可以用 memory_get_usage() 函数比较各个方法占用内存的高低,来选择使用哪种占用内存小的方法。
贴个使用函数:

 代码如下复制代码
if (!function_exists('memory_get_usage')) 

/** 
+---------------------------------------------------------- 
* 取得内存使用情况 
+---------------------------------------------------------- 
* @return integer 
+---------------------------------------------------------- 
*/ 
function memory_get_usage() 

$pid = getmypid(); 
if (IS_WIN) 

exec('tasklist /FI "PID eq ' . $pid . '" /FO LIST', $output); 
return preg_replace('/[^0-9]/', '', $output[5]) * 1024; 

else 

exec("ps -eo%mem,rss,pid | grep $pid", $output); 
$output = explode(" ", $output[0]); 
return $output[1] * 1024; 


}

再来个函数使用例子:

 代码如下复制代码
<?php 
//memory_get_usage(); 
$m1 = memory_get_usage(); 
echo '
m1:',$m1;//58096 
$a = 'hello'; 
$b = str_repeat($a,1000); 
$m2 = memory_get_usage(); 
echo '
m2:',$m2;//63424 
unset($b); 
$m3 = memory_get_usage(); 
echo '
m3:',$m3;//58456 
?>
php怎么样搭建本地服务器?小编分享的这篇文章详细介绍了php搭建本地服务器的步骤,不会的同学可以看看本文,按照步骤一步一步来,一定可以成功的。

网站程序写完之后,都需要测试一下,看看是否跑版,是否有兼容性问题;测试的方法一般有两种:

1.到IDC服务商申请免费空间和免费三级域名,2.在自己电脑搭建PHP服务器。下面小编为大家分享下,如何在本地搭建PHP服务器。

PHP服务器≈ Windows+Apache+MySQL+PHP

首先到百度搜索APMServ 5.2.6

下载APMServ 5.2.6后解压,本身自解压文件,双击自释放档案,这里可以根据自己的喜爱点击浏览选择释放的位置。

释放以后能看到如下所示

如何搭建PHP服务器

然后是把我们的网站文件上传到本地服务器。

看上图点击网站目录菜单,点击打开D:\APMServ5.2.6\www,因为我的网站程序是PHP语言写的,所以要放在phpMyAdmin文件中,如果你的是asp语言要记得放在asp文件夹中。然后可以访问网站了

如何搭建PHP服务器

启动APMServ,点击访问用户本地网站,这样可以访问你的网站了。

如何搭建PHP服务器
 

如何搭建PHP服务器

 

如果你安装了IIS/Web迅雷一类的需要占用80端口的程序并且运行了它们,请把他们关闭.如果你需要运行它们,请修改Apache的端口,如100.如果运行了IIS,还需要一同修改SSL端口号,可以把它设置为440(可以是任意未被占用的端口号)。端口查看方法或命令

注意事项:

1、APMServ程序所在路径不能含有汉字和空格。

2、MySQL默认用户名:root,密码为空

3、MySQL数据库文件存放目录:MySQL5.1data或MySQL4.0\data

4、网站根目录[HTML,PHP]www\htdocs [ASP]www\asp [CGI,Perl]www\cgi-bin

5、访问本机请用http://127.0.0.1/或https://127.0.0.1/ (如果开启SSL)

6、非默认端口(80端口),网址为http://127.0.0.1:端口/或https://127.0.0.1:端口/

7、如果出现Apache无法启动的现象,则有可能是端口设置有问题。请尝试修改Apache和SSL端口号。

8、如果MySQL无法加载,可能是端口被占用。在知道某个程序占用了端口后,可以在任务管理器中结束它。这样解决了端口占用的问题。

方式加密discuz