多年來,存儲密碼的標準機制已經發展。在開始時,密碼以純文本格式存儲。假設密碼是安全的,因為數據存儲密碼保存在所需的憑據中以訪問它。但是,惡意用戶能夠找到使用SQL注入等攻擊獲取用戶名和密碼的大量“數據轉儲”的方法。隨著越來越多的用戶憑證成為公共安全專家意識到我們需要做更多的工作來保護用戶密碼。
然后鼓勵開發人員在通過單向散列(如SHA-256)運行密碼后存儲密碼。當用戶嘗試進行身份驗證時,散列密碼將與他們鍵入的密碼的哈希值進行比較。這意味著系統只需要存儲密碼的單向散列。如果發生了破壞,則只暴露密碼的單向哈希。由于哈希是一種方式,并且在計算上難以猜測給定哈希的密碼,因此在系統中找出每個密碼是不值得的。為了打敗這個新系統,惡意用戶決定創建名為Rainbow Tables的查找表。他們不是每次都在猜測每個密碼,而是計算密碼一次并將其存儲在查找表中。
為了降低Rainbow Tables的有效性,鼓勵開發人員使用salted密碼。不是僅使用密碼作為哈希函數的輸入,而是為每個用戶的密碼生成隨機字節(稱為鹽)。 salt和用戶的密碼將通過哈希函數運行,該哈希函數產生唯一的哈希值。鹽將以明文形式存儲在用戶密碼旁邊。然后,當用戶嘗試進行身份驗證時,散列密碼將與存儲的salt的哈希值和他們鍵入的密碼進行比較。獨特的鹽意味著Rainbow Tables不再有效,因為每個鹽和密碼組合的哈希值都不同。
在現代,我們意識到加密哈希(如SHA-256)不再安全。原因是,使用現代硬件,我們可以每秒執行數十億次哈希計算。這意味著我們可以輕松地單獨破解每個密碼。
現在鼓勵開發人員利用自適應單向函數來存儲密碼。使用自適應單向函數驗證密碼是故意的資源(即CPU,內存等)密集型。自適應單向函數允許配置“工作因子”,隨著硬件變得越來越好。建議將“工作因素”調整為大約1秒鐘以驗證系統上的密碼。這種折衷是為了讓攻擊者難以破解密碼,但不是那么昂貴,這給你自己的系統帶來了過多的負擔。 Spring Security試圖為“工作因素”提供一個良好的起點,但鼓勵用戶為自己的系統定制“工作因素”,因為不同系統的性能會有很大差異。應該使用的自適應單向函數的示例包括bcrypt,PBKDF2,scrypt和Argon2。
由于自適應單向函數是有意為資源密集型的,因此為每個請求驗證用戶名和密碼會顯著降低應用程序的性能。 Spring Security(或任何其他庫)無法加速密碼驗證,因為通過使驗證資源密集,可以獲得安全性。鼓勵用戶交換短期憑證(即會話,OAuth令牌等)的長期憑證(即用戶名和密碼)。短期憑證可以快速驗證,而不會有任何安全損失。
- 架構
- 9.技術概述
- 9.1 運行環境
- 9.2 核心組件
- 9.2.1 SecurityContextHolder, SecurityContext and Authentication Objects
- 9.2.2 The UserDetailsService
- 9.2.3 GrantedAuthority
- 9.2.4 總結
- 9.3 驗證
- 9.3.1 在Spring Security中驗證是什么
- 9.3.2 直接設置SecurityContextHolder內容
- 9.4 web應用中的驗證
- 9.4.1 ExceptionTranslationFilter
- 9.4.2 AuthenticationEntryPoint
- 9.4.3 驗證機制
- 9.4.4 在請求之間存儲SecurityContext
- 9.5 Spring Security中的訪問控制(授權)
- 9.5.1 Security and AOP Advice
- 9.5.2 Secure Objects and the AbstractSecurityInterceptor
- 什么是配置屬性
- RunAsManager
- AfterInvocationManager
- 擴展安全對象模型
- 9.6 本地化
- 10 核心服務
- 10.1 The AuthenticationManager, ProviderManager and AuthenticationProvider
- 10.1.1 成功驗證時擦除憑據
- 10.1.2 DaoAuthenticationProvider
- 10.2 UserDetailsService實現
- 10.2.1 In-Memory Authentication
- 10.2.2 JdbcDaoImpl
- Authority Groups
- 10.3 Password Encoding
- 10.3.1 密碼發展史
- 10.3.2 DelegatingPasswordEncoder
- 密碼存儲格式
- 密碼編碼
- 密碼比對
- 入門體驗
- 排除故障
- 10.3.3 BCryptPasswordEncoder
- 10.3.4 Pbkdf2PasswordEncoder
- 10.3.5 SCryptPasswordEncoder
- 10.3.6 其他PasswordEncoders
- 10.4 Jackson的支持
- 11 測試方法安全
- 12 集成spring mvc測試
- 13 webflux支持
- 14 安全過濾器鏈
- 14.1 DelegatingFilterProxy
- 14.2 FilterChainProxy
- 14.2.1 繞過過濾鏈
- 14.3 過濾器順序
- 14.4 匹配請求和http防火墻
- 14.5 與其他基于過濾器的框架一起使用
- 14.6 Advanced Namespace Configuration
- 15. 核心的安全過濾器
- 15.1 FilterSecurityInterceptor
- 15.2 ExceptionTranslationFilter
- 15.3 SecurityContextPersistenceFilter
- 15.4 UsernamePasswordAuthenticationFilter