一、md5(php中的最常用的加密方式)
在用md5进行加密时,至少要将md5加密两次以上(包含两次),或者再加上盐进行加密
二、password_hash(php5.5以上版本才可以使用)
官方说明链接:http://www.php.net/manual/zh/function.password-hash.php
1. 用户注册时提交过来密码,我们对用户密码进行加密,这里选择password_hash进行加密
2. 加密之后,将加密好的密码存储到数据表中
3.用户再次登录时,我们从表中取出密码,并使用password_verify函数进行校验,查看两种密码是否相同
简单的使用:
//用户注册时提交的密码
$pass_user_commit = '123456';
//对用户提交的密码进行password_hash加密,并存储到数据库
$pass = password_hash($pass_user_commit,PASSWORD_BCRYPT);
//echo $pass;
//第一次输出生成的密码: $2y$10$Y/rlaKniAaj9y70zJgMfsespKfHNZjM5FyjRRvgbGlKXyr.1yJIIG
//第二次输出生成的密码: $2y$10$vveX2r5nQr4mc2M.8vAdDeTShA0gMX.73uMd18V.Y.7E44qLloqgi
//由此可见,由password_hash函数生成的密码是动态的,破解几乎很难
//用户登录时提交的密码
$pass_user = '12345678';
//将用户登录时提交的密码与用户注册时提交的密码进行对比
$re = password_verify($pass_user,$pass);
if ($re) {
echo "密码真确";
} else {
echo "密码错误";
}
三、sha1
和md5作用类似,加密方式也类似,相当于md5的加强版吧,据说是比md5稍微安全一点
简单使用:
$str = "113rertrt&&@#$31231334";
$str = sha1($str);
echo $str;//80079e03d65a4ba2314ddca239e7ee08ee50bd2d
四、openssl_encrypt
作为被废弃的mycrypt加密方式的替代,openssl_encrypt自然有很大改进。条件允许,这款加密方式也比较安全方便,破解起来非常困难。
简单的使用:
$str = 'gfdfg435325524tt1';
$openssl_key = '4541&Ͷ@66';
$en_method = 'AES-256-ECB';
//get_openssl_cipher_methods();//获取openssl_encrypt的加密方式列表
//openssl_encrypt加密
$str_en = openssl_encrypt($str,$en_method,$openssl_key);
echo $str_en;//R8ZhAYeGBIO2FUVgRj1lD9bHjA3BjSRXDboVC83eXc0=
echo "
";";
print_r($ciphers);
echo "
五、base64_encode
使用场景:加密url,传输二进制数据(如邮件主题以及图片等),加密cookie,生成密钥,证书等。
这里以加密图片(对图片进行编码)为例:
六、md5加密方式的漏洞及解决方案
代码:
$str1 = 's878926199a';
$str2 = 's214587387a';
//echo md5($str1);//0e545993274517709034328855841020
//echo md5($str2);//0e848240448830537924465865611904
if (md5($str1) == md5($str2)) {
echo 'true';
} else {
echo 'false';
}
理论上,上面的代码应该返回false,但实际上却返回了true,这就造成了md5加密方式的漏洞。
原因:
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
解决方案:
(1)在用md5进行加密时,至少要将md5加密两次以上(包含两次),或者再加上盐进行加密。如下:
$str1 = 's878926199a';
$str2 = 's214587387a';
$key = '6655&&skks@';
//双重md5加密方式
//echo md5(md5($str1))."
";//b91d1a7e392c6041ae80b5c6c74a1d83
//echo md5(md5($str2));//31e723c4b5c80632064006c430236731
//md5加盐加密方式
//echo md5($str1.$key)."
";//ade1b1ba6d7858ca5581268765184c81
//echo md5($str2.$key);//36ef02a862366d6dc53c1aa835eadf87
//双重md5加盐加密方式
//echo md5(md5($str1.$key))."
";//bcc445ad0e2f0d5bc8d57185ea2b9184
//echo md5(md5($str2.$key));//90a5e5be9dd2176a63faa28e623dfdb3
(2)使用其他加密方式,比如password_hash,openssl_encrypt