2015-07-20 110 views
-2

我試圖通過遵循this website來實現安全的用戶身份驗證。但是我無法存儲來自php password_hash函數的字符串結果。我的意思是,這個完美的作品:如何在mysql數據庫中存儲php password_hash

$pass = "anypassyouwant"; 
$stored = password_hash(
    base64_encode(
     hash('sha256', $pass, true) 
    ), 
    PASSWORD_DEFAULT 
); 
// ... 
if (password_verify(
    base64_encode(
     hash('sha256', $pass, true) 
    ), 
    $stored 
)) { 
    echo "TRUE"; 
} else { 
    echo "FALSE"; 
} 

在真正的應用程序我店「$存儲」在我的數據庫和password_verify用它,但我得到的是虛假的。由於上述代碼完美工作,唯一合理的解釋是數據庫中的存儲。 Varchar和二進制文件不起作用。

有誰知道我應該如何存儲它?

在此先感謝。

我插入指示:

$sql = sprintf(" 
    INSERT INTO tbl_usuarios (nombre, apellidos, password, email, fechanac, url_in, sexo) 
    VALUES ('%s', '%s', '%s', '%s', '%s', '%s', %u)", 
    $nombre, 
    $apellidos, 
    $pass, 
    $bd->escape($_POST['email']), 
    $fechanac, 
    $url_in, 
    $sexo 
); 

凡通是password_hash的結果。我試過%s和%b(db中的varchar和binary)。

+0

哪裏是插入代碼?另外,確保列的長度足以容納散列。投票不清楚。 –

+0

見@看的答案瞭解決問題的方法: http://stackoverflow.com/questions/29959689/php-login-using-mysql-data-and-hashed-password –

+0

散列和存儲密碼PHP的[建在功能](http://jayblanchard.net/proper_password_hashing_with_PHP.html)。 –

回答

0

在您發佈的插入代碼中,您引用變量$pass而不是存儲哪個是密碼的散列和base64編碼版本。您可能需要更新SQL查詢才能使用$stored變量而不是$pass

此外,在調試此項時,比較從數據庫檢索的內容與散列輸入的內容將有所幫助。這可能會顯示您意外存儲了明文密碼而不是散列版本。

+0

我從我使用的原始php文件複製插入代碼,上面的代碼只是我寫的一個測試,看看發生了什麼,抱歉不清楚這一點。我已經做了一些測試,存儲在數據庫中的不是password_hash返回的內容,無論我選擇varchar,binary還是其他任何內容,它都不會存儲password_hash返回 – DandyCC

+1

@DandyCC請注意''password_hash()'使用隨機鹽,所以每次散列都會有所不同。如果您正在比較數據庫包含的內容和password_hash返回的內容,則需要確保它使用相同的鹽,否則結果將始終不同。嘗試設置一個特定的salt(僅用於測試),並將數據庫返回的內容與password_hash()的輸出進行比較。如果它被截斷,則需要增加數據庫中列的長度。 – Mike

相關問題