2012-07-18 56 views
3

我試圖用PHP驗證Devise Ruby on Rails生成的一些密碼。 Devise被配置爲使用bcrypt。用於Ruby on Rails的PHP BCrypt設計密碼

我的代碼是:

$database_record = "$2a$10$..."; // generated by devise 
$user_input = 'asdasd'; 
$password = crypt($user_input, '$2a$10$usesomesillystringforsalt$'); 

if (crypt($user_input, $database_record) == $password) { 
    echo "<br/>Password verified!"; 
} 
else { 
    echo '<br/>failed!'; } 

,我看到都採用這種方法的文檔,但它並沒有爲我工作。我忘記了什麼嗎? 應以任何方式使用「胡椒串」? 謝謝!

回答

4

我對這部分感到困惑。

$password = crypt($user_input, '$2a$10$usesomesillystringforsalt$'); 

我想你後來的文檔指出如何創建一個散列並保證它是bcrypt的困惑。在你的情況下,你正在驗證一個散列,所以它會自動做到這一點。

你想要做的是跳過做:

if (crypt($user_input, $database_record) == $database_record) { 

所以,如果這個工程我怎麼會想到它,crypt($user_input, $database_record)會從$database_record鹽,並用它來對$user_input運行bcrypt。然後,您想再次將結果與$database_record進行比較,因爲它是正確密碼的bcrypt散列。

+0

Hello Brendan!感謝您的回答。你說什麼是有道理的。但我試過了,仍然有同樣的問題......我想也許我錯過了Devise的一些額外編碼。 – 2012-07-18 17:45:01

+0

我終於發現瞭如何解決這個問題。你的解決方案是正確的,我只需要統一密碼和胡椒,並執行兩者的加密。再次感謝! – 2012-07-19 14:00:47

+1

@Andrés當某人的回答有幫助時,您可以標記他們答案旁邊的向上箭頭以標記該標記。如果答案解決了您的問題,您可以點擊複選框。這有助於其他可能出現類似問題的人(因爲最佳答案位於頁面頂部),並通過獎勵幫助你的人來幫助網站。 – 2012-07-19 16:14:58

1

我終於發現瞭如何解決這個問題。 Devise在密碼的末尾添加胡椒,然後執行crypt。

工作代碼爲:

if (crypt($passwordToValidate.$pepper, $encryptedPassword) == $encryptedPassword) 
    echo 'ok!'; 
else 
    echo 'failed!'; 
2

使用PHP 5> = 5.5.0

$pepper = 'xxxyyyzzz'; //get value from config/initializers/devise.rb 
$password = '12345678'; //clear password to validate 

$db_pass = '***************************'; //password stored on database 

$options = [ 
    'salt' => substr($db_pass,7) 
]; 

$ok = ($db_pass == password_hash($password.$pepper, PASSWORD_BCRYPT, $options));