簡體   English   中英

我在哪里哈希密碼?

[英]Where do I hash the password?

我正在使用MVC,我想知道在哪一點上哈希用戶密碼:

  1. 在發送到服務器之前(查看)
  2. 在服務器中,當我設置對象字段(模型)
  3. 在服務器中,當我將對象發送到控制器(控制器)
  4. 在服務器中,當我准備語句(控制器)
  5. 在數據庫中,

例如在聲明中使用"set password = sha256(:password)"

我有點困惑,我一直在創建對象並設置字段“密碼”時對密碼進行哈希處理,但我在某處讀到了它不夠安全。 我不確定。

  • 在視圖中:這太高了。 您的應用程序中幾乎肯定會有多個視圖使用密碼(兩個簡單的視圖:登錄表單和密碼更改表單),並且視圖中的密碼散列會導致重復。

  • 在數據庫中:太低了。 數據庫永遠不應該看到明文密碼; 在某些情況下,執行此操作最終會通過網絡發送明文密碼,將其顯示在錯誤消息中,或將其寫入數據庫日志。 此外,數據庫支持的大多數哈希函數太快而不能保證密碼存儲的安全性。

  • 在模型中:恰到好處。 我建議在用戶對象上實現類似的方法:

     $user->setPassword($password) # sets password to specified value $user->passwordEquals($password) # returns true if value passed in matches the password 

    請注意,這些方法都沒有公開密碼或它的存儲方式 - 這都是對象的實現細節。

盡快將其哈希在服務器上。 即。 一旦收到客戶的請求。 你真的沒有使用原始密碼的業務。 存儲哈希,忘掉它。

根據經驗,您應該將密碼或密碼的密碼視為熱土豆:您希望盡快停止處理它們。

此外,如果服務器進程受到威脅,您不希望敏感信息潛伏在服務器的內存中。 這就是為什么你應該避免讓原始密碼在內存中停留太久。

在表示邏輯的域對象中使用User實體。 這是在模型層內。

此外,SHA256不應該被認為是足夠好的。 應該應該使用bcrypt 最好用crypt()函數。

首先獲取該字段中的值。 然后應用hash函數。 在控制器中執行上述操作,然后調用模型以存儲在數據庫中。 它會讓你更好地理解。

(我不是專家......很高興分享我的信息.. :)

暫無
暫無

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

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