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