2011-06-24 59 views
0

對不起,這可能是愚蠢的,但有一些我不明白關於Phpass。如果我能創造一個安全的哈希密碼是這樣的:Phpass - 無法訪問所有密碼的危險?

$pwdHasher = new PasswordHash(8, FALSE); 
$hash = $pwdHasher->HashPassword($password); 

,後來檢查是這樣的:

$checked = $pwdHasher->CheckPassword($password, $hash); 

那麼這意味着,在邏輯上的密碼必須存放在這樣一種方式,他們只能在特定的機器上閱讀(否則有人可以使用另一臺機器上的「CheckPassword」功能獲取密碼)。 Phpass如何做到這一點?

如果將來需要將網站移動到新的服務器,這不會導致問題嗎?如何安全備份我的數據庫,以便在發生重大服務器故障時,我可以恢復所有密碼? (我是否錯過了一些明顯的東西?)

編輯 - 針對下面的註釋,如果不同的機器不影響它,那麼如果黑客訪問我的數據庫,爲什麼他們不能在他們自己的機器上執行CheckPassword獲取原始密碼?對不起,我一定錯過了一些明顯的東西。

編輯2 - 該死的,我錯過了一些明顯的東西。比較函數只檢查給定的密碼和散列函數的密碼,並返回true或false - 你實際上不必親自訪問密碼。爲愚蠢而道歉!

+0

不同的機器不會影響任何東西。 – Ibu

+0

機器爲什麼會影響它? –

+0

CheckPassword不會*返回原始密碼。 CheckPassword只是檢查傳入的密碼是否散列到傳入的散列。如果是,則返回'true',否則返回'false'。 –

回答

2

由bcrypt創建的散列使用模塊化crypt格式,該格式不僅包含散列值,而且還包含已使用散列函數的指示符,回合數以及用於創建散列值的salt。在你的情況下,返回的字符串是這樣的:

$2a$08$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh 

這意味着你需要驗證密碼存儲在此字符串中的一切。

之所以攻擊者不能只使用此字符串,並得到原來的密碼就是一個很好的cryptographic hash functions因爲一個顯著屬性:「是不可行的生成具有給定的散列消息」

+0

該死的,我錯過了一些明顯的東西!比較函數只檢查給定的密碼和散列函數的密碼,並返回true或false - 你實際上不必親自訪問密碼。爲愚蠢而道歉! –

0

CheckPassword()確實不是返回原始密碼。 CheckPassword只是檢查傳入的密碼是否散列到傳入的散列。如果是,則返回true,如果不是,則返回false。您可能需要閱讀phpass article "How to manage a PHP application's users and passwords"。這給出了密碼哈希如何工作的詳細描述,特別是在phpass中。

+0

謝謝,我解決了這個問題。現在我感到很蠢。 –

+0

@ james.bcn,不要覺得蠢。那裏有更多的人不知道答案。你選擇提出一個問題,而不是僅僅依賴未知。 – Jacco