爲安全計,請不要再使用md5

早在2010年,美國軟件工程學會(SEI)就認爲MD5算法已被破解,再也不適用。
"cryptographically broken and unsuitable for further use"
考慮到國內依舊在普遍使用MD5算法於安全領域,寫此爲,但願引發你們對安全的重視。php

MD5函數過去一般用於數據的完整性校驗和用戶密碼的加密保存。算法

一 數據完整性校驗

常見的應用是數據庫

  1. 軟件完整性。一般軟件簽名不會對整個軟件簽名,而是對軟件的HASH值簽名。
    微軟早期的應用軟件簽名就是使用的md5算法,還有人們在網絡上下載軟件,爲確保軟件沒被修改,經常使用MD5值作校驗完整性。
  2. 開放API, 爲了防止用戶修改API請求的參數,API提供商經常使用MD5值校驗請求的完整性。
    以上應用都是創建在MD5 函數不碰撞的基礎上,而這個基礎已不可靠,由於構造一個MD5碰撞已不難
    2005年山東大學的王小云教授發佈算法能夠輕易構造MD5碰撞實例,此後2007年,有國外學者在王小云教授算法的基礎上,提出了更進一步的MD5前綴碰撞構造算法「chosen prefix collision」,此後還有專家提供了MD5碰撞構造的開源的庫。
    因此MD5碰撞很容易構造,基於MD5來驗證數據完整性已不可靠,考慮到近期谷歌已成功構造了SHA1的碰撞實例,對於數據完整性,應使用SHA256或更強的算法代替。
    如下是簡單的MD5碰撞實例:
<?php

//md5 碰撞示範,數據不一樣,md5值同樣

$a = <<< EOT
d131dd02c5e6eec4693d9a0698aff95c
2fcab58712467eab4004583eb8fb7f89
55ad340609f4b30283e488832571415a
085125e8f7cdc99fd91dbdf280373c5b
d8823e3156348f5bae6dacd436c919c6
dd53e2b487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080a80d1e
c69821bcb6a8839396f9652b6ff72a70
EOT;

$b = <<< EOT
d131dd02c5e6eec4693d9a0698aff95c
2fcab50712467eab4004583eb8fb7f89
55ad340609f4b30283e4888325f1415a
085125e8f7cdc99fd91dbd7280373c5b
d8823e3156348f5bae6dacd436c919c6
dd53e23487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080280d1e
c69821bcb6a8839396f965ab6ff72a70
EOT;


$a = str_replace("\n","",$a);
$a = hex2bin($a);

$b = str_replace("\n","",$b);
$b = hex2bin($b);

assert($a !=$b);

echo md5($a);
echo "\n";
echo md5($b);
echo "\n";

二 用戶密碼加密保存

用戶的登陸密碼,是很重要的一個安全環節。
若是明文保存在數據庫,一旦黑客入侵或是內部員工盜竊,用戶密碼就會泄漏。
國內外大網站都發生過因黑客或是內部員工緻使用戶數據的泄漏問題,用戶密碼一旦泄漏對於電商網站或是支付網站的影響是難於估量的。安全

爲了保護用戶密碼,早期人們使用MD5算法把密碼加密後保存,一般計算MD5值時會加一個」鹽值「(即一個固定的密串),這個鹽值多是共用的,也多是一個用戶一個鹽值。網絡

MD5(密碼+鹽值),這樣形式的密碼儲存方案在早期基本上是密碼存儲的一個通行標準,國內多數網站(包括大型電商和支付網站)早期都採用的是這個辦法,若是沒有更新的話,如今不少網站依舊是這個方案。函數

這樣的方案什麼不對?
1. 對於黑客入侵或是內部員工,能拿到用戶數據的人,很容易就拿到鹽值
2. 雖然黑客不能反解密碼,密碼一般有必定的規則,諸如大小寫數字六位數以上等,黑客可經過排列組合一個一個的試,暴力破解,由於MD5值的計算速度很快,對於六位數密碼,很容易攻克。
注意:這個暴力破解是離線運行的,在線的暴力破解很容易阻擋。
被攻擊的網站沒有感受,若是用比特幣挖礦的礦機,這樣的破解垂手可得,沒挑戰。性能

你會說,MD5不行,SHA1也被谷歌破解了,SHA256 密碼加鹽值這樣可靠了吧?
SHA256 密碼加鹽值也不安全。
由於,MD5,SHA1,SHA256就不是用來保存密碼用的, 是用來校驗數據完整性用的,三個算法的計算速度都很快,試想一下,校驗一個4G的ISO鏡像文件,必需要有高效的計算速度。網站

由於算法效率高,速度快,也就下降了暴力破解的難度。ui

正確的作法是使用bcrypt算法,bcrypt算法的優勢是計算速度慢,沒錯計算速度慢,
還能夠經過參數調節速度,要多慢有多慢。加密

<?php

$options  =  ["cost" => 10 ]; //調速參數,越大越慢
$password = "password here";
$hash = password_hash($password, PASSWORD_BCRYPT, $options);
echo "$hash\n";

// 校驗
assert(password_verify($password,$hash) == true);

普通的電腦每秒可運行數萬次SHA256計算,bcypt算法經過參數設置能夠調整爲計算一次耗時1秒。
這樣大幅提升了暴力破解的門檻,加強了安全性。

這裏有個比特幣礦機配置,供參考, 以便提升安全意識:
型號:HashFast Sierra Batch 2
價格:7080美圓
功率: 780瓦
性能: 1200 GH/s (每秒可運行1.2萬億次SHA256計算)

相關文章
相關標籤/搜索