網路應用程式安全指南/密碼安全
大多數網路應用程式使用使用者名稱/密碼組合來管理訪問。
為了保持基於密碼的登入機制的安全
- 不要儲存明文密碼,只儲存雜湊值
- 使用 Argon2、scrypt、bcrypt 或其他專門為安全密碼“儲存”而設計的安全雜湊演算法。[1][2]
- 使用每個使用者的鹽
- 使用強化(即多迭代雜湊來減緩暴力破解嘗試)
- 限制每個 IP 的登入嘗試次數(而不是每個使用者帳戶)
- 執行合理但不過於嚴格的密碼策略
- 如果實現了密碼重置流程,請確保它具有足夠的安全性。諸如“母親的孃家姓”之類的問題通常可以被攻擊者猜測,不足以保護。
原理
使用者在多個服務中重複使用密碼。如果攻擊者獲得了對一臺伺服器的訪問許可權,並且可以獲得密碼列表,他可能可以使用此密碼攻擊其他服務。因此,只能儲存密碼雜湊值。大多數語言中易於使用安全雜湊演算法,並確保無法輕易恢復原始密碼,並且不會錯誤地接受錯誤密碼。
在密碼雜湊值中新增鹽可以防止使用彩虹表,並顯著減緩暴力破解嘗試。強化會減緩對被盜雜湊值的離線暴力破解攻擊以及在速率限制失敗的情況下線上暴力破解攻擊。但是,它會增加伺服器上的 CPU 負載,如果未透過登入嘗試限制來阻止,則會開啟 DDoS 攻擊的途徑。良好的強化可以將離線暴力破解攻擊的速度降低 10000 倍或更多。
限制登入嘗試次數對於防止線上暴力破解攻擊和透過密碼強化過程的 CPU 使用率進行的拒絕服務攻擊是必要的。如果沒有限制,攻擊者可以直接嘗試大量密碼來攻擊伺服器。假設每秒 100 次嘗試(對於正常的 Web 伺服器來說是合理的),沒有顯著的強化,並且攻擊者使用多個執行緒,這將導致在一個月內嘗試 259,200,000 個密碼!
不執行任何密碼策略會導致太多使用者選擇“123456”、“qwerty”或“password”作為他們的密碼,使系統容易受到攻擊。執行過於嚴格的密碼策略將迫使使用者儲存密碼或將其寫下來,通常會讓他們感到厭煩並促使他們對所有服務重複使用相同的密碼。此外,使用不符合策略的安全密碼的使用者可能被迫使用更難記憶但未必安全的密碼。由 5 個串聯的隨機選擇的 (!) 小寫字典片語成的密碼比由大小寫字母、數字和標點符號組成的 8 字元密碼安全得多。如果您沒有獲得要實施的密碼策略,而是必須自己設計密碼策略,請牢記這一點。
如果攻擊者無法獲取密碼,他可能會嘗試重置密碼。通常,密碼重置問題的答案很容易找到或猜到。僅靠問題不足以保護。例如,考慮將問題與電子郵件驗證一起使用,傳送一個新的臨時密碼。