2013-07-29 29 views
1

我需要在php中檢查密碼的有效性。密碼在django中用散列算法作爲sha256的pbkdf2散列器進行哈希處理。如何在PHP中複製django密碼驗證功能?

https://gist.github.com/staydecent/1019680 < - 這個人能夠用簡單的sha1散列做同樣的事情。

Verifying Django Password in Ruby on Rails gives non-matching password < - 此人在ruby中有類似的問題,而不是php。

據我所知,django密碼被存儲,以便哈希樣式是第一個組件,接下來的複製數量,然後鹽,然後是哈希。

我已經成功地提取了每個組件,但下面的php不起作用。它返回一個正確長度的字符串,但不是正確的內容。我擔心散列碼不起作用。我使用散列器是從本網站: https://defuse.ca/php-pbkdf2.htm

這是我的PHP:

//$enc_password is the password from database 
$pieces = explode('$', $enc_password); 
$iterations = $pieces[1]; 
$salt = $pieces[2]; 
$hash = $pieces[3]; 
//raw_password is user's entered password 
if ($hash == base64_encode(pbkdf2("sha256", $raw_password, $salt, $iterations, 32, true))) 
{ 
    echo ("SUCCESS"); 
} 
else 
{ 
    echo ("FAILED"); 
} 

任何和所有幫助表示讚賞!

+0

作爲一個方面說明 - http://stackoverflow.com/questions/14047979/executing-python-script-in-php-and-exchanging-data-between-the-two它會是多麼糟糕,只是寫在Django的/ python的小部分,並返回成功或失敗JSON編碼的消息回到PHP? – Lugubrious

回答

1

我剛剛在Python和PHP中做了一個簡單的測試。

在Python:

>>> from django.utils.crypto import pbkdf2 
>>> import base64, hashlib 
>>> hash = pbkdf2("test_password","myHash", 10000, 32, hashlib.sha256) 
>>> hash.encode('base64').strip() 
'lRKgL0zAmPwIMPNhTy1wJRXWZQwcHlbIW3glYA4LPU8=' 

在PHP:

<?php 
include 'pbkdf2.php'; 
echo base64_encode(pbkdf2('sha256', 'test_password', 'myHash', 10000, 32, true)); 
// result is: lRKgL0zAmPwIMPNhTy1wJRXWZQwcHlbIW3glYA4LPU8= 
?> 

來自兩個試驗的結果是相同的,所以沒有什麼錯的哈希碼。你確定你的Django測試使用pbkdf2算法嗎?你的用戶輸入是否與測試密碼相同?

+0

如果您可以提供一個示例散列密碼,那麼我們可以一起查看它以檢查如何在PHP中複製它。 –

+0

我不敢相信這麼久以來我一直在努力 - - 我忘記了我正在使用舊版本的數據庫進行測試,並且自備份數據庫以來密碼已更改。 – Lugubrious