电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring Security保護用戶密碼常用方法詳解

瀏覽:20日期:2023-08-15 15:10:50

1. 前言

本節將對 Spring Security 中的密碼編碼進行一些探討。

2. 不推薦使用md5

首先md5 不是加密算法,是哈希摘要。以前通常使用其作為密碼哈希來保護密碼。由于彩虹表的出現,md5 和sha1之類的摘要算法都已經不安全了。如果有不相信的同學 可以到一些解密網站 如 cmd5 網站嘗試解密 你會發現 md5 和 sha1 是真的非常容易被破解。

3. Spring Security中的密碼算法

ObjectProvider<PasswordEncoder>參數。這里的PasswordEncoder`就是我們對密碼進行編碼的工具接口。該接口只有兩個功能:一個是匹配驗證。另一個是密碼編碼。

Spring Security保護用戶密碼常用方法詳解

上圖就是Spring Security 提供的org.springframework.security.crypto.password.PasswordEncoder一些實現,有的已經過時。其中我們注意到一個叫委托密碼編碼器的實現 。

3.1 委托密碼編碼器 DelegatingPasswordEncoder

什么是委托(Delegate)?就是甲方交給乙方的活。乙方呢手里又很多的渠道,但是乙方光想賺差價又不想干活。所以乙方根據一些規則又把活委托給了別人,讓別人來干。這里的乙方就是DelegatingPasswordEncoder 。該類維護了以下清單:

final String idForEncode 通過id來匹配編碼器,該id不能是{} 包括的。DelegatingPasswordEncoder 初始化傳入,用來提供默認的密碼編碼器。 final PasswordEncoder passwordEncoderForEncode 通過上面idForEncode所匹配到的PasswordEncoder 用來對密碼進行編碼。 final Map&lt;String, PasswordEncoder&gt; idToPasswordEncoder 用來維護多個idForEncode與具體PasswordEncoder的映射關系。DelegatingPasswordEncoder 初始化時裝載進去,會在初始化時進行一些規則校驗。 PasswordEncoder defaultPasswordEncoderForMatches = new UnmappedIdPasswordEncoder() 默認的密碼匹配器,上面的Map中都不存在就用它來執行matches方法進行匹配驗證。這是一個內部類實現。

DelegatingPasswordEncoder 編碼方法:

@Override public String encode(CharSequence rawPassword) { return PREFIX + this.idForEncode + SUFFIX + this.passwordEncoderForEncode.encode(rawPassword); }

從上面源碼可以看出來通過DelegatingPasswordEncoder 編碼后的密碼是遵循一定的規則的,遵循{idForEncode}encodePassword 。也就是前綴{} 包含了編碼的方式再拼接上該方式編碼后的密碼串。

DelegatingPasswordEncoder 密碼匹配方法:

@Override public boolean matches(CharSequence rawPassword, String prefixEncodedPassword) { if (rawPassword == null && prefixEncodedPassword == null) { return true; } String id = extractId(prefixEncodedPassword); PasswordEncoder delegate = this.idToPasswordEncoder.get(id); if (delegate == null) { return this.defaultPasswordEncoderForMatches.matches(rawPassword, prefixEncodedPassword); } String encodedPassword = extractEncodedPassword(prefixEncodedPassword); return delegate.matches(rawPassword, encodedPassword); }

密碼匹配通過傳入原始密碼和遵循{idForEncode}encodePassword規則的密碼編碼串。通過獲取編碼方式id (idForEncode) 來從 DelegatingPasswordEncoder中的映射集合idToPasswordEncoder中獲取具體的PasswordEncoder進行匹配校驗。找不到就使用UnmappedIdPasswordEncoder 。

這就是 DelegatingPasswordEncoder 的工作流程。那么DelegatingPasswordEncoder 在哪里實例化呢?

3.2 密碼器靜態工廠PasswordEncoderFactories

從名字上就看得出來這是個工廠啊,專門制造 PasswordEncoder 。而且還是個靜態工廠只提供了初始化DelegatingPasswordEncoder的方法:

@SuppressWarnings('deprecation') public static PasswordEncoder createDelegatingPasswordEncoder() { String encodingId = 'bcrypt'; Map<String, PasswordEncoder> encoders = new HashMap<>(); encoders.put(encodingId, new BCryptPasswordEncoder()); encoders.put('ldap', new org.springframework.security.crypto.password.LdapShaPasswordEncoder()); encoders.put('MD4', new org.springframework.security.crypto.password.Md4PasswordEncoder()); encoders.put('MD5', new org.springframework.security.crypto.password.MessageDigestPasswordEncoder('MD5')); encoders.put('noop', org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance()); encoders.put('pbkdf2', new Pbkdf2PasswordEncoder()); encoders.put('scrypt', new SCryptPasswordEncoder()); encoders.put('SHA-1', new org.springframework.security.crypto.password.MessageDigestPasswordEncoder('SHA-1')); encoders.put('SHA-256', new org.springframework.security.crypto.password.MessageDigestPasswordEncoder('SHA-256')); encoders.put('sha256', new org.springframework.security.crypto.password.StandardPasswordEncoder()); return new DelegatingPasswordEncoder(encodingId, encoders); }

從上面可以非常具體地看出來DelegatingPasswordEncoder提供的密碼編碼方式。默認采用了bcrypt 進行編碼。我們可終于明白了為什么上一文中我們使用 {noop12345} 能和我們前臺輸入的12345匹配上。這么搞有什么好處呢?這可以實現一個場景,如果有一天我們對密碼編碼規則進行替換或者輪轉。現有的用戶不會受到影響。 那么Spring Security 是如何配置密碼編碼器PasswordEncoder 呢?

4. Spring Security 加載 PasswordEncoder 的規則

我們在Spring Security配置適配器WebSecurityConfigurerAdapter(該類我以后的文章會仔細分析 可通過https://felord.cn 來及時獲取相關信息)找到了引用PasswordEncoderFactories的地方,一個內部 PasswordEncoder實現 LazyPasswordEncoder。從源碼上看該類是懶加載的只有用到了才去實例化。在該類的內部方法中發現了 PasswordEncoder 的規則。

// 獲取最終干活的PasswordEncoder private PasswordEncoder getPasswordEncoder() { if (this.passwordEncoder != null) {return this.passwordEncoder; } PasswordEncoder passwordEncoder = getBeanOrNull(PasswordEncoder.class); if (passwordEncoder == null) {passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); } this.passwordEncoder = passwordEncoder; return passwordEncoder; } // 從Spring IoC容器中獲取Bean 有可能獲取不到 private <T> T getBeanOrNull(Class<T> type) { try {return this.applicationContext.getBean(type); } catch(NoSuchBeanDefinitionException notFound) {return null; } }

上面的兩個方法總結:如果能從從Spring IoC容器中獲取PasswordEncoder的Bean就用該Bean作為編碼器,沒有就使用DelegatingPasswordEncoder 。默認是 bcrypt 方式。文中多次提到該算法。而且還是Spring Security默認的。那么它到底是什么呢?

5. bcrypt 編碼算法

這里簡單提一下bcrypt, bcrypt使用的是布魯斯·施內爾在1993年發布的 Blowfish 加密算法。bcrypt 算法將salt隨機并混入最終加密后的密碼,驗證時也無需單獨提供之前的salt,從而無需單獨處理salt問題。加密后的格式一般為:

$2a$10$/bTVvqqlH9UiE0ZJZ7N2Me3RIgUCdgMheyTgV0B4cMCSokPa.6oCa其中:$是分割符,無意義;2a是bcrypt加密版本號;10是cost的值;而后的前22位是salt值;再然后的字符串就是密碼的密文了。

5.1 bcrypt 特點

bcrypt有個特點就是非常慢。這大大提高了使用彩虹表進行破解的難度。也就是說該類型的密碼暗文擁有讓破解者無法忍受的時間成本。同時對于開發者來說也需要注意該時長是否能超出系統忍受范圍內。通常是MD5的數千倍。同樣的密碼每次使用bcrypt編碼,密碼暗文都是不一樣的。 也就是說你有兩個網站如果都使用了bcrypt 它們的暗文是不一樣的,這不會因為一個網站泄露密碼暗文而使另一個網站也泄露密碼暗文。所以從bcrypt的特點上來看,其安全強度還是非常有保證的。

6. 總結

今天我們對Spring Security中的密碼編碼進行分析。發現了默認情況下使用bcrypt進行編碼。而密碼驗證匹配則通過密碼暗文前綴中的加密方式id控制。你也可以向Spring IoC容器注入一個PasswordEncoder類型的Bean 來達到自定義的目的。我們還對bcrypt算法進行一些簡單了解,對其特點進行了總結。后面我們會Spring Security進行進一步學習。關于上一篇文章的demo我也已經替換成了數據庫管理用戶。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 楼承板-开口楼承板-闭口楼承板-无锡海逵 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 防火卷帘门价格-聊城一维工贸特级防火卷帘门厂家▲ | 智能交通网_智能交通系统_ITS_交通监控_卫星导航_智能交通行业 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 微型气泵-真空-蠕动-水泵-厂家-深圳市品亚科技有限公司 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 深圳展厅设计_企业展馆设计_展厅设计公司_数字展厅设计_深圳百艺堂 | 北京公积金代办/租房发票/租房备案-北京金鼎源公积金提取服务中心 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 视觉检测设备_自动化检测设备_CCD视觉检测机_外观缺陷检测-瑞智光电 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 电池高低温试验箱-气态冲击箱-双层电池防爆箱|简户百科 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 浙江皓格药业有限公司| 兰州UPS电源,兰州山特UPS-兰州万胜商贸| 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 江西自考网| TwistDx恒温扩增-RAA等温-Jackson抗体-默瑞(上海)生物科技有限公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 包装盒厂家_纸盒印刷_礼品盒定制-济南恒印包装有限公司 | 电缆桥架生产厂家_槽式/梯式_热镀锌线槽_广东东莞雷正电气 | pbt头梳丝_牙刷丝_尼龙毛刷丝_PP塑料纤维合成毛丝定制厂_广州明旺 | 隐形纱窗|防护纱窗|金刚网防盗纱窗|韦柏纱窗|上海青木装潢制品有限公司|纱窗国标起草单位 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 碳钢法兰厂家,非标法兰,定制异型,法兰生产厂家-河北九瑞管道 | 武汉不干胶印刷_标签设计印刷_不干胶标签印刷厂 - 武汉不干胶标签印刷厂家 | 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | 旋转/数显粘度计-运动粘度测定仪-上海平轩科学仪器 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 |