首頁 > 後端開發 > php教程 > 帶有PHP 5.5密碼哈希API的哈希密碼

帶有PHP 5.5密碼哈希API的哈希密碼

Jennifer Aniston
發布: 2025-02-23 10:19:09
原創
346 人瀏覽過

Hashing Passwords with the PHP 5.5 Password Hashing API

核心要點

  • PHP 5.5 密碼哈希API 通過四個函數簡化了密碼哈希:password_hash() 用於哈希密碼,password_verify() 用於驗證密碼與其哈希值,password_needs_rehash() 用於檢查密碼是否需要重新哈希,password_get_info() 用於返回哈希算法的名稱和哈希過程中使用的各種選項。
  • 該 API 默認使用 bcrypt 算法,並自動處理鹽值的生成,無需開發人員提供。但是,開發人員仍然可以通過向 password_hash() 函數傳遞第三個參數來提供自己的鹽或成本值。
  • 該 API 被認為非常安全,但建議將其作為全面安全策略的一部分使用。使用 PHP 5.3.7 或更高版本的開發人員可以使用名為 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()

如果需要修改哈希字符串的鹽和成本參數怎麼辦?這是一個需要關注的問題,因為您可能決定通過添加更強的鹽或更大的成本參數來提高安全性。此外,PHP 可能會更改哈希算法的默認實現。在所有這些情況下,您都希望重新哈希現有密碼。 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 是 PHP 5.5 及更高版本中的一個功能,它為開發人員提供了一種以安全方式哈希和驗證密碼的簡單方法。它很重要,因為它有助於保護敏感的用戶數據。如果數據庫遭到入侵,哈希密碼比純文本密碼更難破解。該 API 默認使用強大的哈希函數 Bcrypt,並自動處理鹽值的生成,使開發人員更容易實現安全的密碼處理。

password_hash 函數是如何工作的?

password_hash 函數是 PHP 5.5 密碼哈希 API 的一部分。它接收純文本密碼和哈希算法作為輸入,並返回一個哈希密碼。該函數還在哈希之前自動生成並應用一個隨機鹽值到密碼。此鹽值包含在返回的哈希中,因此無需單獨存儲它。

password_verify 函數的目的是什麼?

password_verify 函數用於根據哈希密碼驗證密碼。它接收純文本密碼和哈希密碼作為輸入。該函數從哈希密碼中提取鹽值和哈希算法,將它們應用於純文本密碼,然後將結果與原始哈希密碼進行比較。如果匹配,則該函數返回 true,表明密碼正確。

PHP 5.5 密碼哈希 API 的安全性如何?

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 一起使用嗎?

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 密碼一起使用嗎?

是的,您可以將 PHP 5.5 密碼哈希 API 與非 ASCII 密碼一起使用。 password_hashpassword_verify 函數使用二進制數據,因此它們可以處理任何字符的密碼。但是,您應該注意,不同的系統可能對非 ASCII 字符的處理方式不同,因此在哈希密碼之前對其進行規範化是一個好主意。

以上是帶有PHP 5.5密碼哈希API的哈希密碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板