当前位置: 首页 > news >正文

密码加密——MD5与BCryptPasswordEncoder

目录

一、问题

二、密码加密

1、MD5密码加密

2、BCryptPasswordEncoder加密(推荐)

2.1 特点

2.2 使用步骤


一、问题

在数据库表中的密码都是明文存储的,安全性太低

需求:

将密码加密后存储,提高安全性

二、密码加密

1、MD5密码加密

MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash value),用于确保信息传输完整一致。

功能:

输入任意长度的信息,经过处理,输出为128位的信息
不同的输入得到的不同的结果,结果与输入都是一一对应的

可以使用Spring提供给我们的工具类DigestUtils的md5DigestAsHex方法

        //密码比对(使用MD5加密)//对前端传过来的明文密码进行MD5加密处理password = DigestUtils.md5DigestAsHex(password.getBytes());if (!password.equals(employee.getPassword())) {//密码错误throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}

2011年后MD5加密算法可以被反推出来明文,被破解,已经不推荐使用

2、BCryptPasswordEncoder加密(推荐)

BCrypt 是一种密码散列函数,即单向函数。且每次加密过后的值都不一样!

2.1 特点

加密

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

密码匹配

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

2.2 使用步骤

导入依赖(仓库地址Maven Repository: org.springframework.security » spring-security-crypto (mvnrepository.com))

<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-crypto</artifactId><version>6.2.1</version>
</dependency>

添加加密器

在 SpringBoot 项目的配置文件中添加如下代码,用于注入 BCryptPasswordEncoder 加密器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;@Configuration
public class PasswordEncoderConfiguration {@Beanpublic BCryptPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}
}

验证密码

在需要验证密码的地方,通过@Autowired注解注入密码加密器,然后使用 BCryptPasswordEncoder 的 matches 方法进行匹配

    @Autowiredprivate BCryptPasswordEncoder passwordEncoder;// 使用BCryptPasswordEncoder
// 密码比对
if (!passwordEncoder.matches(password,employee.getPassword())) {//密码错误throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}

加密方法:用于更改密码时将用户输入的明文密码进行加密  

encode(明文密码)

匹配方法:用于比较输入的密码加密后与数据库中已加密的密码进行比对  

matches(用户输入的未加密的密码,数据库中已加密的密码)

源码:

    public String encode(CharSequence rawPassword) {if (rawPassword == null) {throw new IllegalArgumentException("rawPassword cannot be null");} else {String salt = this.getSalt();return BCrypt.hashpw(rawPassword.toString(), salt);}}public boolean matches(CharSequence rawPassword, String encodedPassword) {if (rawPassword == null) {throw new IllegalArgumentException("rawPassword cannot be null");} else if (encodedPassword != null && encodedPassword.length() != 0) {if (!this.BCRYPT_PATTERN.matcher(encodedPassword).matches()) {this.logger.warn("Encoded password does not look like BCrypt");return false;} else {return BCrypt.checkpw(rawPassword.toString(), encodedPassword);}} else {this.logger.warn("Empty encoded password");return false;}}

http://www.lryc.cn/news/290564.html

相关文章:

  • 利用外卖系统源码构建高效的在线订餐平台
  • 数据分析数据 -(用数据讲故事)
  • 如何运用5W2H分析法分析自己适合哪种办公室
  • 为什么考虑电子采购而非传统采购?
  • 【git】git update-index --assume-unchanged(不改动.gitignore实现忽略文件)
  • 科普类——无压缩图像传输带宽的计算(七)
  • 云原生周刊:K8s 1.26 到 1.29 版本的更新 | 2024.1.29
  • 手机壳也能散热了?
  • 《微信小程序开发从入门到实战》学习九十七
  • 二极管漏电流对单片机ad采样偏差的影响
  • 三、防御保护---防火墙安全策略篇
  • 【学网攻】 第(15)节 -- 标准ACL访问控制列表
  • 【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解
  • MySQL十部曲之一:MySQL概述及手册说明
  • node.js基础--01
  • 基于GPT3.5逆向 和 本地Bert-Vits2-2.3 的语音智能助手
  • java stream简介
  • 机电制造ERP软件有哪些品牌?哪家的机电制造ERP系统比较好
  • 分布式ID(4):雪花算法生成ID之Leaf(美团点评分布式ID生成系统)
  • 翻译: GPT-4 Vision征服LLM幻觉hallucinations 升级Streamlit六
  • TextView的setTextSize与xml中android:textSize属性值的对应关系
  • 广东盈致mes系统在注塑行业的应用
  • 如何获得《幻兽帕鲁》隐藏帕鲁唤夜兽?13000个配种配方查询 幻兽帕鲁Steam好评率还在涨 Mac苹果电脑玩幻兽帕鲁 Crossover玩Windows游戏
  • elementui中的tree自定义图标
  • mybatis实现模糊搜索
  • ssh 修改端口号 一个ip ssh多个主机
  • Proto文件如何生成JavaProto对象?
  • LightDB 24.1 UNION支持null类型匹配
  • 使用vs2022将.net8的应用程序发布为一个单独文件
  • 面试经典150题(93-95)