引言
作為php開(kāi)發(fā)人員,很長(zhǎng)一段時(shí)間以來(lái),很多人一直在使用md5哈希算法來(lái)保護(hù)密碼數(shù)據(jù)并生成唯一的哈希算法。但是你應(yīng)該或多或少聽(tīng)到過(guò),md5不再安全了!
PHP 5.5中有一些密碼身份驗(yàn)證替代方案,即 sha1,password_hash?為什么被認(rèn)為更安全?應(yīng)該怎么選擇?
學(xué)習(xí)時(shí)間
很多研究論文已經(jīng)證明過(guò)了,md5 計(jì)算出的哈希值可以被逆向。我們也應(yīng)該完全停止使用。論文的名字也非常具有沖擊力《How to Break MD5 and Other Hash Functions》,演示了整個(gè)逆向的過(guò)程,可謂觸目驚心,看的我瑟瑟發(fā)抖。
作為升級(jí)版的用法,password_hash 函數(shù)安全系數(shù)足夠強(qiáng)大到抵御一段時(shí)間的破解。在 PHP 5.5 中可以放心使用。后來(lái)加入到標(biāo)準(zhǔn)庫(kù)中的 crypt 函數(shù),則把安全級(jí)別向前推進(jìn)了一大步。
首先舉例說(shuō)明一下 password_hash 的用法:
$options = [ 'cost' => 12,];echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
還有使用 BLOWFISH 算法的 crypt 密碼生成:
if (CRYPT_BLOWFISH == 1) { echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";}
還是那句話(huà),PHP 都準(zhǔn)備好函數(shù)了,用法極為簡(jiǎn)單高效,等著開(kāi)發(fā)者開(kāi)箱即用呢。
深入一步
為什么堅(jiān)決不能在用 md5 了?
因?yàn)橹T如MD5,SHA1和SHA256之類(lèi)的哈希算法被設(shè)計(jì)為非??焖俸透咝?。隨著現(xiàn)代技術(shù)和計(jì)算機(jī)設(shè)備的出現(xiàn),“暴力破解”所需要的時(shí)間越來(lái)越短。由于現(xiàn)代計(jì)算機(jī)“逆向”這些哈希算法的速度很快,因此許多安全專(zhuān)業(yè)人員強(qiáng)烈建議不要將其用于密碼哈希。
為什么 PHP 5.5 中推薦使用 password_hash 函數(shù)?
在對(duì)密碼進(jìn)行哈希處理時(shí),兩個(gè)最重要的考慮因素是計(jì)算量和費(fèi)用。哈希算法在計(jì)算上越昂貴,對(duì)它進(jìn)行暴力破解所花費(fèi)的時(shí)間就越長(zhǎng)。PHP 5.5提供了一個(gè)本機(jī)密碼哈希API,就是password_hash(),可以安全地安全處理哈希和驗(yàn)證密碼。
寫(xiě)在最后
計(jì)算機(jī)硬件的突飛猛進(jìn),使得原本需要大量的時(shí)間和成本才能進(jìn)行的破解工作周期大為縮短。在軟件層面,我們勢(shì)必要跟得上節(jié)奏,才能保證在一段時(shí)間內(nèi)的安全。
再者,PHP 提供的函數(shù)如此高效,簡(jiǎn)單,有什么理由不用呢!