簡體   English   中英

在PHP中使用河豚來存儲密碼

[英]Using blowfish in PHP for storing passwords

整個密碼學方面的事情很多,但確實很有趣,我最近一直在閱讀。

我的問題是關於使用河豚來哈希您的密碼進行存儲。 我知道需要鹽,但我不確定該怎么做。 我有一些疑問。

  1. 我看過的許多教程似乎只是隨機地帶給人們的,例如“ oidsjf03”,並將其用於所有鹽類。 他們只是混搭鍵盤還是什么?

  2. 我也讀了很多書,說每個密碼應該有一個唯一的哈希。 因此,我為我存儲的每個密碼分別生成一個鹽。 然后我必須將其存儲在某個地方。 但是在哪里? 如果我只是將其存儲為用戶行中的一個條目,那么如果數據庫遭到破壞,他們會不會僅使用該鹽生成彩虹表?

    我說這是不正確的,因為他們需要為每個密碼生成一個彩虹表,並且河豚創建每個哈希值需要一段時間,所以這是不實際的嗎?

  3. 為什么為每個用戶提供唯一的身份如此重要? 假設您正在使用河豚,並且您的數據庫已被破壞,並且鹽也被捕獲。 黑客可以創建彩虹表來測試您的密碼,但是在哈希值上經過大量回合后,每個密碼可能需要0.1秒的時間。 如果他們想創建一個包含10億個條目的彩虹表,則創建它需要1億秒(或3年左右)。

    如果您使用獨特的鹽並說出1000個密碼,則他們將不得不創建1000個彩虹表,從而將時間增加到3000年。 這是為什么? 每個密碼存儲的時間增加了嗎?

  4. 您如何為哈希生成這種鹽? PHP的uniqid()函數是否足夠?我應該做一些花哨的事情嗎?

  5. 我是否真的需要創建一個完整的類等,還是可以創建一個簡單的函數?

  6. 最后,我聽說phpass提到了很多關於它的安全性,以及用戶應該如何使用它而不是自己潛在地犯錯誤。 這真的是推薦的做法嗎?

1-我讀過很多教程,看似人們只是隨機地想出一個像“ oidsjf03”的教程,並將其用於所有鹽類。 他們只是混搭鍵盤還是什么?

對所有東西使用相同的鹽是一個壞主意。 期。

2-我也讀過很多文章,說每個密碼應該有一個唯一的哈希。 因此,我為我存儲的每個密碼分別生成一個鹽。 然后我必須將其存儲在某個地方。 但是在哪里? 如果我只是將其存儲為用戶行中的一個條目,那么如果數據庫遭到破壞,他們會不會僅使用該鹽生成彩虹表?

鹽是哈希的一部分。 僅當您有多個用戶使用相同的鹽時,Rainbow表才起作用。 但是它們都是獨一無二的,對嗎? 因此,將其與哈希一起存儲就可以了。 #3同樣。

4-如何生成哈希的鹽? PHP的uniqid()函數是否足夠?我應該做一些花哨的事情嗎?

從PHP 5.5開始, 密碼哈希函數已直接內置到PHP中。 同時,請參見前面提到的鏈接,並且在注釋中是指向Github項目的鏈接,該項目與這些功能正向兼容並且可用於PHP> = 5.3.7。

6-最后,我聽說phpass提到了很多關於它的安全性以及用戶應該如何使用它而不是自己潛在地犯錯誤的內容。 這真的是推薦的做法嗎?

內置的PHP函數更好,因為一旦發現任何安全漏洞,它們將始終保持最新狀態。 我會用它們代替。 但是,phpass是一個很好的選擇。

除了上述答案,您還可以在數據庫中用散列來保存鹽,因為如果您的數據庫遭到入侵,附加攻擊者需要了解您的鹽算法。 像hash($ pass。$ salt)或hash(hash($ pass)。$ salt)等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM