簡體   English   中英

比較散列字符串的最佳方法是什么? (PHP)

[英]What is the best way to compare hashed strings? (PHP)

我應該使用if(strcmp(md5($string),$hash)==0)if(md5($string)==$hash)

在比較哈希時,你應該非常小心地進行身份驗證,因為你可能會打開窗口進行定時攻擊

雖然聽起來非常違反直覺,但你應該對字符串進行全面比較,避免任何優化(即如果字符不同則提前退出)。

以下是有關此問題的一些鏈接:

以下是一些想法,以解決它:

如果比較字符串,請使用strcmp=== 人們更喜歡===因為strcmp可能令人困惑(成功時返回0 ,wat)。

你必須使用=== ,而不是== ==如果它們可以被解釋為將兩個操作數轉換為整數,並且因為MD5哈希不適合整數,它們將被截斷一半。 因此,只有哈希的前半部分必須相等。 請參見http://phpsadness.com/sad/47

如果您正在散列密碼,請考慮使用緩慢而強大的散列算法,例如PBKDF2,而不是MD5。

如果你使用的是比PHP 5.6更新的東西(包括),你應該使用定時攻擊安全字符串比較功能。

if (hash_equals($expected, $correct)) {

}

(如果您使用的是PHP 5.5或更早版本, 請參閱此處了解相應內容 。)

實際上你應該使用password_verify ,並使用所有其他password_*函數。 它們以PHP> = 5.5.0提供。

作為后備,您可以使用此polyfill 它目前適用於PHP> = 5.3.7。

如果你真的不能/想要使用它,那么仍然有hash_equals (和polyfills)作為@MM。 已經說過了。

我認為if(md5($string) == $hash)更好,因為你只有一個比較而不是2(stcmp&==)。

md5只生成不需要二進制安全比較的ascii-chars。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM