文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

加密算法---BCryptPasswordEncoder的使用及原理

2023-08-16 18:32

关注

一 介绍

spring security中的BCryptPasswordEncoder方法采用SHA-256 +随机盐+密钥对密码进行加密。SHA系列是Hash算法,不是加密算法,使用加密算法意味着可以解密(这个与编码/解码一样),但是采用Hash处理,其过程是不可逆的。
(不可逆加密SHA:
基本原理:加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,无法根据密文推算出明文。
RSA算法历史:底层-欧拉函数)

1)加密(encode):注册用户时,使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理,得到密码的hash值,然后将其存入数据库中。

2)密码匹配(matches):用户登录时,密码匹配阶段并没有进行密码解密(因为密码经过Hash处理,是不可逆的),而是使用相同的算法把用户输入的密码进行hash处理,得到密码的hash值,然后将其与从数据库中查询到的密码hash值进行比较。如果两者相同,说明用户输入的密码正确。

二 案例使用

2.1 添加依赖

                  org.springframework.security            spring-security-core             5.7.6        

2.2 PasswordConfig

为了防止有人能根据密文推测出salt,我们需要在使用BCryptPasswordEncoder时配置随即密钥,创建一个PasswordConfig配置类,注册BCryptPasswordEncoder对象:

import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import java.security.SecureRandom;@Data@Configuration@ConfigurationProperties(prefix = "encoder.crypt")public class PasswordConfig {        private int strength;        private String secret;    @Bean    public BCryptPasswordEncoder passwordEncoder() {        //System.out.println("secret = " + secret);        //对干扰因子加密        SecureRandom secureRandom = new SecureRandom(secret.getBytes());        //对密码加密        return new BCryptPasswordEncoder(strength, secureRandom);    }}

2.3 application.yml

encoder:  crypt:    secret: ${random.uuid} # 随机的密钥,使用uuid    strength: 6 # 加密强度4~31,决定盐加密时的运算强度,超过10以后加密耗时会显著增加

2.4 单元测试

import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;@SpringBootTestclass ApplicationTests {    final static private String password = "123456";    @Autowired    private BCryptPasswordEncoder encoder;    @Test    void savePassword() {        // encode():对明文字符串进行加密        //注册用户时,使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理,得到密码的hash值,然后将其存入数据库中。        String encode1 = encoder.encode(password);        System.out.println("encode1:" + encode1);        String encode2 = encoder.encode(password);        System.out.println("encode2:" + encode2);        // matches():对加密前和加密后是否匹配进行验证        //用户登录时,密码匹配阶段并没有进行密码解密(因为密码经过Hash处理,是不可逆的),        // 而是使用相同的算法把用户输入的密码进行hash处理,得到密码的hash值,然后将其与从数据库中查询到的密码hash值进行比较。        // 如果两者相同,说明用户输入的密码正确。        boolean matches1 = encoder.matches(password, encode1);        System.out.println("matches1:" + matches1);        boolean matches2 = encoder.matches(password, encode2);        System.out.println("matches2:" + matches2);    }}

2.5 结果

在这里插入图片描述
2.6 项目源码
项目源码

三 优秀博客

SpringSecurity中的BCryptPasswordEncoder算法
SpringSecurity中的密码加密算法:BCryptPasswordEncoder
BCryptPasswordEncoder使用

来源地址:https://blog.csdn.net/weixin_43811057/article/details/128942965

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