<转>[PHP] PHP 加密技术概述

一、加密技术概述
数据加密的 基本原理就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,通过这样的途径来达到保护数据不被非法窃取和阅 读的目的。在PHP中能对数据进行加密的函数主要有crypt()  md5()和shal(),还有加密扩展库mcrypt和mash
二、PHP加密函数
PHP内置了多种加密函数,这里主要介绍其中的3种,crypt()   md5() shal()  函数。
   1、使用crypt()函数进行加密
该函数可以完成单向加密函数功能,语法格式如下:
String crypt(string str[,string salt]);
其中,str参数是需要加密的字符串,salt参数为加密时使用的干扰串。如果省略掉第二参数,则会随机生成一个干扰串。该函数支持4种算法和长度:如下:
   算法                                     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 anexample1';
      Echo '加密前的$str的值为:'.$str;
     $crypttorstr=crypt($str);
      Echo '加密后的$str的值为:'.$str;
   ?>
按F5键刷新,会出现每次生成的加密后的结果都不相同,那么问题就出来了;要对加密后的数据进行判断,那该怎么办?该函数是单向加密的,密文不可还原成明码,而每次加密后的数据还不相同,怎么进行判断?
这就是strl函数参数要解决的问题。该函数用salt参数对明文进行加密,判断时,对输出的信息再次使用相同的salt参数进行加密,对比两次加密后的结果来进行判断。
例:
  <?php
       $link=mysql_connect("localhost","root","123456")or die("数据库服务器连接错误!".mysql_error());
       mysql_select_db("liumiao",$link) or die("数据库连接错误!".mysql_error());
       mysql_query("set names gb2312");
  ?>
<form id="form1"name="form1" method="post" action="">
    <input type="text" name="username"id="username" size="15" />
        <input type="submit"name="submit" value="检查"id="submit" />
</form>  
<?php
    if(trim($_POST['username'])!=""){
           $user=crypt(trim($_POST['username']),"tm");
               $sql="select * from h1 wherename='".$user."'";
               $rst=mysql_query($sql,$link);
               if(mysql_num_rows($rst)>0){
                  echo "<font color='red'>用户名已存在。</font>";
               }else{
                  echo "<font color='green'>恭喜您,用户名可以使用</font>";
               }
        }else{
            echo "没有输入用户名。";
        }
?>
   2、使用md5()函数进行加密
    使用crypt()函数保护重要数据并不是最安全的,只能用在对安全性要求较低的系统中。如果想要提高安全性,则需要使用md5()函数。
    Md5()函数使用md5算法。Md5的全称message-digestalgorithm 5(信息-摘要算法),它的作用是把不同长度的数据信息经过一系列的算法计算成一个128位的数值,就是把一个任意长度的字节串变成一定长度的大整数。注 意这里是“字节串”而不是“字符串”,因为这种变换只与字节的值有关,与字符集或编码方式无关。Md5()函数的格式如下:
String md5(string str[,bool raw_output]);
其中,字符串str为要加密的明文,raw_output参数如果设为真,则函数返回一个二进制形式的密文,该参数默认为false。
很多网站注册用户的密码都是先使用md5加密,然后再保存到数据库中的。用户登录时,程序把用户输入的密码计算成md5值,然后再去和数据库保存的md5值进行比较。在这个过程中,程序自身都不会”知道”用户的真实密码,从而保证了注册用户的个人隐私,提高了安全性。
   3、使用sha1()函数进行加密
和md5类似的还有sha算法。Sha全称为secure hashalgorithm(安全哈希算法),PHP提供的sha1()函数使用的就是sha算法,该函数的语法格式如下:
String sha1(string str[,bool raw_outpub]);
函数返回一个40位的十六进制数,如果参数raw_output为真,则返回一个20位二进制。默认raw_output为false.
注意:sha后面的1是阿拉伯数字(1、2、3)里的1,不是字母L,读者一定要注意。
<?php
     echo md5("PHPER");
        echo "<br />";
        echo sha1("PHPER");
