15.2 PHP加密扩展库
视频讲解:光盘TMlx15PHP加密扩展库.exe
PHP除了自带的几种加密函数外,还有功能更全面的加密扩展库Mcrypt和Mhash。其中Mcrypt扩展库可以实现加密和解密功能,既能将明文加密,也可以将密文还原。Mhash扩展库则包含了MD5在内的多种hash算法实现的混编函数。
15.2.1 Mcrypt扩展库
1.Mcrypt库安装
单向加密的优势是密文无法还原为明文,即使数据被截获也不会造成资料外泄。但有时,还需要将密文还原成明文,这就需要使用双向加密技术了。Mcrypt是一个功能十分强大的加密算法扩展库。在标准的PHP安装过程中并没有安装Mcrypt,但PHP的主目录下包含了libmcrypt.dll和libmhash.dll文件(libmhash.dll是Mhash扩展库,这里一起安装上),首先将文件复制到系统目录windowssystem32下,然后在php.ini文件中找到“; extension=php_mcrypt.dll”和“; extension=php_mhash.dll”这两个语句,将前面的分号“; ”去掉,最后重新启动服务器,即可使用这两个扩展库。
2.Mcrypt库常量
【例15.5】 Mcrypt库支持20多种加密算法和8种加密模式,读者可以通过mcrypt_list_ algorithms()和mcrypt_list_modes()函数查看,实例代码如下:(实例位置:光盘TMsl155)
<?php $en_dir=mcrypt_list_algorithms(); //函数返回Mcrypt支持的加密算法数组 echo "Mcrypt支持的算法有:"; foreach($en_dir as $en_value){ echo $en_value." "; } $mo_dir=mcrypt_list_modes(); //函数返回Mcrypt支持的算法模式数组 echo "<p>Mcrypt支持的加密模式有:"; foreach($mo_dir as $mo_value){ echo $mo_value." "; } ?>
运行结果如图15.6所示。
图15.6 Mcrypt库支持的加密算法与加密模式
这些算法和模式在实际应用中要用常量来表示,写的时候分别加上前缀MCRYPT_和MCRYPT_MODE_来表示,如:
TWOFISH算法表示为MCRYPT_TWOFISH。
CBC加密模式表示为MCRYPT_MODE_CBC。
3.Mcrypt应用
【例15.6】使用Mcrypt进行加密和解密不像使用md5()、sha1()等函数,直接调用即可。为了让读者能清楚地了解Mcrypt的工作流程,下面通过一个实例来学习Mcrypt是如何工作的。实例代码如下:(实例位置:光盘TMsl156)
<?php $str="被加密的内容:相见时难别亦难 东风无力百花残"; //加密文本 $key="key:111"; //密钥 $cipher=MCRYPT_DES; //密码类型 $modes=MCRYPT_MODE_ECB; //密码模式 $iv=mcrypt create iv(mcrypt get iv size($cipher, $modes), MCRYPT RAND); //初始化向量 echo "加密前:".$str."<p>"; //加密: $str_encrypt=mcrypt encrypt($cipher, $key, $str, $modes, $iv); //加密函数 echo "加密后:".$str_encrypt." <p>"; $str_decrypt=mcrypt decrypt($cipher, $key, $str_encrypt, $modes, $iv); //解密函数 echo "还原:".$str_decrypt."<p>"; ?>
运行结果如图15.7所示。
图15.7 使用Mcrypt库加密和解密
下面对代码中加粗的函数进行讲解。
(1)string mcrypt_create_iv ( int size [, int source] )
使用Mcrypt进行数据加密、解密之前,首先要创建一个初始化向量(简称iv)。创建初始化向量需要两个参数:size指定了iv的大小,source为iv的源。source可以取如下值。
MCRYPT_RAND:系统随机数。
MCRYPE_DEV_RANDOM:读取目录/dev/random中的数据(UNIX系统)。
MCRYPT_DEV_URANDOM:读取目录/dev/urandom中的数据(UNIX系统)。
(2)int mcrypt_get_iv_size ( string cipher, string mode )
该函数返回初始化向量(iv)的大小。函数中的两个参数是前面刚介绍过的加密算法(cipher)和算法模式(mode)。
(3)string mcrypt_encrypt ( string cipher, string key, string data, string mode [, string iv] )
初始化向量后,即可使用mcrypt_encrypt()加密函数对数据进行加密。该函数的5个参数分别如下。
cipher:加密算法。例15.6中为变量$cipher,这里的加密算法可以和初始化向量中的加密算法不一样。
key:密钥。例15.6中的变量$key。
data:需要加密的数据。例15.6中的变量$str。
mode:算法模式。例15.6中的变量$modes,可以和初始化向量中的模式不一样。
iv:初始化向量。例15.6中的变量$iv。
(4)string mcrypt_decrypt ( string cipher, string key, string data, string mode [, string iv] )
解密函数mcrypt_decrypt()和加密函数mcrypt_encrypt()的参数几乎是一样的。唯一不同的是参数data,这里的data为需要解密的数据,而不是原始数据。在例15.6中为需要解密的变量$str_encrypt。
注意
加密函数和解密函数中的cipher、key和mode参数必须一致,否则数据不会被还原。
Mcrypt扩展库包含30多个函数,对加密技术感兴趣的读者可以参考PHP手册,其中有详细的介绍。
15.2.2 Mhash扩展库
1.Mhash库安装
关于Mhash库的安装在前面已经介绍过,这里不再重复。读者可以参见15.2.1节中的Mcrypt库安装。
2.Mhash库常量
【例15.7】 Mhash库支持MD5、SHA、CRC32等多种散列算法,可以使用mhash_count()和mhash_get_hash_name()函数输出支持的算法名称。实例代码如下:(实例位置:光盘TMsl157)
<?php $num=mhash_count(); //函数返回最大的hash id echo "Mhash库支持的算法有:"; for($i = 0; $i <= $num; $i++){ echo$i."=>".mhash_get_hash_name($i)." "; //输出每一个hash id 的名称 } ?>
运行结果如图15.8所示。
图15.8 Mhash库支持的加密算法
如果在实际应用中使用上面的常量,需要在算法名称前面加上MHASH_前缀,如CRC32表示为MHASH_CRC32。
3.Mhash应用
相比Mcrypt扩展库的30多个函数,Mhash库中只有5个函数,除了上面使用到的两个函数外,下面来介绍其他的3个函数。
mhash_get_block_size()函数
函数语法:
int mhash_get_block_size ( int hash )
该函数用来获取参数hash的区块大小,如mhash_get_block_size(MHASH_CRC32)。
mhash()函数
函数语法:
string mhash ( int hash, string data [, string key] )
该函数返回一个哈希值。其中,hash为要使用的算法,data是要加密的数据,key是加密使用的密钥。
mhash_keygen_s2k()函数
函数语法:
string mhash_keygen_s2k ( int hash, string password, string salt, int bytes )
该函数将根据参数password和salt返回一个长度为字节的key值,参数hash为要使用的算法。其中salt为一个固定8字节的值,如果用户给出的数值小于8字节,将用0补齐。
【例15.8】使用mash()函数和mhash_keygen_s2k()函数生成一个校验码,并使用bin2hex()函数将二进制结果转换为十六进制。实例代码如下:(实例位置:光盘TMsl158)
<?php $filename='08.txt'; //文件路径 $str=file_get_contents($filename); //读取文件内容到变量$str中 $hash=2; //设置hash值 $password='111'; //设置变量$password $salt='1234'; //设置变量$salt $key=mhash_keygen_s2k(1, $password, $salt,10); //生成key值 $str_mhash=bin2hex(mhash($hash, $str, $key)); //使用$key值、$hash值对字串$str加密 echo"文件08.txt的校验码是:".$str_mhash; //输出校验码 ?>
运行结果如图15.9所示。
图15.9 使用Mhash库生成校验码
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。