PHP 加密技术

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_SHA256 SHA-256 算法使用一个以 $5$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。
CRYPT_SHA512 SHA-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()函数输出支持的算法名称。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郎涯技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值