您当前的位置: 首页 > 网站编程 > PHP教程 > PHP对数据进行加密

PHP对数据进行加密

作者:guanchaofeng 来源:不详 发布时间: 2009-10-29 14:58 点击:
综述:密码学是研究编制密码(我们简称为加密:encode)和破译密码(我们称之为解密:decode)的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。通常情况下,人

PHP对数据进行加密

  综述:密码学是研究编制密码(我们简称为加密:encode)和破译密码(我们称之为解密:decode)的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。通常情况下,人们将可懂的文本称为明文;将明文变换成的不可懂的文本称为密文。把明文变换成密文的过程叫加密;其逆过程,即把密文变换成明文的过程叫解密。
  
  PHP中提供了哪些数据加密功能?
  
  PHP提供了crypt()函数完成加密功能:
  
  stringcrypt(stringinput_string[,stringsalt])
  
  这一函数完成被称作单向加密的功能,也就是说,它可以加密一些明码,但不能够将密码转换为原来的明码。单向加密的口令一旦落入第三方人的手里,由于不能被还原为明文,因此也没有什么大用处。在验证用户输入的口令时,用户的输入采用的也是单向算法,如果输入与存储的经加密后的口令相匹配,则输入的口令一定是正确的。
  
  这个函数的input_string参数是需要加密的字符串,第二个参数salt是一个位字串,它能够影响加密的暗码,进一步地排除被称作预计算攻击的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果你的系统使用的是MD5,它会使用一个12个字符的干扰串。我们可以通过执行下面的命令发现系统将要使用的干扰串的长度:
  
  print"系统使用的干扰串的长度是:"。CRYPT_SALT_LENGTH;
  
  crypt()支持四种算法,下面是它支持的算法和相应的salt参数的长度:
  
  算法Salt长度
  CRYPT_STD_DES2-character(默认)
  CRYPT_EXT_DES9-character
  CRYPT_MD512-characterbeginningwith$1$
  CRYPT_BLOWFISH16-characterbeginningwith$2$
  
  怎样将PHP的数据加密功能应用于用户验证?
  
  我们用crypt()实现用户身份验证。比如我们用一段PHP程序限制对一个目录的访问,只允许注册用户访问这一目录。我们把资料存储MySQL数据库的一个表(这个数据表名为members)中:
  
  mysql>CREATETABLEmembers(
  ->usernameCHAR(14)NOTNULL,
  ->passwordCHAR(32)NOTNULL,
  ->PRIMARYKEY(username)
  ->);
  
  
  然后,我们可以输入用户的数据到该表中:
  
  用户名密码
  TomkeloD1C377lKE
  Johnba1T7vnz9AWgk
  BillpaLUvRWsRLZ4U
  
  这些加密的口令对应的明码分别是Tom、John和Bill。我们将根据口令的前二个字母创建干扰串:
  
  $enteredPassword。
  $salt=substr($enteredPassword,0,2);
  $userPswd=crypt($enteredPassword,$salt);
  
  
  //$userPswd然后就和用户名一起存储在MySQL中
  
  crypt()和Apache的口令-应答验证系统的应用
  
  <?php
  $host="localhost";//主机
  $username="Tom";//用户名
  $passwd="Helloworld";//密码
  $db="users";//数据库名
  
  //设置是否通过验证标志,默认为否
  $authorization=0;
  
  //提示用户输入帐号和密码
  
  if(isset($PHP_AUTH_USER)&&isset($PHP_AUTH_PW)){
  mysql_pconnect($host,$username,$passwd)ordie("不能连接到MySQL服务器!");
  mysql_select_db($db)ordie("不能选择数据库!");
  
  //进行加密
  $salt=substr($PHP_AUTH_PW,0,2);
  $encrypted_pswd=crypt($PHP_AUTH_PW,$salt);
  
  //SQL查询语句
  $query="SELECTusernameFROMmembersWHEREusername=\'$PHP_AUTH_USER\'ANDpassword=\'$encrypted_pswd\'";
  
  //执行查询
  if(mysql_numrows(mysql_query($query))==1){
  $authorization=1;
  }
  }
  
  if(!$authorization){
  header(\'WWW-Authenticate:Basicrealm="用户验证"\');
  header(\'HTTP/1。0401Unauthorized\');
  print"无法通过验证";
  exit;
  }else{
  print"已经加密";
  }
  ?>
  
  
  在缺省状态下使用的crypt()并不是最安全的,所以如果需要较高的安全性能,就需要其他更好的算法,比如md5(),这一函数使用MD5散列算法。
  
  如何通过MD5方式进行加密?
  
  PHP中通过MD5方式加密的函数有md5(),它的一个作用是混编。
  
  一个混编函数可以将一个可变长度的信息变换为具有固定长度被混编过的输出,也被称作"信息文摘",这是十分有用的,因为一个固定长度的字符串可以用来检查文件的完整性和验证数字签名与用户身份。PHP内置的md5()混编函数将把一个可变长度的信息转换为128位(32个字符)的信息文摘。混编的一个有趣的特点是:不能通过分析混编后的信息得到原来的明码,因为混编后的结果与原来的明码内容没有依赖关系。即便只改变一个字符串中的一个字符,也将使得MD5混编算法计算出二个截然不同的结果。我们首先来看下表的内容及其相应的结果:
  
  使用md5()混编字符串
  
  <php
  $input="Hello,PHPworld!";
  $output=md5($input);
  print"输出:$output";
  ?>
  
  
  结果:
  
  输出:7996b5e0804042fd531907a4900f190e
  
  注意,结果的长度为32个字符。我们把$input的值稍微改变一下:
  
  使用md5()对一个稍微变化的字符串进行混编
  
  <?php
  $input="Hello,PHPWorld!";
  $output=md5($input);
  print"输出:$output";
  ?>
  
  
  结果:hash2:f0456d48ed06a5c35b1e42561fa7a016
  
  可以发现,尽管二个结果的长度都是32个字符,但明文中一点微小的变化使得结果发生了很大的变化,我们可以利用这个特点来检查数据中微小变化。

分享到:
本文"PHP对数据进行加密"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4