一、md5
要說php中的最常用的加密方式,md5可以說是當仁不讓。
使用起來也很簡單便捷。
注:使用方式請看? 六、md5加密方式的漏洞及解決方案
?
二、password_hash
作為php5.5以上版本專門用于加密的方式,自然有其獨到之處。
使用方式鏈接:https://blog.csdn.net/m_nanle_xiaobudiu/article/details/79285125
php官方說明鏈接:http://www.php.net/manual/zh/function.password-hash.php
優點:安全性極高
缺點:php專有函數,不能在其他語言上進行驗證。
?
三、sha1
和md5作用類似,加密方式也類似,相當于md5的加強版吧,據說是比md5稍微安全一點
簡單使用:
<?php
$str = "45456mkmk&&@#$544564";
$str = sha1($str);
echo $str;//80079e03d65a4ba2314ddca239e7ee08ee50bd2d
?
四、openssl_encrypt(推薦)
作為被廢棄的mycrypt加密方式的替代,openssl_encrypt自然有很大改進。條件允許,這款加密方式也比較安全方便,破解起來非常困難。
簡單的使用:
<?php
$str = 'mmmo56451212158ss0';
$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 "<hr>";//openssl_decrypt解密
$str_de = openssl_decrypt('R8ZhAYeGBIO2FUVgRj1lD9bHjA3BjSRXDboVC83eXc0=',$en_method,$openssl_key);
echo $str_de;//mmmo56451212158ss0/*** 獲取openssl_encrypt method* 就是openssl_encrypt的第二個參數*/
function get_openssl_cipher_methods()
{$ciphers = openssl_get_cipher_methods();echo "<pre>";print_r($ciphers);echo "</pre>";
}
?
五、base64_encode
使用場景:加密url,傳輸二進制數據(如郵件主題以及圖片等),加密cookie,生成密鑰,證書等。
這里以加密圖片(對圖片進行編碼)為例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><?php//對圖片進行64位編碼$img_en = base64_encode(file_get_contents('./233.jpg'));//注:編碼后,會生成一串字符串,將此生成的字符串填入img的標簽里即可,如下?><!--html顯示編碼后的圖片-->
<img src="https://img-blog.csdnimg.cn/2022010703450235671.png"></body>
</html>更多關于base64_encode使用方式: https://blog.csdn.net/u011250882/article/details/49679555
?
六、md5加密方式的漏洞及解決方案
代碼:
<?php
$str1 = 's878926199a';
$str2 = 's214587387a';
//echo md5($str1);//0e545993274517709034328855841020
//echo md5($str2);//0e848240448830537924465865611904if (md5($str1) == md5($str2)) {echo 'true';
} else {echo 'false';
}
理論上,上面的代碼應該返回false,但實際上卻返回了true,這就造成了md5加密方式的漏洞。
原因:
PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進行比較,它把每一個以”0E”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認為他們相同,都是0。
解決方案:
(1)在用md5進行加密時,至少要將md5加密兩次以上(包含兩次),或者再加上鹽進行加密。如下:
<?php
$str1 = 's878926199a';
$str2 = 's214587387a';
$key = '6655&&skks@';//雙重md5加密方式
//echo md5(md5($str1))."<br>";//b91d1a7e392c6041ae80b5c6c74a1d83
//echo md5(md5($str2));//31e723c4b5c80632064006c430236731//md5加鹽加密方式
//echo md5($str1.$key)."<br>";//ade1b1ba6d7858ca5581268765184c81
//echo md5($str2.$key);//36ef02a862366d6dc53c1aa835eadf87//雙重md5加鹽加密方式
//echo md5(md5($str1.$key))."<br>";//bcc445ad0e2f0d5bc8d57185ea2b9184
//echo md5(md5($str2.$key));//90a5e5be9dd2176a63faa28e623dfdb3
(2)使用其他加密方式,比如password_hash,openssl_encrypt
?
?
?