2015-04-18 102 views
0

我使用blowfish方法在用戶註冊時散列用戶的密碼。比較散列密碼以驗證密碼是否匹配

在註冊表格中,有「輸入密碼」框和「確認密碼」框。

因此,要檢查密碼是否匹配,我使用哈希版本進行比較。但是,它似乎不匹配。

請參閱從超全局變量下面的代碼...

獲取值和哈希他們。

$hashed_password = password_encrypt($_POST['password']); 
$conf_hashed_password = password_encrypt($_POST['conf_password']); 

通話功能

passwords_match_check($hashed_password, $conf_hashed_password); 

定義函數

function passwords_match_check($hashed_pw, $conf_hashed_pw){ 
    global $errors; 
    if($conf_hashed_pw != $hashed_pw){ 
     $errors['pws_no_match'] = "Passwords do not match"; 
    } 

}

該代碼總是說密碼不匹配,就算我知道密碼是一樣的...

那麼,我哪裏出錯了?

是不是可以,如果我只是使用沒有散列的值進行比較?

回答

2

只需使用password_hash()password_verify()個(包括在PHP 5.5+)。如果您使用的是5.3 - 5.5,則使用password-compat向後兼容性庫。

自定義password_encrypt()函數是不必要的,並且很可能不像內置函數那樣安全。所以只需使用內置的一個。

+0

謝謝..目前我認爲我有5.4.3 ..好吧,我會研究一下...... :) – TharinduLucky

0

除非你分享password_encrypt函數,否則很難說。 如果該方法唯一地加密加密,則兩個哈希將會不同。

(可能是您的失敗檢查的原因。) 爲什麼不檢查原始輸入而不是散列?

+0

我檢查了原始輸入...它確實沒有任何問題。這發生在我使用哈希版本後... – TharinduLucky

+0

我假設你打印/ var_dump哈希變量到你的屏幕上,你會得到兩個不同的哈希在屏幕上。請分享password_encrypt的方法(嘗試在php.net上查找,但似乎是一個未知函數) – Armand

+0

我在頁面上打印它們,它們是不同的。password_encrypt是我寫的一個自定義函數,它使用blowfish方法和salt來哈希密碼 – TharinduLucky

-1

它不起作用的原因是你的password_encrypt使用了一個salt,因此hash每次都是不同的。

用途:http://php.net/manual/en/function.password-verify.php

這裏是我用來生成一個散列。您可以將此融入password_encrypt功能

$password = htmlentities($_POST['password']); 
$salt2 = uniqid(mt_rand(), true); 
$salt = hash('sha512', $salt2); 
$options = ['salt' => $salt, 'cost' => 12]; 
$hash = password_hash($password, PASSWORD_BCRYPT, $options); 

,並驗證密碼

$user['password'] = 'get the hash from the db'; 
if(password_verify(htmlentities($_POST['password']), $user['password'])) { 

} 
+0

謝謝...所以,我打算只使用來自「密碼」和「確認密碼」的原始值(與real_escap)進行比較。可以嗎?我的意思是安全? – TharinduLucky

+0

只需使用'htmlentities()'來轉義任何輸入。 – Sladey

+0

會做到這一點......謝謝:) – TharinduLucky