PHP 加密技术

来源:互联网 发布:矩阵的秩的性质总结 编辑:程序博客网 时间:2024/05/16 00:56
PHP中对数据进行加密的函数有:crypt(),md5()和shal(),还有加密扩展库McryptMhash

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);//输出:c98885c04c1208fd4d0b1dadd3bd2a9ff4d042caecho "<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()函数输出支持的算法名称。
0 0
原创粉丝点击