2012-07-23 78 views
2

我對你們一個簡單的問題:使用BASE64_ENCODE使用PHP函數crypt()函數時

我用PHP修修補補(我是相對缺乏經驗),以及有興趣開發一個安全的密碼散列系統使用我的網站。通過關於SO的其他文章和問題,我推測我應該使用PHP的crypt()函數來實現BSD的bcrypt哈希算法。

我給你的問題涉及這樣一個事實:當我給函數提供初始化向量或密碼時,不是base64的輸入似乎返回一個「0」作爲散列。以下是我已經實現瞭解決此問題:

$salt = base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)); 

$password = base64_encode($password); 

是否有碰撞的危險或當我改變這樣的編碼,否則降低安全性?

我的想法是,我想允許用戶使用任何範圍的字符作爲他們的密碼(我將執行一個很好的密碼策略),而不必擔心我的散列函數返回一個空的散列。

有沒有更簡單或更優雅的方法來做到這一點?我是否應該使用不限制我的salt和密碼的散列函數?

在此先感謝您提供的任何幫助。

+1

在你的情況下,'base64_encode'不應該有任何用處,因爲它總是可逆的,並且在安全性方面沒有任何區別。使用[base64](http://en.wikipedia.org/wiki/Base64)是將二進制文件表示爲一個字符串。 – 2012-07-23 05:33:30

+0

如何使用[便攜式PHP密碼哈希框架](http://www.openwall.com/phpass/)? – 2012-07-23 05:35:03

+0

「當我給函數提供一個初始化向量或密碼時,不是base64的輸入似乎返回一個」0「作爲散列」...什麼? – 2012-07-23 05:35:43

回答

1

在base64下進行編碼不會增加碰撞的可能性,因爲它只是一對一的翻譯。它不會減少任何密碼干擾。

+0

非常好,這絕對可以解答我的問題。現在我只需要弄清楚是否應該改變我用來散列的方法。感謝您及時的回覆。 :) – NCourts 2012-07-23 05:50:13

0

對於在PHP中哈希,我建議使用hash函數。它需要一個算法來使用,所以你可以通過sha或其他任何東西來拋出它。

至於碰撞,我不擔心他們,你很可能會受到碰撞的影響。

+0

使用'crypt()'有內在的錯誤嗎?我當然願意使用另一種方法,但有沒有理由使用'hash()'來代替?這只是傳統嗎? – NCourts 2012-07-23 05:48:51

+0

這只是簡單的。 crypt更復雜,因爲它更通用,可以進行加密以及散列。請記住,加密不是散列。 – Aatch 2012-07-23 06:13:43

+0

明白了。我肯定會玩'hash()'然後看看它是否讓事情變得更容易。在完成了所有潛伏之後,我熟悉這兩個術語之間的區別。謝謝你的提示! – NCourts 2012-07-23 06:31:00