PHP中的哈希(hash)是將任意長度的二進制數據映射為一個較短的固定長度的二進制數據序列的過程。PHP解釋器提供了許多哈希函數,例如MD5、SHA-1、SHA-256等等。這些函數可以用于密碼保護、數字簽名、隨機數據生成、變量查找等多個應用領域。
我們以SHA-1為例子,介紹PHP哈希原理。在PHP中,SHA-1函數的原型如下:
string sha1 ( string $str , bool $raw_output = false )
SHA-1的輸入為字符串str,在計算前需要對它進行編碼。編碼有多種方式,最常用的是UTF-8。在計算過程中還可以設置raw_output參數,如果設為true,則輸出原始二進制數據,設為false則輸出40個十六進制字符的哈希值。
相信大家都二進制數據和哈希值,但是哈希的具體工作原理是什么?
SHA-1是由美國國家安全局(National Security Agency)設計并正式采用的,它對輸入流進行以下初始處理:
- 補位:使得最終長度為512bit的字符串可以分成若干個壓縮塊。
- 設置初始變量:定義5個32位長的變量作為初始變量。
- 迭代計算:對每個壓縮塊進行迭代計算,最終求得哈希值。
這個過程聽起來復雜,但是PHP中已經為我們封裝好了,我們只需要調用SHA1函數即可:
$string = "hello world"; $hash = sha1($string); echo $hash; // 輸出 2ef7bde608ce5404e97d5f042f95f89f1c232871
事實上,哈希值不具有唯一性。雖然SHA-1算法很難找到兩個不同的輸入值,得到相同的輸出值,但這并不意味著惡意攻擊者不能通過故意構造相同哈希值的輸入來欺騙系統,這就是哈希碰撞攻擊。
對于這種情況,可以使用加鹽(salt)技術來緩解。所謂加鹽,就是在哈希值的基礎上再添加一個隨機字符串進行哈希,在檢驗密碼的時候同樣再加鹽一起哈希計算。
$password = "123456"; $salt = "abcd1234"; $hash = sha1($password . $salt); echo $hash; // 輸出 96b5f9d9b3a85587ddacb9bd6ffc4f8f3714f06c
在實際應用中,開發者應該選擇符合安全標準的哈希算法(例如SHA-2),不要盲目選擇MD5等易被攻擊的算法。此外,應該盡可能顯式地將哈希值與密碼分開存儲,以防止泄漏。
哈希值的應用不僅局限于密碼存儲,在存儲用戶身份證、銀行卡等敏感數據時也可用哈希函數進行加密,目的是為了保護用戶隱私。
最后,哈希函數是PHP中非常重要的算法之一,大家學習開發PHP程序時應該多掌握一些常見哈希函數的使用。如果對哈希算法感興趣,可以深入學習密碼學領域的相關知識。