springsecurity学习——密码加密(代码片段)

sadoshi sadoshi     2022-12-03     112

关键词:

前言

上一篇文章我们实现了从数据库读取用户名密码到Spring Security中,并验证登录成功。不过密码的形式有点奇怪,这篇文章我们研究一下密码加密和比对的问题。

Spring Security的密码加密和比对

密码编码器的使用

Spring Security中的密码编码器主要作用就是为密码加密和进行比对。比如当我们的web应用注册新用户,或者用户修改密码的时候,我们需要使用密码编码器把密码加密后再写入数据库。当用户登录时,输入的密码要和后台已加密的密码进行比对时,密码编码器提供比对的功能,判断两个密码是否匹配。

Spring Security为我们准备了多种密码编码器,我们可以尝试一下:

public static void main(String[] args) 
	BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10);
	System.out.println(encoder.encode("123"));

运行输出,可以看到BCryptPasswordEncoder编码器对“123”进行加密,而且每次输出的结果是不一样的:

除了BCryptPasswordEncoder之外,Spring Security还提供了其他几种密码编码器,使用大同小异。

我们可以尝试进行密码的比对:

public static void main(String[] args) 
	BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10);
	System.out.println(encoder.matches("123", encoder.encode("123")));

这段输出结果为true,代表匹配成功。

 

默认的密码编码器

回到我们上一篇文章的问题。为什么我们之前数据库存储的密码,要在前面加上noop?因为Spring Security使用的默认的密码编码器是DelegatingPasswordEncoder,它是通过策略模式选择密码比对时使用哪个密码编码器。比如密码前缀是noop,则会使用NoOpPasswordEncoder进行比对。如果是bcrypt前缀,则使用BCryptPasswordEncoder。我们可以测试一下效果:

public static void main(String[] args) 
	PasswordEncoder passwordEncoder =
			PasswordEncoderFactories.createDelegatingPasswordEncoder();
	
	BCryptPasswordEncoder BCryptEncoder = new BCryptPasswordEncoder();
	Pbkdf2PasswordEncoder PbkdEncoder = new Pbkdf2PasswordEncoder();
	
	System.out.println(passwordEncoder.matches("123", "noop123"));
	System.out.println(passwordEncoder.matches("123", "bcrypt"+BCryptEncoder.encode("123")));
	System.out.println(passwordEncoder.matches("123", "pbkdf2"+PbkdEncoder.encode("123")));

运行正常的话,这里应该输出三个true。密码前面加了前缀是为了DelegatingPasswordEncoder解密使用的。同样道理,如果用DelegatingPasswordEncoder进行加密,则密码的前面会加上前缀。

为Spring Security配置密码编码器

通常我们存储密码不需要加上加密的前缀,我们只需要指定Spring Security使用哪个密码编码器就好了,在项目中增加配置类:

package com.sadoshi.springsecurity.config;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@EnableWebSecurity
public class WebSecurityConfig 

	@Bean
	public PasswordEncoder passwordEncoder() 
		return new BCryptPasswordEncoder();
	

这里指定使用BCryptPasswordEncoder。之后我们把前面使用BCryptPasswordEncoder加密的字符串替换调目前数据库sys_user里面的密码,然后重新启动程序,并进行登录,输入密码"123",就可以成功登陆。这样我们就不需要在密码前面加上前缀了。

小结

本文介绍了Spring Security的密码编码器,解释了上一篇文章密码前缀的问题,并且在项目中配置了默认的密码编码器。

springsecurity学习——使用数据库保存密码(代码片段)

前言上一篇文章我们已经快速搭起SpringSecurity应用。我们使用的是默认的用户名密码。通常项目中我们使用数据库保存密码,并且数据库的密码是加密保存的。如何做到呢,是这篇文章的重点。引入数据库新建数据库表我... 查看详情

springsecurity——加密系统(代码片段)

一:加密系统简介最早我们使用类似SHA-256这样的单向Hash算法。用户注册成功后,保存在数据库中的不再是用户的明文密码,而是经过SHA-256加密计算的一个字符串,当用户进行登录时,将用户输入的明文密码... 查看详情

进销存系统_springsecurity权限框架&登录&用户密码加密&退出(代码片段)

代码地址:https://gitee.com/bitaotao/jxc-mgmt-par.git一、引入SpringSecurity权限框架为了快速方便实现进销存系统权限管理功能,系统引入SpringSecurity框架对应用权限进行统一控制。1.1、使用SpringSecurity完成用户登录认证1.1.1、jxc-admi... 查看详情

进销存系统_springsecurity权限框架&登录&用户密码加密&退出(代码片段)

