PHP加密函数
数据加密的基本原理就是对原来为明文的文件或数据按照某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”。
PHP中能对数据进行加密的函数主要有crypt(),md5()和sha1(),还有加密扩展库Mcrypt和Mash。
1.使用crypt()函数进行加密
crypt()函数可以完成单向加密功能
string crypt(string str[, string salt);其中,str参数是需要加密的字符串,salt参数为加密时使用的干扰串,如果省略第二个参数,则 会随机生成一个干扰串。
crypt()函数支持的4种算法和salt参数的长度
算法 salt长度
CRYPT_STD_DES 2-character(默认)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character(以$1$开头)
CRYPT_BLOWFISH 16-character(以$2$开头)
默认情况下,PHP使用一个或两个字符的DES干扰串,如果系统使用的是MD5,则会使用12个字符,可以通过CRYPT_SALT_LENGTH变量来查看当所使用的干扰串长度。
<?php
$str='this is a example';// 声明字符串变量$str
echo '加密的$str的值为:'.$str;
$crypttostr=crypt($str);// 对变量$str加密
echo '<p>加密后的$str的值为:'.$crypttostr;// 输出加密后的变量
?>
<?php
/*链接数据库*/
$conn=mysql_connect("localhost","root","root") or die("数据库链接错误".mysql_error());
mysql_select_db("db_database15",$conn) or die("数据库访问错误".mysql_error);
mysql_query("set names gb2312");
?>
<form id="form1" name="form1" method="post" action="">
<td><input name="username" type="text" id="username" size="15"/></td>
<td><input name="submit" type="text" id="submit" value="检查"/></td>
</form>
<?php
if(trim($_POST[username]!="")){// trim()函数去掉字符串两边的空格
$user = crypt($_POST[username],"tm");// 对用户名进行加密
$sql="select * from tb_user where user=".$user"";//生成查询语句
$rst=mysql_query($sql,$conn);
if(mysql_num_rows($rst) > 0)
{
echo "<font color='red'>用户名已存在</font>";
}
else{
echo "<font color='green'>恭喜你,用户名可以使用</font>";
}
}
?>
2.使用md5()函数进行加密
md5()函数使用MD5算法,MD5的全称是Message-Digest Algorithm5(信息-摘要算法),她的作用是把不同的长度的数据信息经过一系列的算法计算成一个128位的数值,就是把一个任意长度的字节串变换成一定长的大整数。注意这里是"字节串"而不是"字符串"。
string md5(string str[, bool raw_output]);
其中字符串str为要加密的明文,raw_output参数如果设为true,则函数返回一个二进制形式的密文,该函数默认为false。
<?php
class chkinput{
var $name;// 定义chkinput类
var $pwd;// 定义成员变量
function chkinput($x,$y){
$this->name=$x;// 为成员变量赋值
$this->pwd=$y;// 为成员变量赋值
}
function checkinput(){
include "conn/conn.php";// 通过include调用数据库连接文件
$info = mysql_query("insert into tb_user(user.password) value(".this->name.","$this->pwd.")");
if($info == false){
echo "<script language="javascript">alert('会员注册失败!');history.back();</script>";
exit();
}else{
$_SESSION[admin_name]=$this->name;//注册成功后,将用户名赋给SESSION变量
echo "<script language='javascript'>alert('恭喜,注册成功');window.loaction.href='index.php';</script>";
}
}
}
$obj=new chkinput(trim($_POST[name]),trim(md5($_POST[pwd]));
$obj->checkinput();
?>
3.使用sha1()函数进行加密
和MD5类似的还有SHA算法,SHA全称为Secure Hash Algorithm(安全哈希算法),PHP提供的sha1()函数使用的就是SHA算法。
string sha1(string str[,bool raw_output])
函数返回的是一个40为的十六进制数,如果参数raw_output为true,则返回一个20为的二进制数。默认raw_output为false。
<?php
echo md5("PHPER");
echo "<br>";
echo sha1("PHPER");
?>
1.Mcrypt扩展库
PHP的主目录下包含了libmcrypt.dll和libmhash.dll文件(libmhash.dll是Mhash扩展库)。首先将文件复制到系统目录windows\system32下,然后在php.ini文件中找到“;extension=php_mcrypt.dll”和“;extension=php_mhash.dll”.
2.Mcrypt库常量
Mcrypt库支持20多种加密算法和8种加密模式,读者可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()查看。
<?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." ";
}
?>
这些算法和模式在实际应用中要用常量来表示,写的时候分别加上前缀MCRYPT_和MCRYPT_MODE_来表示。
TWOFISH算法表示为MCRYPT_TWOFISH
CBC加密模式表示为MCRYPT_MODE_CBC
3.Mcypt应用
<?php
$str="被加密的内容:相见时难别亦难 东风无力百花残";
$key="key:111";
$cipher=MCRYPT_DES;
$modes=MCRYOT_MODE_ECB;
$iv=mcryot_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>";
?>
string mecypt_create_iv(int size[, int source]);
使用Mcrypt进行数据加密,解密之前,首先要创建一个初始化向量iv,
size指定iv的大小,source为iv的源。
source可以取如下值:
MCRYPT_RAND:系统随机数
MCRYPT_DEV_RANDOM:读取目录/dev/random中的数据(UNIX系统)
MCRYPT_DEV_URANDOM:读取目录/dev/urandom中的数据。
string mcrypt_encrypt(string cipher,string key,string data,string mode[, string iv])
cipher:加密算法
key:密钥
data:需要加密的数据
mode:算法模式
iv:初始化向量
string mcrypt_decrypt(string cipher,string key,string data,string mode[,string iv])
Mhash扩展库
1.Mhash扩展库
可以使用mhash_count()和mhash_get_hash_name()函数输出支持的算法名称。
<?php
$num=mhash_count();
echo "Mhash库支持的算法有:";
for($i = 0; $i <= $num ; $i++){
echo $i."=>".mhash_get_hash_name($i)." ";// 输出每一个hash id的名称
}
?>
该函数用来获取参数hash的区块的大小,如mhash_get_block_size(MHASH_CRC32)
string mhash(int hash,string data[,string key]);
改函数返回一个哈希值,参数hash为要使用的算法,参数data是要加密的数据,参数key是加密使用的密钥。
string mhash_keygen_s2k()函数
string mhash_keygen_s2k(int hahs,string password,string salt,int bytes)
该函数将根据参数password和salt返回一个长度为字节的key值,参数hash为要使用的算法,其中salt为一个固定8字节的值,如果用户给出的数值小于8字节,将用0补齐。
<?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;//输出校验码
?>