在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号、密码”存储在db中,但是密码都是明文存储的,显然不太讲究。这一节将学习如何使用spring security3新加入的bcrypt算法,将登录加密存储到db中,并正常通过验证。
一、Bcrypt算法
int t = 0; String password = "123456"; System.out.println(password + " -> "); for (t = 1; t <= 10; t++) { BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String hashedPassword = passwordEncoder.encode(password); System.out.println(hashedPassword); } password = "MIKE123"; System.out.println(password + " -> "); for (t = 1; t <= 10; t++) { BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String hashedPassword = passwordEncoder.encode(password); System.out.println(hashedPassword); }
输出如下:
123456 ->
$2a$10$.Cjkvbgr2JzGkag9IdbT.Oc/sbY7wVqLgAHws7HCxqcI7eczKtCLq
$2a$10$OCOuRV0Wy7ncCND4LcKfMunVEWOzMOyyU95u5TkTRmJqYbsJNecEK
$2a$10$TXttsDZUaeEb2zX6wiwN0eqREKFoCDyh81Kfa6BgAcZ2hyqPNC0Ra
$2a$10$FfLx/gxq.FyeOBb0nbaVeusLhQjASSdY7w45i1ACl/rcYQMmhaXV2
$2a$10$JdPXAxmuz.WTP5gxYiYseeKRSM/HTFzJJdACcDQ4MdhaaLmC0SjI.
$2a$10$yVEWf2MrwjCyi51rUKqQle/MZb7vwcOf6Gwp.hDT2ZUchlyAtJ4pO
$2a$10$FfJg2ATit7btKfJovL6zmug//8rzToQn7FO.fxOzo1KtNNfhWKuca
$2a$10$pOLMkd13n7i3DtVijLEqze1zeURpjtVz5rAx1qOAPqCQvjGG/d6D.
$2a$10$fQ32i8JsjjmqVRpiEsgT3ekTKtrfXn.JNl69beWEx0.YgdX.SEx5e
$2a$10$78brJFSdftip0XXYx4rS6ewdu4SiSsMIBY9oNcLhAZwg3GysRGk2m
MIKE123 ->
$2a$10$U6KVh1NGxAIGYiM4YVgn6OAQt6ayAoLkh2lODv16rSpkS1iqfbR2C
$2a$10$t0FlEOBLEB8VwWJVoZRrweIRV0XyoBgm29c0SMqfqRK3ZBuvhgYbS
$2a$10$QpW6nHnWNhbTTjLq/NbzBu2Unp8ijwyPeUx2N2eMFWReFezosZ5fi
$2a$10$LtPzoQU0IluAgvP3/WhWquUv2AcDRh2ENhAeWDquiN/spitZYe/7q
$2a$10$Qcx7vUudzF7qzTjz.QpLKOby0tXQ4j.uqkInS1n4/6oD2r2eL0rZW
$2a$10$yZw7cdq1y9sjX8nZhYynseWjQ4jeVv76fPmBl.sg2xPvb8cyXD8Sq
$2a$10$kTmT6BQQE5LyRZ00Qas77.F5kxK0GxsW402ExosQswxmG.eBdgIZW
$2a$10$SRfHDNM.m3qX5y1O7V/cp.hQqgaXnKzfxBGRhLkAF39bufejuOieu
$2a$10$Sw5w2kTImJ5Y8UNlE/5/9OLaUgYxhCXU3P3gFBdEbs9PL8pCl60Q2
$2a$10$0mN8kNAl9GNr0c4K1Nr0b.MIcBW0QcPHB/f20hgeBuRfwvgZXT6hG
从 以上输出结果发现bcrypt算法与md5/sha算法有一个很大的区别,每次生成的hash值都是不同的,这样暴力猜解起来或许要更困难一些。同时大家 可能也发现了,加密后的字符长度比较长,有60位,所以用户表中密码字段的长度,如果打算采用bcrypt加密存储,字段长度不得低于60.
二、spring-security.xml
<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd"> <http auto-config="true" use-expressions="true"> <intercept-url pattern="/admin**" access="hasRole('ADMIN')" /> <!-- access denied page --> <access-denied-handler error-page="/403" /> <form-login login-page="/login" default-target-url="/welcome" authentication-failure-url="/login?error" username-parameter="username" password-parameter="password" /> <logout logout-success-url="/login?logout" /> <!-- enable csrf protection --> <csrf /> </http> <!-- Select users and user_roles from database --> <authentication-manager> <authentication-provider> <password-encoder ref="encoder" /> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select d_username username,d_password password, d_enabled enabled from t_users where d_username=?" authorities-by-username-query="select d_username username, d_role role from t_user_roles where d_username=? " /> </authentication-provider> </authentication-manager> <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> <beans:constructor-arg name="strength" value="9" /> </beans:bean> </beans:beans>
对比上一节的内容,只是增加23行、30-33行
最后要做的事情,就是把db中原来明文的密码值,改成经过bcrypt加密后的字符串即可。
tips:如果你仍然喜欢用传统的sha算法来处理密码,只要把23行改成 <password-encoder hash="sha" /> 就可以了
相关推荐
在Spring Security中,默认使用的是BCryptPasswordEncoder或者PBEWithMD5AndDES等加密算法。但为了满足特定需求,我们可以自定义密码编码器。下面是如何实现的步骤: 1. **创建自定义PasswordEncoder**:你需要创建...
Spring Security提供了多种密码编码策略,如BCrypt、PBKDF2等。 3. **RoleHierarchy**:定义角色层次,允许拥有特定角色的用户同时拥有其下属的角色。 4. **RememberMeServices**:实现记住我功能,允许用户在一段...
在使用BCrypt加密密码时,通常会遵循以下步骤: 1. **生成盐值**:首先,系统会生成一个16字节的随机盐值。这个盐值对于每个密码都是唯一的,增加了破解的难度。 2. **设置工作因子**:BCrypt有一个EksBlowfish...
BCryptPasswordEncoder 是 Spring Security 中的一种密码加密器,它使用 BCrypt 算法来加密密码。BCryptPasswordEncoder 提供了一个简单的方式来加密和验证密码。 BCrypt 算法 BCrypt 算法是一种基于哈希函数的...
- 密码通常需要加密存储,Spring Security 提供了通用的密码加密机制,如 BCrypt 或 PBKDF2,这些算法能提供足够的安全性,防止明文密码泄露。 11. **Remember-Me(记住我)认证**: - Remember-Me 功能允许用户...
控制台报错: Encoded password does not look like BCrypt 意思是前端传回去的密码格式与数据库里的密码格式不匹配,这样即使密码正确也无法校验。自然也就无法登录。 造成这种情况的原因主要有以下几点:
xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans ...
Bcrypt是由Niels Provos和David Mazières基于Blowfish加密算法设计的,它通过引入一个随机盐值,使得每次对相同的密码进行哈希都会得到不同的结果。这种盐值的存在增强了密码的安全性,因为即使攻击者获取了哈希库...
本文将深入探讨如何在Spring Boot项目中利用Spring Security进行权限控制,并结合BCrypt加密技术来增强用户密码的安全性,同时也会提及如何使用Thymeleaf模板引擎来呈现动态安全的界面。 首先,我们需要理解Spring ...
7. **密码加密**:SpringSecurity支持多种密码加密策略,包括BCrypt、PBKDF2、SCrypt等,保证了用户密码的安全存储。 8. **国际化支持**:SpringSecurity提供了多语言支持,方便在不同地区部署的应用中使用。 9. *...
- 加强了加密算法的支持,包括 BCrypt、SHA 等。 - 提供了密码编码器的抽象层,方便更换不同的编码方案。 - **测试的改进**: - 添加了新的测试工具类和注解,如 `@WithMockUser`、`@WithAnonymousUser` 等,简化...
// 使用BCrypt算法加密密码 } } ``` 在这个示例中,我们允许所有用户访问根路径,但其他所有请求都需要用户经过身份验证。登录页面设置为"/login",并且允许所有用户访问注销功能。同时,我们还配置了`...
Spring Security 默认使用内存中的用户和角色存储,但在实际应用中,通常需要将这些信息存储在数据库中。为了实现这一点,我们需要配置`UserDetailsService`接口并实现自己的数据访问层。例如,可以创建一个名为`...
SpringBoot 提供了多种密码加密方式,例如使用 BCrypt、MD5、SHA 等算法对密码进行加密。在本示例中,我们使用 BCrypt 算法对密码进行加密。 登录失败次数限制是指限制用户在一定时间内的登录失败次数。当用户登录...
Spring Security推荐使用BCrypt或Argon2等强密码编码器,以确保密码的安全存储。在配置中,需要指定密码编码器,并在User类中存储编码后的密码。 5. **权限控制** 使用`@PreAuthorize`、`@PostAuthorize`、`@...
- 密码加密:Spring Security通常使用BCrypt或PasswordEncoder来加密存储的密码。 5. **自定义登录页面** - Spring Security默认提供一个简单的登录页面,但你可以自定义HTML模板并配置它。 - 使用`loginPage()`...
出于安全考虑,Spring Security不存储明文密码。它支持密码的散列存储,可以配置不同的密码编码器,如BCrypt、SHA-256或PBKDF2等,来增强安全性。 8. 攻击防御(Attack Protection): Spring Security致力于防御...
2. **增强的加密支持**:提供了更强的密码加密算法,确保用户密码的安全存储,如BCrypt或SHA-256。 3. **XML与Java配置**:除了传统的XML配置,3.0.5.RELEASE开始支持Java配置,使得配置更简洁、直观。 四、集成...
在 Spring Security 5.x 中,不再需要显式配置密码加密方式,而是通过在密码字符串前添加特定的前缀来指示所使用的加密算法。例如,`{MD5}88e2d8cd1e92fd5544c8621508cd706b` 表示密码使用 MD5 进行加密,`{bcrypt}$...
Spring Security支持多种密码加密策略,如BCrypt、SHA-256等。在配置中,我们需要指定密码加密器,例如: ```xml <beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt....