2013-09-25 44 views
2

我相信使用PHP的password_hash()函數進行密碼散列可能會傳輸到不同的系統,並仍然可以成功用於驗證目的。PHP password_hash():密碼哈希是否可在系統之間移植?

這是我的理解,bcrypt散列包含所有必要的組件,與純文本密碼結合時,可以驗證給定的密碼。正因爲如此,散列可以採用兼容實現的任何系統,並用於驗證目的。

我很快就會嘗試,但在此之前我想知道我的理論是否正確。

這是正確的嗎?

回答

3

是的,它是正確的。爲password_verify文檔狀態:

注意password_hash()返回算法,成本和鹽作爲返回的哈希值的部分 。因此,需要 驗證散列的所有信息都包含在其中。這允許驗證功能 驗證散列而不需要單獨存儲鹽或 算法信息。

當然它也很容易地看到,這些信息有通過檢查的password_hashcrypt輸出(即,到overgeneralize了一下,主要是一回事)。

+0

Thankyou鏈接到文檔。我讀過password_hash()文檔,並沒有想到讀取password_verify()函數 – michaelward82

-1

我不知道你想保存的哈希值,但如果你將它保存到數據庫中,USW數據庫自身的加密/散列函數 抱怨它

例如(加密)

INSERT INTO table (pass_hash,....) VALUES (MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 (" $password ")) 
SELECT * FROM table WHERE pass_hash = MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 (" $password ") 
+0

我們已經在使用散列。我需要知道是否有任何理由不能接受哈希值,將其存儲在其他系統的其他地方,並且仍然期望驗證哈希值。我看不到這個答案的相關性。 – michaelward82

2

是的,基於crypt()的哈希是便攜式的;他們可以轉移到任何系統,並且可以用它們成功驗證給定的密碼,因爲它包含執行此驗證的所有必要數據。

請注意,由於需要更多的迭代次數,成本較高的系統可能會導致較少的系統花費較長的時間來驗證密碼。

也照顧的存儲要求;如果您總是使用bcrypt,則可以安全地在varchar(60)列中存儲密碼哈希值。否則建議使用varchar(255)

+0

我知道成本問題,但我很高興你提到它。我選擇使用二進制(60)來存儲散列值 - 請參閱http:// stackoverflow。com/questions/5881169/stored-a-hashed-password-bcrypt-in-a-database-type-length-of-column – michaelward82

+0

@ michaelward82我通常在不存儲區域設置敏感值的表上使用'latin1'排序規則,但'二進制'也會做得很好:) –

1

bcrypt algorythm包括它自己的載體和/或鹽,應該是便攜式的。哈希和vecotor/salt都不包含任何特定於系統的內容。

這也應該適用於任何不使用vecotr(或除散列之外的其他元素)或在其輸出中包含此散列的任何其他algorythm。