代码地址:https://gitee.com/bitaotao/jxc-mgmt-par.git一、引入SpringSecurity权限框架为了快速方便实现进销存系统权限管理功能,系统引入SpringSecurity框架对应用权限进行统一控制。1.1、使用SpringSecurity完成用户登录认证1.1.1、jxc-admi... 查看详情

springsecurity5.0密码未加密报错

...lArgumentException:ThereisnoPasswordEncodermappedfortheid"null"这是因为springsecurity5.0以后默认需要选择密码加密方式,如果还像之前版本直接配置未加密密码,就会报上面这个错误当然啦,如 查看详情

密码加密与微服务鉴权jwt(代码片段)

...户注册时候,对数据库中用户的密码进行加密存储(使用SpringSecurity)。2、使用JWT鉴权认证。一、BCrypt密码加密1、常见的加密方式任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。有很多标准的... 查看详情

springsecurity密码加密

<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId><version>3.2.3.RELEASE</version></dependency>&nb 查看详情

项目一学习框架springsecurity08_00_权限控制@component放到ioc容器里面带盐值的加密

系列文章目录文章目录系列文章目录01回顾-搭建环境02回顾-放行首页和静态资源03回顾-未认证前往登录页04回顾-完整登录流程05回顾-退出登录06回顾-访问控制07回顾-记住我08回顾-使用UserDetailsService查数据库登录09-密码加密10-带盐... 查看详情

项目一学习框架springsecurity08_00_权限控制@component放到ioc容器里面带盐值的加密

系列文章目录文章目录系列文章目录01回顾-搭建环境02回顾-放行首页和静态资源03回顾-未认证前往登录页04回顾-完整登录流程05回顾-退出登录06回顾-访问控制07回顾-记住我08回顾-使用UserDetailsService查数据库登录09-密码加密10-带盐... 查看详情

国密sm4算法加密解密实现以及与springsecurity集成实现(代码片段)

...有一定的优势。项目集成在项目中登录以及鉴权使用的是SpringSecurity,与框架的集成如下。引入依赖首先需要引入如下两个依赖<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>$hutool.... 查看详情

shiro学习——密码的加密解密(代码片段)

前言前面几篇文章的密码都是以明文形式存储。在真实项目中当然不可能明文存储密码,密码一定是以加密的形式存储的。前面我们可以看到当我们给出帐号和密码后,shiro就会去查找ini配置文件或者数据库对应字段来匹... 查看详情

shiro学习——密码的加密解密(代码片段)

前言前面几篇文章的密码都是以明文形式存储。在真实项目中当然不可能明文存储密码,密码一定是以加密的形式存储的。前面我们可以看到当我们给出帐号和密码后,shiro就会去查找ini配置文件或者数据库对应字段来匹... 查看详情

springsecurity权限管理

SpringSecurity权限管理​​1SpringSecurity配置用户名和密码​​​​方式一:在application.properties文件中配置​​​​方式二:代码配置​​​​2HttpSecurity的配置​​​​3登录/注销表单详细配置​​​​4多个HttpSecurity的配置​​​... 查看详情

《springsecurity框架专题》-07自定义加密(代码片段)

...1.MD5加密工具类2.自定义加密器3.修改security配置文件虽然springsecurity已经提供了比较完善的加密机制,但是有时根据业务需求需要定制自己的加密方式。springsecurity提供了加密扩充的接口,下文主要介绍如何在springsecurity中添加自... 查看详情

java-信息安全(十九)加密工具jasypt(代码片段)

...,包括:密码Digest认证,文本和对象加密,集成hibernate,SpringSecurity(Acegi)来增强密码管理。  Jasypt是一个Java库,可以使开发者不需太多操作来给Java项目添加基本加密功能,而且不需要知道加密原理。  根据Jasypt文档,该技... 查看详情

flask学习-25.passlib对密码加密与验证(代码片段)

前言目前常见的不可逆加密算法有以下几种:一次MD5(使用率很高)将密码与一个随机串进行一次MD5两次MD5,使用一个随机字符串与密码的md5值再进行一次md5,使用很广泛其它加密环境准备先安装passlibpipinstallpasslibpasslib... 查看详情

bcryptpasswordencoder加密(代码片段)

SpringSecurity提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCrypt强哈希方法来加密密码。BCrypt强哈希方法每次加密的结果都不一样Stringpass=newBCryptPasswordEncoder().encode("123456"); 查看详情

bcryptpasswordencoder加密(代码片段)

SpringSecurity提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCrypt强哈希方法来加密密码。BCrypt强哈希方法每次加密的结果都不一样Stringpass=newBCryptPasswordEncoder().encode("123456"); 查看详情