Spring Security密码哈希示例

在本教程中,我们将向您展示如何使用BCryptPasswordEncoder在Spring Security中哈希密码并执行登录身份验证。

通常,在过去,我们通常使用MD5 Md5PasswordEncoder或SHA ShaPasswordEncoder哈希算法来编码密码……您仍然可以使用所需的任何编码器,但是Spring建议使用BCrypt BCryptPasswordEncoder ,这是一种更强大的哈希算法,具有随机生成的盐。

使用的技术:

  1. 春天3.2.8。发布
  2. Spring Security 3.2.3发布
  3. Spring JDBC 3.2.3.RELEASE
  4. MySQL服务器5.6

1.查看PasswordEncoder

不再使用熟悉的旧认证PasswordEncoder接口…

package org.springframework.security.authentication.encoding;

//Implementation : Md5PasswordEncoder and ShaPasswordEncoder
@Deprecated
public interface PasswordEncoder {

相反,您应该使用此新的加密PasswordEncoder接口。

package org.springframework.security.crypto.password;

//Implementation : BCryptPasswordEncoder
public interface PasswordEncoder {

2.生成BCrypt密码

首先,对密码进行哈希处理,然后将其放入数据库中,以便以后进行登录身份验证。 本示例使用BCryptPasswordEncoder哈希密码“ 123456”。

PasswordEncoderGenerator.java
package com.mkyong.web.controller;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

public class PasswordEncoderGenerator {

  public static void main(String[] args) {

	int i = 0;
	while (i < 10) {
		String password = "123456";
		BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
		String hashedPassword = passwordEncoder.encode(password);

		System.out.println(hashedPassword);
		i++;
	}

  }
}

在BCrypt哈希算法中,每次生成长度为60的不同哈希值。

$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8.
$2a$10$trT3.R/Nfey62eczbKEnueTcIbJXW.u1ffAo/XfyLpofwNDbEB86O
$2a$10$teJrCEnsxNT49ZpXU7n22O27aCGbVYYe/RG6/XxdWPJbOLZubLIi2
$2a$10$BHG59UT6p7bgT6U2fQ/9wOyTIdejh4Rk1vWilvl4b6ysNPdhnViUS
$2a$10$W9oRWeFmOT0bByL5fmAceucetmEYFg2yzq3e50mcu.CO7rUDb/poG
$2a$10$HApapHvDStTEwjjneMCvxuqUKVyycXZRfXMwjU0rRmaWMsjWQp/Zu
$2a$10$GYCkBzp2NlpGS/qjp5f6NOWHeF56ENAlHNuSssSJpE1MMYJevHBWO
$2a$10$gwbTCaIR/qE1uYhvEY6GG.bNDQcZuYQX9tkVwaK/aD7ZLPptC.7QC
$2a$10$5uKS72xK2ArGDgb2CwjYnOzQcOmB7CPxK6fz2MGcDBM9vJ4rUql36
$2a$10$6TajU85/gVrGUm5fv5Z8beVF37rlENohyLk3BEpZJFi6Av9JNkw9O

每次使用BCrypt散列值时,获得一个不同的值是正常的,因为盐是随机生成的。 在本教程中,我们获得第一个输出并将其插入数据库。

3.数据库

创建表并插入用户“ mkyong”进行测试。

CREATE  TABLE users (
  username VARCHAR(45) NOT NULL ,
  password VARCHAR(60) NOT NULL ,
  enabled TINYINT NOT NULL DEFAULT 1 ,
  PRIMARY KEY (username));

CREATE TABLE user_roles (
  user_role_id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(45) NOT NULL,
  role varchar(45) NOT NULL,
  PRIMARY KEY (user_role_id),
  UNIQUE KEY uni_username_role (role,username),
  KEY fk_username_idx (username),
  CONSTRAINT fk_username FOREIGN KEY (username) REFERENCES users (username));

INSERT INTO users(username,password,enabled)
VALUES ('mkyong','$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8.', true);

INSERT INTO user_roles (username, role)
VALUES ('mkyong', 'ROLE_USER');
INSERT INTO user_roles (username, role)
VALUES ('mkyong', 'ROLE_ADMIN');

4.启用密码编码器

在XML配置中启用密码编码器的几种方法。

4.1使用默认的BCryptPasswordEncoder

spring-security.xml
<authentication-manager>
	<authentication-provider>
	    <password-encoder hash="bcrypt" />
	</authentication-provider>
  </authentication-manager>

4.2将“强度”参数传递给BCryptPasswordEncoder

spring-security.xml
<authentication-manager>
	<authentication-provider>
	    <password-encoder ref="encoder" />
	</authentication-provider>
  </authentication-manager>
	
  <beans:bean id="encoder" 
	class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
	<beans:constructor-arg name="strength" value="11" />
  </beans:bean>

4.3将编码器传递给DaoAuthenticationProvider

spring-security.xml
<bean id="authProvider" 
	class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
	<property name="userDetailsService" ref="customUserService" />
	<property name="passwordEncoder" ref="encoder" />
  </bean>

  <bean id="encoder" 
	class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

4.4注释示例。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	DataSource dataSource;
	
	@Autowired
	public void configAuthentication(AuthenticationManagerBuilder auth) 
		throws Exception {
		
		auth.jdbcAuthentication().dataSource(dataSource)
			.passwordEncoder(passwordEncoder())
			.usersByUsernameQuery("sql...")
			.authoritiesByUsernameQuery("sql...");
	}	
	
	@Bean
	public PasswordEncoder passwordEncoder(){
		PasswordEncoder encoder = new BCryptPasswordEncoder();
		return encoder;
	}

5.项目演示

访问受密码保护的页面: localhost:8080 / spring-security-password-hashing / admin ,显示登录页面。 输入密码“ 123456”,Spring Security将对密码进行哈希处理并将其与数据库中的哈希密码进行比较。

弹簧安全密码编码器

数据库中的用户名和密码。

弹簧安全密码编码器数据库

下载源代码

下载– spring-security-password-hashing.zip (18 KB)

下载– spring-security-password-hashing-annotation.zip (22 KB)

参考文献

  1. 维基百科:Bcrypt
  2. BCryptPasswordEncoder JavaDoc
  3. Spring Security参考:密码编码器

翻译自: https://mkyong.com/spring-security/spring-security-password-hashing-example/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值