2016-08-03 49 views
0

我想知道是否可以/明智地在我的網站上爲我的用戶密碼使用兩次password_hash。Double password_hash php

因此,讓我們這樣說:

  • 在我的網站用戶註冊,他們輸入密碼,我們將調用這個 input

  • 在創建帳戶,密碼是$firstHash = password_hash($input, PASSWORD_BCRYPT)(例如起見,讓我們說 這個散列爲「thisFirstHash」

  • 一旦他們的密碼散列,它再次散列$firstHash = password_hash($firstHash, PASSWORD_BCRYPT)(例如着想,讓 說這個散列爲「thisSecondHash」)

  • 這第二個哈希是什麼,是存儲在數據庫中,所以現在當他們 登錄,服務器解密哈希散列。

  • 當用戶登錄時,他們再次輸入密碼,我們再次將 調用那麼這個input

  • 服務器必須重新加密輸入與保存 哈希$loginHash1 = password_hash($input, PASSWORD_BCRYPT)

  • 服務器比較比較新loginHash1變量與保存 哈希password_verify($loginHash1,"thisSecondHash")

  • 如果第一個哈希值匹配,比較第二哈希

  • password_verify($input,"thisFirstHash")

我不能完全得到這個在我小的測試環境中正常工作,我懷疑它是做換湯不換藥的輸入時,隨機鹽是在登錄階段不同。

所以我的問題是,

  1. 是否有可能做到這一點?
  2. 這樣做有益嗎?
+8

請不要__roll你自己的密碼散列。 PHP提供['password_hash()'](http://php.net/manual/en/function.password-hash.php) 和['password_verify()'](http://php.net/manual/) en/function.password-verify.php)請使用它們,我可能想使用你的網站有一天 這裏有一些[關於密碼的好主意](https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet ) 如果您使用5.5以前的PHP版本[此處提供了兼容包](https://github.com/ircmaxell/password_compat) – RiggsFolly

+8

否 - 這不明智,並且不會增加安全性。 –

+0

也許如果你把第一個散列結果反過來,然後用base64對它進行編碼,然後散列那個....記住任意數量的步驟是安全性的關鍵 – Ray

回答

1

密碼哈希API的全部意義在於使實現安全哈希變得簡單。增加複雜性不會增加任何安全性,並且使代碼更難以調試。使用一個password_hash和一個password_verify。 PHP的PASSWORD_DEFAULT選擇是非常強已經:

哈希

$hash = password_hash($cleartext, PASSWORD_DEFAULT) 

要驗證

$isCorrect = password_verify($cleartext, $hash); 

如果你不快樂與PHP的非常強大的默認設置,你可以看看到cost設置。但實際上並不需要。The docs say

password_hash()使用強散列值,產生強的鹽,和 自動應用適當的回合。 password_hash()是一個簡單的 crypt()包裝器,並與現有的密碼哈希兼容。鼓勵使用 password_hash()。

2

password_hash()函數已經重複散列密碼,這被稱爲密鑰拉伸,並且這樣做使得暴力攻擊更加困難。所以使用BCrypt沒有意義。

它在你的情況下不起作用的原因是因爲password_hash()添加了一個隨機鹽,它成爲結果散列的一部分。這種鹽對驗證密碼是必要的,但是在調用函數兩次時,你會丟失第一個鹽。