15.1 PHP加密函数
视频讲解:光盘TMlx15PHP加密函数.exe
数据加密的基本原理就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,通过这样的途径来达到保护数据不被非法窃取和阅读的目的。
在PHP中能对数据进行加密的函数主要有crypt()、md5()和sha1(),还有加密扩展库Mcrypt和Mash。这里主要介绍其中的3种:crypt()函数、md5()函数和sha1()函数。
15.1.1 使用crypt()函数进行加密
crypt()函数可以完成单向加密功能,语法如下:
string crypt(string str[, string salt]);
其中,str是需要加密的字符串,salt为加密时使用的干扰串。如果省略掉第二个参数,则会随机生成一个干扰串。crypt()函数支持4种算法和salt参数的长度,如表15.1所示。
表15.1 crypt()函数支持的4种算法和salt参数的长度
说明
默认情况下,PHP使用一个或两个字符的DES干扰串,如果系统使用的是MD5,则会使用12个字符。可以通过CRYPT_SALT_LENGTH变量来查看当前所使用的干扰串的长度。
【例15.1】首先声明一个字符串变量$str,赋值为“This is an example! ”,然后使用crypt()函数进行加密并输出。实例代码如下:(实例位置:光盘TMsl151)
<?php $str='This is an example! '; //声明字符串变量$str echo ’加密前$str的值为:'.$str; $crypttostr=crypt($str); //对变量$str加密 echo'<p>加密后$str的值为:'.$crypttostr; //输出加密后的变量 ?>
运行结果如图15.1所示。
图15.1 使用crypt()函数进行加密
按F5键刷新,会发现每次生成的加密结果都不相同,那么该如何对加密后的数据进行判断呢?crypt()函数是单向加密的,密文不可还原成明码,而每次加密后的数据还不相同,这就是salt参数要解决的问题。crypt()函数用salt参数对明文进行加密,判断时,对输出的信息再次使用相同的salt参数进行加密,对比两次加密后的结果来进行判断。
【例15.2】本例对输入的用户名进行检测,如果该用户存在,显示“用户名已存在。”;否则显示“恭喜您:用户名可以使用!”。实例代码如下:(实例位置:光盘TMsl152)
<?php /* 连接数据库 */ $conn = mysqli_connect("localhost", "root", "111") or die("数据库连接错误".mysql_error()); mysqli_select_db($conn, "db_database15") or die("数据库访问错误".mysql_error()); mysqli_query($conn, "set names gb2312"); ?> <form id="form1" name="form1" method="post" action=""> <td><input name="username" type="text" id="username" size="15" /></td> <td><input type="submit" name="Submit" value="检查" id="Submit" /></td> </form> <?php if(isset($_POST['username'])&&trim($_POST['username'])! =""){ //trim()函数去掉字符串两边的空格 $usr=crypt(trim($_POST['username']), "tm"); //对用户名进行加密 $sql="select*from tb_user where user='".$usr."'"; //生成查询语句 $rst=mysqli query($conn, $sql); //执行语句,返回结果集 if(mysqli num rows($rst)>0){ //如果结果集大于0 echo"<font color='red'>用户名已存在。</font>"; //说明用户名存在 }else{ //否则说明该用户名可用 echo "<font color='green'>恭喜您:用户名可以使用!</font>"; } } ?>
运行结果如图15.2所示。
图15.2 使用crypt()函数进行数据验证
注意
实例代码中加粗显示的函数为数据库操作函数,如果读者对PHP连接MySQL数据库不了解,可以先参考第16章MySQL数据库基础,然后再回来学习本实例。
15.1.2 使用md5()函数进行加密
md5()函数使用MD5算法。MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),它的作用是把不同长度的数据信息经过一系列的算法计算成一个128位的数值,就是把一个任意长度的字节串变换成一定长的大整数。注意这里是“字节串”而不是“字符串”,因为这种变换只与字节的值有关,与字符集或编码方式无关。md5()函数的格式如下:
string md5 ( string str [, bool raw_output] );
其中,字符串str为要加密的明文,raw_output如果设为true,则函数返回一个二进制形式的密文,该参数默认为false。
很多网站注册用户的密码都是先使用MD5加密,然后再保存到数据库中的。用户登录时,程序把用户输入的密码计算成MD5值,然后再去和数据库中保存的MD5值进行比较。在这个过程中,程序自身都不会“知道”用户的真实密码,从而保证注册用户的个人隐私,提高安全性。
【例15.3】本例实现会员注册和登录的功能,将会员注册的密码通过md5()进行加密后保存到数据库中。(实例位置:光盘TMsl153)
其操作步骤如下:
(1)创建conn.php文件,完成与db_database15数据库的连接。其代码如下:
<?php $conn=mysqli_connect("localhost", "root", "111")or die("数据库连接失败".mysql_error()); //连接服务器 mysqli_select_db($conn, "db_database15"); //连接数据库 mysqli_query($conn, "set names gb2312"); //设置编码格式 ?>
(2)创建会员注册页面,即register.php文件。在该文件中,创建form表单,通过register方法对表单元素值进行验证;添加表单元素,完成会员名和密码的提交;将表单中的数据提交到register_ok.php文件中,通过面向对象的方法完成会员注册信息的提交操作。其注册页面如图15.3所示。
图15.3 会员注册页面
(3)创建register_ok.php文件,获取表单中提交的数据,通过md5()函数对密码进行加密,使用面向对象的方法完成会员注册信息的提交。其代码如下:
<?php class chkinput{ //定义chkinput类 var$name; //定义成员变量 var$pwd; //定义成员变量 function chkinput($x, $y){ //定义成员方法 $this->name=$x; //为成员变量赋值 $this->pwd=$y; //为成员变量赋值 } function checkinput(){ //定义方法,完成用户注册 include"conn/conn.php"; //通过include调用数据库连接文件 $info = mysqli_query ($conn, "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.location.href='index.php'; </script>"; } } } $obj = new chkinput (trim($_POST['name']), trim(md5($_POST['pwd']))); //实例化类 $obj->checkinput(); //根据返回对象调用方法执行注册操作 ?>
(4)创建index.php和index_ok.php文件,实现会员登录的功能,具体代码可参考光盘中的内容,这里不作讲解。
在会员注册成功后,可以查看一下存储在数据库中的数据,通过MD5加密后的密码如图15.4所示。
图15.4 MD5加密后的密码
15.1.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。
注意
sha后面的1是阿拉伯数字(1、2、3)里的1,不是字母l(L),读者一定要注意。
【例15.4】本例对一字符串进行MD5和SHA加密运算,实例代码如下:(实例位置:光盘TMsl154)
<? php echo md5('PHPER'); //使用md5()函数加密字符串PHPER php echo sha1('PHPER'); //使用sha1()函数加密字符串PHPER ?>
MD5加密运算和SHA加密运算字符串的对比效果如图15.5所示。
图15.5 使用md5()和sha1()函数的效果对比
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。