?>
三、PHP加密扩展库
PHP除了自带的几处加密函数外,还有功能更全面的加密扩展库mcrypt和mhash。其中mcrypt扩展库可以实现加密解密功能,就是即能将明文加密,也可以将密文还原。Mhash扩展库则包含了md5在内的多种hash算法实现的混编函数。
Mcrypt扩展库:
1、mcrypt库安装
单向加密的优势是密文无法还原为明文,即使数据被截获也不会造成资料外泄。但有时,还需要将密文还原成明文,这时就需要使用双向加密技术了。Mcrypt是一个功能十分强大的加密算法扩展库。
    在标准的PHP安装过程中并没有把mcrypt安装上,但PHP的主目录下包含了libmarypt.dll和libmhash.dll文件 (libmhash.dll是mhash扩展库,这里一起安装上),首先将文件复制到系统目录system32下,然后在PHP.ini文件中找 到;extension-php_mcrype.dll和;extension-php_mhash.dll这两个语句,将前面的分号;去掉,最后重新启 动服务器,即可使用这两个扩展库。
2、Mcrypt库常量
       例:
<?php
     $en_dir=mcrypt_list_algorithms();   //函数返回mcrypt支持的加密算法数组
        echo "Mcrypt支持的算法有:";
        foreach($en_dir as $en_value){
            echo $en_value;
        }
?>
<?php
    $mo_dir=mcrypt_list_algorithms();
        echo "<br />mcrypt支持的加密模式有:";
        foreach($mo_dir as $mo_value){
            echo $mo_value;
        }
?>
    这些算法和模式在实际应用中要常量来表示,写的时候分别加上前缀mcrypt_和mcrypt_mode_来表示,如:
Twofish算法表示为mcrypt_twofish.
Cbc加密模式表示为mcrypt_mode_cbc
3、Mcrypt应用
       例:
<?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."<br />";
        $str_encrypt=mcrypt_encrypt($cipher,$key,$str,$modes,$iv);
        echo "加密后:".$str_encrypt."<br/>";
        $str_decrypt=mcrypt_decrypt($cipher,$key,$str_encrypt,$modes,$iv);
        echo "还原:".$str_decrypt."<br/>";
?>
下面对以上部分函数进行讲解分析:
Stringmcrypt_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系统)。
Nt_mcrypt_get_iv_size(stringcipher,string mode)该函数返回初始化向量iv的大小。函数中的两个参数是前面刚介绍过的加密算法(cipher)和算法模式(mode)。
Stringmcrypt_encrypt(string cipher,string key,string data,string mode[,string iv])初始化向量后,即可使用mcrypt_encrypt加密函数对数据进行加密。该函数的5个参数分别如下:
Cipher:加密算法。这里的加密算法可以和初始化向量中的加密算法不一样。
Key:密钥。
Data:需要加密的数据。
Mode:算法模式。 可以和初始化向量中的模式不一样。
Iv:初始化向量。
Stringmcrypt_decrypt(string cipher,string key,string data,string mode[,string iv]):解密函数mcrypt_decrypt()和加密函数mcrypt_encrypt()的参数几乎是一样的。唯一不同的是参数data,这里的data为需要解密的数据,而不是原始数据。
注意:加密函数和解密函数中cipher、key、mode参数必须要一致,否则数据不会被还原。
Mhash扩展库
1、mhash库安装
       不在重复。
2、Mhash库常量
       例:
<?php
    $num=mhash_count();
        echo "Mhash库支持的算法有:<br />";
        for($i=0;$i<=$num;$i++){
            echo$i."=>".mhash_get_hash_name($i)."<br />";
        }
?>
    如果在实际应用中使用上面的常量,需要在算法名称前面加上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,stringsalt,int bytes)
该函数将根据password和salt返回一个长度为字节的key值,参数hash为要使用的算法。其中salt为一个固定8字节的值。如果用户给出的数值小于8字节,将用0补齐。
例:
07.txt文档代码如下:
中国人民
Index.php代码如下:
<?php
     $filename="07.txt";
        $str=file_get_contents($filename);
        $hash=2;
        $password="111";
        $salt="1234";
        $key=mhash_keygen_s2k(1,$password,$salt,10);
        $str_mhash=bin2hex(mhash($hash,$str,$key));
        echo "文件07.txt的校校验是:".$str_mhash;

?>

posted on 2015-09-21 00:20  hahahahahai12  阅读(209)  评论(0)    收藏  举报

导航