php 几种加密方法实例

91 篇文章 0 订阅
91 篇文章 0 订阅

PHP提供了crypt()函数完成加密功能: 

    string  crypt  (string  input_string  [,  string  salt])


  这一函数完成被称作单向加密的功能,也就是说,它可以加密一些明码,但不能够将密码转换为原来的明码。单向加密的口令一旦落入第三方人的手里,由于不能被还原为明文,因此也没有什么大用处。在验证用户输入的口令时,用户的输入采用的也是单向算法,如果输入与存储的经加密后的口令相匹配,则输入的口令一定是正确的。 

  这个函数的input_string参数是需要加密的字符串,第二个参数salt是一个位字串,它能够影响加密的暗码,进一步地排除被称作预计算攻击的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果你的系统使用的是MD5 ,它会使用一个12个字符的干扰串。我们可以通过执行下面的命令发现系统将要使用的干扰串的长度: 

    print "系统使用的干扰串的长度是:". CRYPT_SALT_LENGTH; 

  crypt()支持四种算法,下面是它支持的算法和相应的salt参数的长度: 
[注:以下用表格] 

算法
Salt长度
CRYPT_STD_DES2-character  (默认)CRYPT_EXT_DES9-characterCRYPT_MD512-character  beginning  with  $1$CRYPT_BLOWFISH16-character  beginning  with  $2$


  怎样将PHP的数据加密功能应用于用户验证? 

  我们用crypt()实现用户身份验证。比如我们用一段PHP程序限制对一个目录的访问,只允许注册用户访问这一目录。我们把资料存储MySQL数据库的一个表(这个数据表名为members)中: 

    mysql>CREATE  TABLE  members 
    ->username  CHAR(14)  NOT  NULL, 
    ->password  CHAR(32)  NOT  NULL, 
    ->PRIMARY  KEY(username) 
    ->);


  然后,我们可以输入用户的数据到该表中: 

用户名
密码
TomkeloD1C377lKEJohnba1T 7vnz9AWgkBillpaLUvRWsRLZ 4U


  这些加密的口令对应的明码分别是Tom、John和Bill。我们将根据口令的前二个字母创建干扰串: 

    $enteredPassword. 
    $salt  substr($enteredPassword,  0,  2); 
    $userPswd  crypt($enteredPassword,  $salt);


    // $userPswd然后就和用户名一起存储在MySQL 中 

  crypt()和Apache的口令-应答验证系统的应用 

    <?php 
    $host  "localhost";  //主机
    $username  "Tom";  //用户名
    $passwd  "Hello  world";  //密码
    $db  "users";  //数据库名 

    //  设置是否通过验证标志,默认为否
    $authorization  0; 

    //  提示用户输入帐号和密码 

    if  (isset($PHP_AUTH_USER)  &&  isset($PHP_AUTH_PW)){
      mysql_pconnect($host,  $username,  $passwd)  or  die("不能连接到MySQL服务器!"); 
      mysql_select_db($db)  or  die("不能选择数据库!"); 

      //  进行加密
      $salt  substr($PHP_AUTH_PW,  0,  2); 
      $encrypted_pswd  crypt($PHP_AUTH_PW,  $salt); 

      //SQL查询语句
      $query  "SELECT  username  FROM  members  WHERE  username  \'$PHP_AUTH_USER\'  AND  password  \'$encrypted_pswd\'"; 

      //  执行查询
      if  (mysql_numrows(mysql_query($query))  ==  1)  {
        $authorization  1; 
      }
    } 

    if  (!  $authorization){
      header(\'WWW-Authenticate:  Basic  realm="用户验证"\'); 
      header(\'HTTP/1.0  401  Unauthorized\'); 
      print  "无法通过验证"; 
      exit; 
    }else  {
      print  "已经加密"; 
    }
    ?>


  在缺省状态下使用的 crypt()并不是最安全的,所以如果需要较高的安全性能,就需要其他更好的算法,比如md5(),这一函数使用MD5散列算法。 

  如何通过MD5方式进行加密? 

  PHP中通过MD5方式加密的函数有md5(),它的一个作用是混编。 

  一个混编函数可以将一个可变长度的信息变换为具有固定长度被混编过的输出,也被称作"信息文摘",这是十分有用的,因为 一个固定长度的字符串可以用来检查文件的完整性和验证数字签名与用户身份。PHP内置的md5()混编函数将把一个可变长度的信息转换为128位(32个字符)的信息文摘。混编的一个有趣的特点是:不能通过分析混编后的信息得到原来的明码,因为混编后的结果 与原来的明码内容没有依赖关系。即便只改变一个字符串中的一个字符,也将使得MD5混编算法计算出二个截然不同的结果。我们首先来看下表的内容及其相应的结果: 

  使用md5()混编字符串 

    <php 
    $input  "Hello,PHP  world!"; 
    $output  md5($input); 
    print  "输出:  $output  "; 
    ?>


  结果: 

    输出: 7996b5e0804042fd531907a4900f190e 

  注意,结果的长度为32个字符。我们把$input的值稍微改变一下: 

  使用md5()对一个稍微变化的字符串进行混编 

    <?php 
    $input  "Hello,PHP  World!"; 
    $output  md5($input); 
    print  "输出:  $output  "; 
    ?>


  结果: 

    hash2: f0456d48ed06a5c35b1e42561fa7a016 
  可以发现,尽管二个结果的长度都是32个字符,但明文中一点微小的变化使得结果发生了很大的变化,我们可以利用这个特点来检查数据中微小变化。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值