?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
每個人在建構(gòu) PHP 應用時終究都會加入用戶登錄的模塊。用戶的帳號及密碼會被儲存在數(shù)據(jù)庫中,在登錄時用來驗證用戶。
在存儲密碼前正確的 哈希密碼 是非常重要的。密碼的哈希操作是單向不可逆的,該哈希值是一段固定長度的字符串且無法逆向推算出原始密碼。這就代表你可以哈希另一串密碼,來比較兩者是否是同一個密碼,但又無需知道原始的密碼。如果你不將密碼哈希,那么當未授權的第三者進入你的數(shù)據(jù)庫時,所有用戶的帳號資料將會一覽無遺。有些用戶可能(很不幸的)在別的網(wǎng)站也使用相同的密碼。所以務必要重視數(shù)據(jù)安全的問題。
密碼應該單獨被 加鹽處理 ,加鹽值指的是在哈希之前先加入隨機子串。以此來防范「字典破解」或者「彩虹碰撞」(一個可以保存了通用哈希后的密碼數(shù)據(jù)庫,可用來逆向推出密碼)。
哈希和加鹽非常重要,因為很多情況下,用戶會在不同的服務中選擇使用同一個密碼,密碼的安全性很低。
值得慶幸的是,現(xiàn)在在 PHP 中這些很容易做到。
使用 password_hash 來哈希密碼
password_hash 函數(shù)在 PHP 5.5 時被引入。 此函數(shù)現(xiàn)在使用的是目前 PHP 所支持的最強大的加密算法 BCrypt 。 當然,此函數(shù)未來會支持更多的加密算法。 password_compat 庫的出現(xiàn)是為了提供對 PHP >= 5.3.7 版本的支持。
在下面例子中,我們哈希一個字符串,然后和新的哈希值對比。因為我們使用的兩個字符串是不同的(’secret-password’ 與 ‘bad-password’),所以登錄失敗。
<?php require 'password.php'; $passwordHash = password_hash('secret-password', PASSWORD_DEFAULT); if (password_verify('bad-password', $passwordHash)) { // Correct Password } else { // Wrong password }
password_hash() 已經(jīng)幫你處理好了加鹽。加進去的隨機子串通過加密算法自動保存著,成為哈希的一部分。password_verify() 會把隨機子串從中提取,所以你不必使用另一個數(shù)據(jù)庫來記錄這些隨機子串。