在PHP 中, password_hash()和password_verify()是用於密碼加密和驗證的函數。它們的配合使用,可以有效地提升密碼存儲的安全性,防止密碼洩露和破解。然而,很多開發者對它們使用的加密算法及其關係仍有疑問,本文將探討它們的加密算法以及二者之間的關係。
password_hash()函數是PHP 5.5 及以上版本引入的,用於將用戶的明文密碼轉化為加密後的密碼。它使用了現代的哈希算法(如bcrypt ),並能夠自動生成一個“鹽”(salt)。鹽是一個附加的隨機數據,它用於保證相同的明文密碼在每次加密時都會生成不同的哈希值。
默認情況下, password_hash()使用的是bcrypt算法,它生成的哈希值包含了鹽的內容,因此在存儲密碼時不需要額外存儲鹽。 bcrypt算法本身也具備自適應性,即可以通過增加工作因子(cost factor)來增強計算強度,從而抵禦暴力破解。
示例代碼:
<span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'my_secure_password'</span></span><span>;
</span><span><span class="hljs-variable">$hashedPassword</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$hashedPassword</span></span><span>;
</span></span>password_verify()函數是用來驗證輸入的密碼是否與存儲的哈希值匹配。它的作用是在用戶登錄時,比較用戶輸入的明文密碼與數據庫中存儲的加密密碼。 password_verify()會自動提取存儲的哈希值中的鹽,並用同樣的算法對用戶輸入的密碼進行加密,然後與存儲的哈希值進行比較。
需要注意的是, password_verify()會根據哈希值中指定的算法進行計算。因此,開發者不需要手動為password_verify()傳遞鹽或加密算法,它會根據傳入的哈希值自動選擇合適的方式進行驗證。
示例代碼:
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_verify</span></span><span>(</span><span><span class="hljs-variable">$userInputPassword</span></span><span>, </span><span><span class="hljs-variable">$storedHash</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Invalid password!"</span></span><span>;
}
</span></span>password_hash()和password_verify()的密切關係在於它們使用相同的加密算法進行密碼的處理與驗證。具體而言:
密碼加密: password_hash()會根據指定的算法(默認是bcrypt )將明文密碼轉換為加密後的哈希值。哈希值中包含了鹽和算法的其他參數(如工作因子)。
密碼驗證: password_verify()通過讀取哈希值中的算法信息和鹽,使用相同的算法(如bcrypt )對用戶輸入的密碼進行加密,然後與存儲的哈希值進行比較。
因此, password_verify()必須使用與password_hash()完全相同的算法和參數來進行驗證。如果哈希值使用了bcrypt ,那麼password_verify()也會自動使用bcrypt進行驗證。
雖然password_hash()默認為bcrypt ,它也支持其他算法。 PHP 7.2 之後, password_hash()還支持了argon2i和argon2id兩種更強大的算法。 argon2是一種現代化的哈希算法,相比於bcrypt ,它提供了更好的防止GPU 力量破解的能力。
使用argon2i的示例代碼:
<span><span><span class="hljs-variable">$hashedPassword</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_ARGON2I);
</span></span>如果密碼是使用argon2算法加密的,那麼password_verify()會自動識別並使用相應的算法進行驗證。
password_hash()和password_verify()是PHP 中用於密碼加密和驗證的兩個非常重要的函數。它們的加密算法密切相關, password_hash()用於加密並生成哈希值,而password_verify()用於根據哈希值驗證密碼的正確性。兩者通常配合使用,確保密碼存儲的安全性。雖然默認情況下使用的是bcrypt算法,但PHP 還支持argon2等更強的算法,在需要時可以進行選擇。
通過理解password_hash()和password_verify()使用的加密算法關係,開發者可以更好地設計安全的密碼存儲和驗證機制,提升應用程序的安全性。