BCrypt密码加密

1 准备工作

任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。有很多标准的算法比如SHA或者MD5,结合salt(盐)是一个不错的选择。 Spring Security 提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCrypt强哈希方法来加密密码。

BCrypt强哈希方法 每次加密的结果都不一样。

(1)tensquare_user工程的pom引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

(2)添加配置类 (资源/工具类中提供)

我们在添加了spring security依赖后,所有的地址都被spring security所控制了,我们目前只是需要用到BCrypt密码加密的部分,所以我们要添加一个配置类,配置为所有地址都可以匿名访问。

/**
 * 安全配置类
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/**").permitAll()
                .anyRequest().authenticated()
                .and().csrf().disable();
    }
}

(3)配置bean

@Configuration//告诉项目这是个配置文件早点加载
@EnableWebSecurity //以实现Web安全性
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public BCryptPasswordEncoder bcryptPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/**").permitAll()
                .anyRequest().authenticated()
                .and().csrf().disable();
    }
}

2 密码加密

	@Autowired
	BCryptPasswordEncoder encoder;
	
	public void add(Admin admin) {
		admin.setId(idWorker.nextId()+""); //主键值
		//密码加密	
		String newpassword = encoder.encode(admin.getPassword());//加密后的密码
		admin.setPassword(newpassword);			
		adminDao.save(admin);
	}

3 密码比较

	/**
	 * 根据登陆名和密码查询
	 * @param loginname
	 * @param password
	 * @return
	 */
	public Admin findByLoginnameAndPassword(String loginname, String password){
		Admin admin = adminDao.findByLoginname(loginname);
		if( admin!=null && encoder.matches(password,admin.getPassword())){
			return admin;
		}else{
			return null;
		}
	}
encoder.matches(CharSequence rawPassword, String encodedPassword)   

### bcrypt 加密算法的使用说明与实现方式 bcrypt 是一种广泛用于密码存储的安全加密算法,其核心思想是通过对明文密码进行多次加密处理,生成一个含盐值和工作因子的哈希值[^1]。以下是对 bcrypt 加密算法的详细解析: #### 1. 工作原理 bcrypt 的主要特点是引入了 **盐值** 和 **工作因子**(也称为成本因子)。盐值的作用是防止彩虹表攻击,而工作因子则决定了加密的复杂度。具体来说: - **盐值**:每个密码加密时都会生成一个随机的盐值,确保即使两个用户的密码相同,生成的哈希值也不一样。 - **工作因子**:控制加密的迭代次数,通常用 `2^cost` 表示。例如,`cost=10` 意味着密码会被加密 `2^10=1024` 次。 bcrypt 的输出结果是一个字符串,含了盐值、工作因子以及最终的哈希值[^2]。 #### 2. Go语言中的实现 以下是使用 Go 语言实现 bcrypt 加密的代码示例: ```go package main import ( "log" "golang.org/x/crypto/bcrypt" ) func main() { // 定义明文密码 password := []byte("password") // 生成哈希值,设置工作因子为默认值 hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost) if err != nil { log.Fatal(err) } log.Println("哈希值:", string(hashedPassword)) // 验证密码是否匹配 err = bcrypt.CompareHashAndPassword(hashedPassword, password) if err != nil { log.Println("密码不匹配") } else { log.Println("密码匹配") } } ``` 上述代码展示了如何使用 `bcrypt.GenerateFromPassword` 方法生成哈希值,并通过 `bcrypt.CompareHashAndPassword` 方法验证密码是否正确[^2]。 #### 3. Java语言中的实现 在 Java 中,可以使用 JBCrypt 库来实现 bcrypt 加密。以下是一个简单的示例: ```java import org.mindrot.jbcrypt.BCrypt; public class BcryptExample { public static void main(String[] args) { // 定义明文密码 String plainPassword = "password"; // 生成含盐值的哈希密码,设置工作因子为12 String hashedPassword = BCrypt.hashpw(plainPassword, BCrypt.gensalt(12)); System.out.println("哈希值: " + hashedPassword); // 验证密码是否匹配 if (BCrypt.checkpw(plainPassword, hashedPassword)) { System.out.println("密码匹配"); } else { System.out.println("密码不匹配"); } } } ``` 这段代码中,`BCrypt.hashpw` 方法用于生成含盐值的哈希密码,而 `BCrypt.checkpw` 方法用于验证输入的明文密码是否与存储的哈希密码匹配[^3]。 #### 4. Python中的实现 Python 中可以使用 `bcrypt` 库来实现类似的功能: ```python import bcrypt # 定义明文密码 password = b"password" # 生成含盐值的哈希密码 hashed_password = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12)) print("哈希值:", hashed_password.decode()) # 验证密码是否匹配 if bcrypt.checkpw(password, hashed_password): print("密码匹配") else: print("密码不匹配") ``` 此代码展示了如何使用 `bcrypt.hashpw` 方法生成哈希值,并通过 `bcrypt.checkpw` 方法验证密码[^4]。 --- ### 注意事项 - 工作因子的选择应根据实际需求调整。较高的工作因子会增加计算时间,从而提高安全性,但也可能导致性能问题。 - 盐值由算法自动生成,无需手动干预,但需确保每次生成的盐值都是唯一的。 - 建议定期更新 bcrypt 的库版本,以利用最新的安全改进。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值