1. 程式人生 > >php中常用的幾種加密方式以及md5加密漏洞以及解決方案

php中常用的幾種加密方式以及md5加密漏洞以及解決方案

一、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稍微安全一點

簡單使用:

<?php
$str = "113rertrt&&@#$31231334";
$str = sha1($str);
echo $str;//80079e03d65a4ba2314ddca239e7ee08ee50bd2d
 

四、openssl_encrypt
作為被廢棄的mycrypt加密方式的替代,openssl_encrypt自然有很大改進。條件允許,這款加密方式也比較安全方便,破解起來非常困難。

簡單的使用:

<?php
$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 "<hr>";
 
//openssl_decrypt解密
$str_de = openssl_decrypt('rertrtreretrrrtr45=',$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="data:image/png;base64,<?php echo $img_en ?>">
 
</body>
</html>

六、md5加密方式的漏洞及解決方案

程式碼:

<?php
$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加密兩次以上(包含兩次),或者再加上鹽進行加密。如下:

<?php
$str1 = 's878926199a';
$str2 = 's214587387a';
$key = '6655&&[email protected]';
 
//雙重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