當前位置: 首頁> 最新文章列表> hash_copy 與hash_equals 如何配合判斷兩個哈希值是否一致?

hash_copy 與hash_equals 如何配合判斷兩個哈希值是否一致?

M66 2025-07-28

在PHP 中,哈希函數廣泛應用於密碼驗證、數據完整性校驗等場景。為了確保數據安全,我們常常需要判斷兩個哈希值是否一致。 PHP 提供了多個函數來生成和比較哈希值,其中hash_copyhash_equals是兩個常用的函數,它們能夠有效地幫助我們完成哈希值的比較工作。

什麼是hash_copy 和hash_equals?

  1. hash_copy
    hash_copy這個函數其實並不存在於PHP 中。可能在某些文檔或文章中看到了類似的表述,這很可能是誤用或誤解。在PHP 中常見的用於哈希值比較和復制的函數是hash()hash_equals()

  2. hash_equals
    hash_equals是PHP 提供的一個函數,用於安全地比較兩個哈希值。它的作用是防止時間差攻擊(timing attack)。通過常規的字符串比較,攻擊者可以通過比較比較操作的時間差來推測哈希值的不同。而hash_equals會在兩個哈希值長度一致的情況下進行逐字符比較,確保不會暴露出這些時間差。

     <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$known_string</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$user_string</span></span><span> )
    </span></span>
    • $known_string :已知的哈希值或字符串。

    • $user_string :用戶輸入的哈希值或字符串。

    • 返回值:如果兩個字符串完全相同,返回true ,否則返回false

如何使用hash_equals 判斷兩個哈希值是否一致?

當我們想要比較兩個哈希值是否一致時,可以使用hash_equals函數,確保安全且準確地判斷。這裡有一個常見的示例,假設我們需要驗證用戶輸入的密碼是否與存儲在數據庫中的哈希值一致。

示例:驗證用戶輸入的密碼

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 假設數據庫中存儲的哈希值</span></span><span>
</span><span><span class="hljs-variable">$stored_hash</span></span><span> = </span><span><span class="hljs-string">'$2y$10$V5ldlhO.Jk19pZpWzchL7vJdknz57Vry8V15hATFmgt0gt04SKeQK'</span></span><span>; </span><span><span class="hljs-comment">// 哈希過的密碼</span></span><span>

</span><span><span class="hljs-comment">// 用戶輸入的密碼</span></span><span>
</span><span><span class="hljs-variable">$user_input_password</span></span><span> = </span><span><span class="hljs-string">'user_password'</span></span><span>;

</span><span><span class="hljs-comment">// 使用 password_hash 生成哈希值並驗證</span></span><span>
</span><span><span class="hljs-variable">$input_hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$user_input_password</span></span><span>, PASSWORD_DEFAULT);

</span><span><span class="hljs-comment">// 使用 hash_equals 比較兩個哈希值</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$stored_hash</span></span><span>, </span><span><span class="hljs-variable">$input_hash</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"密碼一致!"</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">"密碼不一致!"</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

在這個示例中,雖然password_hash已經對用戶的密碼進行了哈希處理, hash_equals的作用是確保比較時不會因為不同長度或時延差異導致潛在的安全風險。

為什麼要使用hash_equals?

PHP 中的字符串比較操作(如==strcmp() )存在一定的安全風險,因為它們的執行時間會依賴於字符串的長度和內容。對於哈希值這樣的敏感數據,若直接使用==進行比較,攻擊者可以通過分析字符串比較的執行時間,推測出哈希值的不同之處。這種攻擊方法被稱為時間差攻擊

hash_equals是為了避免這種攻擊而設計的。它會在比較兩個字符串時,強制將它們的長度保持一致,並且通過逐字節的方式進行比較,從而消除了由於時間差異帶來的安全隱患。

使用場景

  1. 用戶身份驗證<br> 在用戶登錄時,我們通常會將用戶輸入的密碼進行哈希處理,再與數據庫中存儲的哈希值進行比較為了確保驗證過程安全,應該使用hash_equals

  2. 數據完整性校驗<br> 在傳輸數據時,我們可以計算數據的哈希值並傳輸給接收方接收方可以使用hash_equals比較接收到的哈希值和本地計算的哈希值,以判斷數據是否被篡改。

  3. 生成和比較文件哈希<br> 通過對文件內容進行哈希處理,可以判斷文件是否發生變化hash_equals能夠確保在文件哈希值比較時,避免受到外部攻擊。

結論

hash_equals是PHP 中一種非常安全且高效的哈希值比較函數,它能夠有效防止時間差攻擊。雖然hash_copy並不是PHP 內置函數,但我們可以通過hash()hash_equals等函數安全地處理和比較哈希值。在需要驗證敏感數據時,我們應始終使用hash_equals來保證比較過程的安全性,避免潛在的安全風險。