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

 更新时间:2017年7月6日 23:34  点击:1687
小编推荐的这篇文章介绍了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无法加载,可能是端口被占用。在知道某个程序占用了端口后,可以在任务管理器中结束它。这样解决了端口占用的问题。

[!--infotagslink--]

相关文章

  • php中网页添加到桌面快捷方式方法

    我们经常会在网站中看到可以直接把网站以快捷方式保存到自己的电脑中,然后只要点击就可以实现进入网了,那么php中怎么把网页添加到桌面快捷方式呢。 功能简单,直接上...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • php中用curl模拟登录discuz以及模拟发帖

    本文章完美的利用了php的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。 代码如下 复制代码 <?php $discuz_url = &lsquo;ht...2016-11-25
  • PHP用DOM方式处理HTML之《Simple HTML DOM》

    近经常需要采集一些网上的数据,发现一个PHP处理HTML的利器 simple html dom,看了一下文档,使用非常方便,关键是能够用CSS选择器来访问DOM树,和jquery相似,实在是难得的利器...2016-11-25
  • vue接口请求加密实例

    这篇文章主要介绍了vue接口请求加密实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
  • AES加密解密的例子小结

    关于AES加密的算法我们就不说了,这里主要给各位演示了三个关于AES算法实现的加密例子,希望本文章能给你带来帮助。 话不多说,先放上代码,一共有两个文件:AES.php(aes算...2016-11-25
  • MySQL针对Discuz论坛程序的基本优化教程

    过了这么久,discuz论坛的问题还是困扰着很多网友,其实从各论坛里看到的问题总结出来,很关键的一点都是因为没有将数据表引擎转成InnoDB导致的,discuz在并发稍微高一点的环境下就表现的非常糟糕,产生大量的锁等待,这时候如果...2015-11-24
  • ps中怎么设置垂直罗马对齐方式?垂直罗马对齐方式设置方法

    photoshop的直排文字工具,打出的字特别是英文字母,默认排列侧向的,如何调整为正向排列呢?下面我们就来看看标准的罗马对齐方式应该怎么设置。 1、在PS中点击“工具面...2017-01-22
  • node.JS md5加密中文与php结果不一致怎么办

    这次文章要给大家介绍的是node.JS md5加密中文与php结果不一致怎么办,不知道具体解决办法的下面跟小编一起来看看。 因项目需要,需要Node.js与PHP做接口调用,发现nod...2017-07-06
  • NODE.JS加密模块CRYPTO常用方法介绍

    使用require('crypto')调用加密模块。加密模块需要底层系统提供OpenSSL的支持。它提供了一种安全凭证的封装方式,可以用于HTTPS安全网络以及普通HTTP连接。该模块还提供了一套针对OpenSSL的hash(哈希),hmac(密钥哈希),cipher...2014-06-07
  • C#连接加密的Sqlite数据库的方法

    对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密,下面通过本文给大家介绍C#连接加密的Sqlite数据库的方法,感兴趣的朋友一起看看吧...2020-06-25
  • C#实现对文件进行加密解密的方法

    这篇文章主要介绍了C#实现对文件进行加密解密的方法,涉及C#加密与解密的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php使用异或实现的加解密的方法

    若a=b ^ c;则b=a ^ c (^是异或的意思),php在处理异或的字符时先把字符转化为二进制的ascii值,对这些值进行异或,获取结果后在将ascii值转化为字符...2013-09-26
  • go语言使用RC4加密的方法

    这篇文章主要介绍了go语言使用RC4加密的方法,实例分析了RC4加密的技巧与实现方法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-07
  • C#为配置文件加密的实现方法

    这篇文章主要介绍了C#为配置文件加密的实现方法,可实现对配置文件中的敏感信息进行加密,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • c#实现md5加密示例

    这篇文章主要介绍了md5加密,加密结果可以为32位、48位、64位,只要修改一下参数就可以实现...2020-06-25
  • javascript 判断页面访问方式电脑或者移动端

    这篇文章主要介绍了 判断页面访问方式电脑或者移动端的相关资料,这里提供了三种方法,需要的朋友可以参考下...2016-10-03
  • C#编写的Base64加密和解密类

    本文给大家汇总介绍了几种C#编写的Base64加密和解密类的代码,从简单到复杂,都能够实现功能,有需要的小伙伴根据自己的项目需求参考下吧。...2020-06-25
  • C#实现的MD5加密功能与用法示例

    这篇文章主要介绍了C#实现的MD5加密功能与用法,结合实例形式分析了C# MD5加密类的定义与使用方法,需要的朋友可以参考下...2020-06-25
  • C#实现对AES加密和解密的方法

    C#实现对AES加密和解密的方法,需要的朋友可以参考一下...2020-06-25