`
zzc1684
  • 浏览: 1229251 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Spring Security笔记:使用BCrypt算法加密存储登录密码

阅读更多

在前一节使用数据库进行用户认证(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 password hashing example

分享到:
评论

相关推荐

    Spring security 自定义密码加密方式的使用范例。

    在Spring Security中,默认使用的是BCryptPasswordEncoder或者PBEWithMD5AndDES等加密算法。但为了满足特定需求,我们可以自定义密码编码器。下面是如何实现的步骤: 1. **创建自定义PasswordEncoder**:你需要创建...

    Spring Security笔记.rar

    Spring Security提供了多种密码编码策略,如BCrypt、PBKDF2等。 3. **RoleHierarchy**:定义角色层次,允许拥有特定角色的用户同时拥有其下属的角色。 4. **RememberMeServices**:实现记住我功能,允许用户在一段...

    BCRypt加密

    在使用BCrypt加密密码时,通常会遵循以下步骤: 1. **生成盐值**:首先,系统会生成一个16字节的随机盐值。这个盐值对于每个密码都是唯一的,增加了破解的难度。 2. **设置工作因子**:BCrypt有一个EksBlowfish...

    Spring security密码加密实现代码实例

    BCryptPasswordEncoder 是 Spring Security 中的一种密码加密器,它使用 BCrypt 算法来加密密码。BCryptPasswordEncoder 提供了一个简单的方式来加密和验证密码。 BCrypt 算法 BCrypt 算法是一种基于哈希函数的...

    Spring Security 教程(Spring Security Tutorial)1

    - 密码通常需要加密存储,Spring Security 提供了通用的密码加密机制,如 BCrypt 或 PBKDF2,这些算法能提供足够的安全性,防止明文密码泄露。 11. **Remember-Me(记住我)认证**: - Remember-Me 功能允许用户...

    Spring Security报异常 Encoded password does not look like BCrypt

    控制台报错: Encoded password does not look like BCrypt 意思是前端传回去的密码格式与数据库里的密码格式不匹配,这样即使密码正确也无法校验。自然也就无法登录。 造成这种情况的原因主要有以下几点:

    初识 Spring Security - v1.1.pdf

    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加密相关jar包

    Bcrypt是由Niels Provos和David Mazières基于Blowfish加密算法设计的,它通过引入一个随机盐值,使得每次对相同的密码进行哈希都会得到不同的结果。这种盐值的存在增强了密码的安全性,因为即使攻击者获取了哈希库...

    在Spring Boot中使用Spring Security实现权限控制

    本文将深入探讨如何在Spring Boot项目中利用Spring Security进行权限控制,并结合BCrypt加密技术来增强用户密码的安全性,同时也会提及如何使用Thymeleaf模板引擎来呈现动态安全的界面。 首先,我们需要理解Spring ...

    SpringSecurity素材.zip

    7. **密码加密**:SpringSecurity支持多种密码加密策略,包括BCrypt、PBKDF2、SCrypt等,保证了用户密码的安全存储。 8. **国际化支持**:SpringSecurity提供了多语言支持,方便在不同地区部署的应用中使用。 9. *...

    Spring Security参考手册中文版

    - 加强了加密算法的支持,包括 BCrypt、SHA 等。 - 提供了密码编码器的抽象层,方便更换不同的编码方案。 - **测试的改进**: - 添加了新的测试工具类和注解,如 `@WithMockUser`、`@WithAnonymousUser` 等,简化...

    springboot+springSecurity的Demo实例

    // 使用BCrypt算法加密密码 } } ``` 在这个示例中,我们允许所有用户访问根路径,但其他所有请求都需要用户经过身份验证。登录页面设置为"/login",并且允许所有用户访问注销功能。同时,我们还配置了`...

    Spring Security 完整实例

    Spring Security 默认使用内存中的用户和角色存储,但在实际应用中,通常需要将这些信息存储在数据库中。为了实现这一点,我们需要配置`UserDetailsService`接口并实现自己的数据访问层。例如,可以创建一个名为`...

    SpringBoot+Shiro学习之密码加密和登录失败次数限制示例

    SpringBoot 提供了多种密码加密方式,例如使用 BCrypt、MD5、SHA 等算法对密码进行加密。在本示例中,我们使用 BCrypt 算法对密码进行加密。 登录失败次数限制是指限制用户在一定时间内的登录失败次数。当用户登录...

    spring-security使用数据库用户认证

    Spring Security推荐使用BCrypt或Argon2等强密码编码器,以确保密码的安全存储。在配置中,需要指定密码编码器,并在User类中存储编码后的密码。 5. **权限控制** 使用`@PreAuthorize`、`@PostAuthorize`、`@...

    spring-security-samples-contacts-2.0.4

    - 密码加密:Spring Security通常使用BCrypt或PasswordEncoder来加密存储的密码。 5. **自定义登录页面** - Spring Security默认提供一个简单的登录页面,但你可以自定义HTML模板并配置它。 - 使用`loginPage()`...

    2016 page220 Spring Security Essentials - Nanda Nachimuthu.pdf )

    出于安全考虑,Spring Security不存储明文密码。它支持密码的散列存储,可以配置不同的密码编码器,如BCrypt、SHA-256或PBKDF2等,来增强安全性。 8. 攻击防御(Attack Protection): Spring Security致力于防御...

    spring-security-3.0.5.RELEASE

    2. **增强的加密支持**:提供了更强的密码加密算法,确保用户密码的安全存储,如BCrypt或SHA-256。 3. **XML与Java配置**:除了传统的XML配置,3.0.5.RELEASE开始支持Java配置,使得配置更简洁、直观。 四、集成...

    spring security 5.x实现兼容多种密码的加密方式

    在 Spring Security 5.x 中,不再需要显式配置密码加密方式,而是通过在密码字符串前添加特定的前缀来指示所使用的加密算法。例如,`{MD5}88e2d8cd1e92fd5544c8621508cd706b` 表示密码使用 MD5 进行加密,`{bcrypt}$...

    bean配置跑spring security(mysql数据库)_spring security例子

    Spring Security支持多种密码加密策略,如BCrypt、SHA-256等。在配置中,我们需要指定密码加密器,例如: ```xml &lt;beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt....

Global site tag (gtag.js) - Google Analytics