[英]What is the best way to compare hashed strings? (PHP)
我應該使用if(strcmp(md5($string),$hash)==0)
或if(md5($string)==$hash)
在比較哈希時,你應該非常小心地進行身份驗證,因為你可能會打開窗口進行定時攻擊 。
雖然聽起來非常違反直覺,但你應該對字符串進行全面比較,避免任何優化(即如果字符不同則提前退出)。
以下是有關此問題的一些鏈接:
以下是一些想法,以解決它:
hash_equals()
(PHP 5.6及更高版本)。 hash_equals()
填充工具) compareStrings()
) 如果比較字符串,請使用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.