核心要點
password_hash()
用於哈希密碼,password_verify()
用於驗證密碼與其哈希值,password_needs_rehash()
用於檢查密碼是否需要重新哈希,password_get_info()
用於返回哈希算法的名稱和哈希過程中使用的各種選項。 password_hash()
函數傳遞第三個參數來提供自己的鹽或成本值。 password_compat
的庫,該庫模擬 API,並在 PHP 版本升級到 5.5 後自動禁用自身。 使用 bcrypt 是目前公認的最佳密碼哈希實踐,但許多開發人員仍在使用 MD5 和 SHA1 等較舊且較弱的算法。一些開發人員甚至在哈希時不使用鹽。 PHP 5.5 中的新哈希 API 旨在在隱藏其複雜性的同時,將注意力吸引到 bcrypt 上。在本文中,我將介紹使用 PHP 新哈希 API 的基礎知識。新的密碼哈希 API 公開了四個簡單的函數:
password_hash()
– 用於哈希密碼。 password_verify()
– 用於根據其哈希值驗證密碼。 password_needs_rehash()
– 當需要重新哈希密碼時使用。 password_get_info()
– 返回哈希算法的名稱和哈希過程中使用的各種選項。 password_hash()
儘管 crypt()
函數是安全的,但許多人認為它過於復雜且容易出錯。然後,一些開發人員使用弱鹽和弱算法來生成哈希,例如:
<?php $hash = md5($password . $salt); // 可行,但危险
但是,password_hash()
函數可以簡化我們的工作,我們的代碼可以保持安全。當您需要哈希密碼時,只需將其提供給函數,它將返回可以存儲在數據庫中的哈希值。
<?php $hash = md5($password . $salt); // 可行,但危险
就是這樣!第一個參數是要哈希的密碼字符串,第二個參數指定應用於生成哈希的算法。當前默認算法是 bcrypt,但將來某個時候可能會將更強大的算法添加為默認算法,並可能生成更大的字符串。如果您在項目中使用 PASSWORD_DEFAULT
,請確保將哈希存儲在容量超過 60 個字符的列中。將列大小設置為 255 可能是一個不錯的選擇。您也可以使用 PASSWORD_BCRYPT
作為第二個參數。在這種情況下,結果始終為 60 個字符長。這裡重要的是,您不必提供鹽值或成本參數。新的 API 將為您處理所有這些。鹽是哈希的一部分,因此您不必單獨存儲它。如果要提供自己的鹽(或成本),可以通過向函數傳遞第三個參數(一個選項數組)來實現。
<?php $hash = password_hash($password, PASSWORD_DEFAULT);
通過這種方式,您始終可以使用最新的安全措施。如果 PHP 以後決定實現更強大的哈希算法,您的代碼可以利用它。
password_verify()
既然您已經了解瞭如何使用新的 API 生成哈希,那麼讓我們看看如何驗證密碼。請記住,您將哈希存儲在數據庫中,但在用戶登錄時獲得的是純文本密碼。 password_verify()
函數將純文本密碼和哈希字符串作為其兩個參數。如果哈希與指定的密碼匹配,則返回 true。
<?php $options = [ 'salt' => custom_function_for_salt(), //编写您自己的代码以生成合适的盐 'cost' => 12 // 默认成本为 10 ]; $hash = password_hash($password, PASSWORD_DEFAULT, $options);
請記住,鹽是哈希密碼的一部分,這就是為什麼我們在這裡沒有單獨指定它的原因。
password_needs_rehash()
password_needs_rehash()
有助於檢查指定的哈希是否實現了特定算法,並在創建時使用特定選項(如成本和鹽)。
<?php if (password_verify($password, $hash)) { // 成功! } else { // 无效的凭据 }
請記住,當用戶嘗試登錄您的網站時,您需要執行此操作,因為這只是您可以訪問純文本密碼的時間。
password_get_info()
password_get_info()
接受一個哈希並返回一個包含三個元素的關聯數組:
algo
– 一個常量,用於標識特定算法algoName
– 使用的算法的名稱options
– 生成哈希時使用的各種選項結論
新的密碼哈希 API 比使用 crypt()
函數更容易使用。如果您的網站當前運行在 PHP 5.5 上,那麼我強烈建議您使用新的哈希 API。那些使用 PHP 5.3.7(或更高版本)的用戶可以使用名為 password_compat
的庫,該庫模擬 API,並在 PHP 版本升級到 5.5 後自動禁用自身。
PHP 5.5 密碼哈希 API 常見問題解答 (FAQ)
PHP 5.5 密碼哈希 API 是 PHP 5.5 及更高版本中的一個功能,它為開發人員提供了一種以安全方式哈希和驗證密碼的簡單方法。它很重要,因為它有助於保護敏感的用戶數據。如果數據庫遭到入侵,哈希密碼比純文本密碼更難破解。該 API 默認使用強大的哈希函數 Bcrypt,並自動處理鹽值的生成,使開發人員更容易實現安全的密碼處理。
password_hash
函數是如何工作的? password_hash
函數是 PHP 5.5 密碼哈希 API 的一部分。它接收純文本密碼和哈希算法作為輸入,並返回一個哈希密碼。該函數還在哈希之前自動生成並應用一個隨機鹽值到密碼。此鹽值包含在返回的哈希中,因此無需單獨存儲它。
password_verify
函數的目的是什麼? password_verify
函數用於根據哈希密碼驗證密碼。它接收純文本密碼和哈希密碼作為輸入。該函數從哈希密碼中提取鹽值和哈希算法,將它們應用於純文本密碼,然後將結果與原始哈希密碼進行比較。如果匹配,則該函數返回 true,表明密碼正確。
PHP 5.5 密碼哈希 API 被認為非常安全。它默認使用 Bcrypt 哈希算法,這是一個強大的哈希函數。該 API 還自動為每個密碼生成並應用一個隨機鹽值,這有助於防止彩虹表攻擊。但是,與所有安全措施一樣,它並非萬無一失,應將其作為全面安全策略的一部分使用。
password_hash
函數中使用自定義鹽嗎? 是的,您可以在 password_hash
函數中使用自定義鹽,但不推薦這樣做。該函數會自動為每個密碼生成一個隨機鹽值,這通常比自定義鹽更安全。如果您確實選擇使用自定義鹽,它應該是一個至少 22 個字符的隨機字符串。
password_hash
函數中的成本參數是什麼? password_hash
函數中的成本參數決定了哈希的計算成本。較高的成本使哈希更安全,但也計算速度較慢。默認成本為 10,對於大多數應用程序來說,這是安全性和性能之間的良好平衡。
您可以使用 password_needs_rehash
函數來檢查哈希密碼是否需要重新哈希。此函數接收哈希密碼、哈希算法以及可選的成本作為輸入。如果哈希密碼是用不同的算法或成本創建的,則返回 true,表明它應該重新哈希。
PHP 5.5 密碼哈希 API 僅在 PHP 5.5 及更高版本中可用。但是,有一個兼容性庫可為 PHP 5.3.7 及更高版本提供相同的功能。
PASSWORD_DEFAULT
常量哈希密碼,然後 PHP 的未來版本中的默認算法發生更改會發生什麼? 如果您使用 PASSWORD_DEFAULT
常量哈希密碼,然後 PHP 的未來版本中的默認算法發生更改,password_hash
函數將繼續按預期工作。哈希密碼包含有關所用算法的信息,因此 password_verify
函數仍然可以正確驗證密碼。
是的,您可以將 PHP 5.5 密碼哈希 API 與非 ASCII 密碼一起使用。 password_hash
和 password_verify
函數使用二進制數據,因此它們可以處理任何字符的密碼。但是,您應該注意,不同的系統可能對非 ASCII 字符的處理方式不同,因此在哈希密碼之前對其進行規範化是一個好主意。
以上是帶有PHP 5.5密碼哈希API的哈希密碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!