您的位置:首页 > 编程语言 > PHP开发

PHP 加密技术

2016-01-26 22:28 537 查看
PHP中对数据进行加密的函数有:crypt(),md5()和shal(),还有加密扩展库Mcrypt和Mhash。

1、crypt():
可以完成单向加密功能,(无法解密)。
格式:string crypt(string str[,string salt]);
str参数是需要加密的字符串,salt参数为加密时使用的干扰串。如省略掉第二个参数,则会随机生成一个干扰串。

说明:缺省情况下,PHP使用一个2个字符的DES干扰串,如果系统使用的是MD5,则会使用一个12个字符。可以通过CRYPT_SALT_LENCTH变量来查看当前所使用的干扰串的长度,该函数支持4种算加密法和长度。

[CRYPT_SALT_LENGTH]默认的加密长度。使用标准的 DES 加密,长度为 2
[CRYPT_STD_DES]基于标准 DES 算法的散列使用 "./0-9A-Za-z" 字符中的两个字符作为盐值。在盐值中使用非法的字符将导致 crypt() 失败。
[CRYPT_EXT_DES]扩展的基于 DES 算法的散列。其盐值为 9 个字符的字符串,由
1 个下划线后面跟着 4 字节循环次数和 4 字节盐值组成。它们被编码成可打印字符,每个字符 6 位,有效位最少的优先。0 到 63 被编码为 "./0-9A-Za-z"。在盐值中使用非法的字符将导致 crypt() 失败。
[CRYPT_MD5]MD5 散列使用一个以 $1$ 开始的 12 字符的字符串盐值。
[CRYPT_BLOWFISH]Blowfish 算法使用如下盐值:“$2a$”,一个两位 cost 参数,“$” 以及 64 位由 “./0-9A-Za-z” 中的字符组合而成的字符串。在盐值中使用此范围之外的字符将导致 crypt() 返回一个空字符串。两位 cost 参数是循环次数以 2 为底的对数,它的范围是 04-31,超出这个范围将导致 crypt() 失败。
CRYPT_SHA256SHA-256 算法使用一个以 $5$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。
CRYPT_SHA512SHA-512 算法使用一个以 $6$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。
<?php
$password='jellybool.com';
echo crypt($password);
//输出:$1$Fe0.qr5.$WOhkI4/5VPo7n7TnXHh5K
/*第二个$与第三个$之间的八个字符是由PHP生成的,每刷新一次就变一次
*/
echo "<hr>";
echo crypt($password,"jellybool");
//输出:je7fNiu1KNaEs
/*当我们要加自定义的盐值时,如例子中的jellybool作为第二个参数直接加入,
超出两位字符的会截取前两位*/
echo "<hr>";
echo  crypt($password,'$1$jellybool$');
//输出:$1$jellyboo$DxH7wF7SygRpWb6XBBgfH/
/*    crypt加密函数有多种盐值加密支持,以上例子展示的是MD5散列作为盐值,该方式下
盐值以$1$$的形式加入,如例子中的jellybool加在后两个$符之间,
超出八位字符的会截取前八位,总长为12位;crypt默认就是这种形式。
*/
echo "<hr>";
//crypt还有多种盐值加密支持,详见手册

2、MD5():
格式:string md5(string str[,bool raw_output]);
md5()默认情况下以 32 字符十六进制数字形式返回散列值,它接受两个参数,第一个为要加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,md5()则会返回原始的 16 位二进制格式报文摘要
md5()为单向加密,没有逆向解密算法,但是还是可以对一些常见的字符串通过收集,枚举,碰撞等方法破解
<?php
$username='jellybool';
$password='jellybool.com';
/*简单地对字符串进行md5加密*/
echo md5($username);
echo "<hr>";
echo md5($password);
echo "<hr>";
/*更推荐的做法是对重要的敏感数据进行多次加密,以防被轻易破解*/
echo md5(md5($password));

/*以上输出:
username:4f5436e5d72608fb647b691e8edcf42e
password:7bf02cf0f4af6da4accbc73d2a175476
password(两次加密):864704bb35754f8cd0232cba6b91521b
*/

3、sha1():
格式:string sha1(string str [,bool raw_output])
说明:函数返回一个40位的16进制数,如果参数raw_output为真,则返回一个20位的二进制数。默认为false。
区别:相同字符串多次刷新,crypt()加密会出现多个不同效果;MD5()和sha1()效果不会改变。
<?php
$my_intro="jellybool";
echo sha1($my_intro);
//输出:c98885c04c1208fd4d0b1dadd3bd2a9ff4d042ca
echo "<hr>";
//当然,可以将多种加密算法混合使用
echo md5(sha1($my_intro));
//输出:94f25bf9214f88b1ef065a3f9b5d9874
//这种方式的双重加密也可以提高数据的安全性

4、PHP加密扩展库:
Mcrypt()扩展库:既能加密又能解密。
安装Mcrypt()扩展库:首先把PHP目录下的libmcrypt.dll文件copy到系统目录下,然后在php.ini文件中找到”;extension=php_mcrypt.dll”将前面的分号去掉,最后重启服务器。
Mcrypt()扩展库常量:支持20多种加密算法和8种加密模式,可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来查看。
Mcrypt应用:初始化向量:mcrypt_create_iv(该向量的大小,向量的源(MCRYPT_RAND:取系统的随机数))
获取到初始化向量的大小:mcrypt_get_iv_size(加密算法;加密模式);
加密:mcrypt_encrypt(加密算法,密钥,需要加密的数据,算法模式,向量);
解密:mcrypt_decrypt(加密算法,密钥,需要解密的数据,算法模式,向量);

5、Mhash扩展库:
安装Mhash扩展库:首先把PHP目录下的libmhash.dll文件copy到系统目录下,然后在php.ini文件中找到”;extension=php_mhash.dll”将前面的分号去掉,最后重启服务器。
Mhash扩展库常量:Mhash扩展库支持MD5,SHA1,CRC32等多种散列算法,可以使用mhash_count()和mhash_get_hash_name()函数输出支持的算法名称。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  加密技术