返回顶部
首页 > 资讯 > 精选 >Spring Boot 中密码加密的两种方法分别是怎样的
  • 346
分享到

Spring Boot 中密码加密的两种方法分别是怎样的

2023-06-17 08:06:29 346人浏览 泡泡鱼
摘要

Spring Boot 中密码加密的两种方法分别是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。先说一句:密码是无法解密的。大家也不要再问松哥微人事项目中的密码怎么解

Spring Boot 中密码加密的两种方法分别是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

先说一句:密码是无法解密的。大家也不要再问松哥微人事项目中的密码怎么解密了!

密码无法解密,还是为了确保系统安全。今天松哥就来和大家聊一聊,密码要如何处理,才能在最大程度上确保我们的系统安全。

1.为什么要加密

2011 年 12 月 21 日,有人在网络上公开了一个包含 600 万个 CSDN  用户资料的数据库,数据全部为明文储存,包含用户名、密码以及注册邮箱。事件发生后 CSDN 在微博、官方网站等渠道发出了声明,解释说此数据库系 2009  年备份所用,因不明原因泄露,已经向警方报案,后又在官网发出了公开道歉信。在接下来的十多天里,金山、网易、京东、当当、新浪等多家公司被卷入到这次事件中。整个事件中最触目惊心的莫过于  CSDN  把用户密码明文存储,由于很多用户是多个网站共用一个密码,因此一个网站密码泄露就会造成很大的安全隐患。由于有了这么多前车之鉴,我们现在做系统时,密码都要加密处理。

这次泄密,也留下了一些有趣的事情,特别是对于广大程序员设置密码这一项。人们从 CSDN 泄密的文件中,发现了一些好玩的密码,例如如下这些:

  • ppnn13%dkstFeb.1st 这段密码的中文解析是:娉娉袅袅十三余,豆蔻梢头二月初。

  • csbt34.ydhl12s 这段密码的中文解析是:池上碧苔三四点,叶底黄鹂一两声

  • ...

等等不一而足,你会发现很多程序员的人文素养还是非常高的,让人啧啧称奇。

2.加密方案

密码加密我们一般会用到散列函数,又称散列算法、哈希函数,这是一种从任何数据中创建数字“指纹”的方法。

散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来,然后将数据打乱混合,重新创建一个散列值。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。

我们常用的散列函数有 MD5 消息摘要算法、安全散列算法(Secure Hash AlGorithm)。

但是仅仅使用散列函数还不够,单纯的只使用散列函数,如果两个用户密码明文相同,生成的密文也会相同,这样就增加的密码泄漏的风险。

为了增加密码的安全性,一般在密码加密过程中还需要加盐,所谓的盐可以是一个随机数也可以是用户名,加盐之后,即使密码明文相同的用户生成的密码密文也不相同,这可以极大的提高密码的安全性。

传统的加盐方式需要在数据库中有专门的字段来记录盐值,这个字段可能是用户名字段(因为用户名唯一),也可能是一个专门记录盐值的字段,这样的配置比较繁琐。

spring Security 提供了多种密码加密方案,官方推荐使用  BCryptPassWordEncoder,BCryptPasswordEncoder 使用 BCrypt 强哈希函数,开发者在使用时可以选择提供  strength 和 SecureRandom 实例。strength 越大,密钥的迭代次数越多,密钥迭代次数为 2^strength。strength 取值在  4~31 之间,默认为 10。

不同于 shiro 中需要自己处理密码加盐,在 Spring Security 中,BCryptPasswordEncoder  就自带了盐,处理起来非常方便。

3.实践

3.1 codec 加密

commons-codec 是一个 Apache 上的开源项目,用它可以方便的实现密码加密。松哥在 V 部落  项目中就是采用的这种方案(https://GitHub.com/lenve/VBlog)。在 Spring Security 还未推出  BCryptPasswordEncoder 的时候,commons-codec 还是一个比较常见的解决方案。

所以,这里我先来给大家介绍下 commons-codec 的用法。

首先我们需要引入 commons-codec 的依赖:

<dependency>  <groupId>commons-codec</groupId>  <artifactId>commons-codec</artifactId>  <version>1.11</version> </dependency>

然后自定义一个 PasswordEncoder:

@Component public class MyPasswordEncoder implements PasswordEncoder {     @Override     public String encode(CharSequence rawPassword) {         return DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes());     }      @Override     public boolean matches(CharSequence rawPassword, String encodedPassword) {         return encodedPassword.equals(DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes()));     } }

在 Spring Security 中,PasswordEncoder 专门用来处理密码的加密与比对工作,我们自定义 MyPasswordEncoder  并实现 PasswordEncoder 接口,还需要实现该接口中的两个方法:

  • encode 方法表示对密码进行加密,参数 rawPassword 就是你传入的明文密码,返回的则是加密之后的密文,这里的加密方案采用了 MD5。

  • matches 方法表示对密码进行比对,参数 rawPassword 相当于是用户登录时传入的密码,encodedPassword  则相当于是加密后的密码(从数据库中查询而来)。

最后记得将 MyPasswordEncoder 通过 @Component 注解标记为 Spring 容器中的一个组件。

这样用户在登录时,就会自动调用 matches 方法进行密码比对。

当然,使用了 MyPasswordEncoder 之后,在用户注册时,就需要将密码加密之后存入数据库中,方式如下:

public int reg(User user) {     ...     //插入用户,插入之前先对密码进行加密     user.setPassword(passwordEncoder.encode(user.getPassword()));     result = userMapper.reg(user);     ... }

其实很简单,就是调用 encode 方法对密码进行加密。完整代码大家可以参考 V  部落(Https://github.com/lenve/VBlog),我这里就不赘述了。

3.2 BCryptPasswordEncoder 加密

但是自己定义 PasswordEncoder 还是有些麻烦,特别是处理密码加盐问题的时候。

所以在 Spring Security 中提供了 BCryptPasswordEncoder,使得密码加密加盐变得非常容易。只需要提供  BCryptPasswordEncoder 这个 Bean  的实例即可,微人事就是采用了这种方案(https://github.com/lenve/vhr),如下:

@Bean PasswordEncoder passwordEncoder() {     return new BCryptPasswordEncoder(10); }

创建 BCryptPasswordEncoder 时传入的参数 10 就是 strength,即密钥的迭代次数(也可以不配置,默认为  10)。同时,配置的内存用户的密码也不再是 123 了,如下:

auth.inMemoryAuthentication() .withUser("admin") .password("$2a$10$RMuFXGQ5AtH4wOvkUqyVuecpqUSeoxZYqilXzbz50dceRsga.WYiq") .roles("ADMIN", "USER") .and() .withUser("sang") .password("$2a$10$eUHbAOMQ4bpxTvOVz33LIehLe3fu6NwqC9tdOcxJXEhyZ4simqXTC") .roles("USER");

这里的密码就是使用 BCryptPasswordEncoder 加密后的密码,虽然 admin 和 sang 加密后的密码不一样,但是明文都是  123。配置完成后,使用 admin/123 或者 sang/123 就可以实现登录。

本案例使用了配置在内存中的用户,一般情况下,用户信息是存储在数据库中的,因此需要在用户注册时对密码进行加密处理,如下:

@Service public class RegService {     public int reg(String username, String password) {         BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10);         String encodePasswod = encoder.encode(password);         return saveToDb(username, encodePasswod);     } }

用户将密码从前端传来之后,通过调用 BCryptPasswordEncoder 实例中的 encode  方法对密码进行加密处理,加密完成后将密文存入数据库。

4.源码浅析

最后我们再来稍微看一下 PasswordEncoder。

public interface PasswordEncoder {  String encode(CharSequence rawPassword);  boolean matches(CharSequence rawPassword, String encodedPassword);  default boolean upgradeEncoding(String encodedPassword) {   return false;  } }
  • encode 方法用来对密码进行加密。

  • matches 方法用来对密码进行比对。

  • upgradeEncoding 表示是否需要对密码进行再次加密以使得密码更加安全,默认为 false。

Spring Security 为 PasswordEncoder 提供了很多实现:

Spring Boot 中密码加密的两种方法分别是怎样的

但是老实说,自从有了 BCryptPasswordEncoder,我们很少关注其他实现类了。

PasswordEncoder 中的 encode 方法,是我们在用户注册的时候手动调用。

matches 方法,则是由系统调用,默认是在  DaoAuthenticationProvider#additionalAuthenticationChecks 方法中调用的。

protected void additionalAuthenticationChecks(UserDetails userDetails,   UsernamePasswordAuthenticationToken authentication)   throws AuthenticationException {  if (authentication.getCredentials() == null) {   logger.debug("Authentication failed: no credentials provided");   throw new BadCredentialsException(messages.getMessage(     "AbstractUserDetailsAuthenticationProvider.badCredentials",     "Bad credentials"));  }  String presentedPassword = authentication.getCredentials().toString();  if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) {   logger.debug("Authentication failed: password does not match stored value");   throw new BadCredentialsException(messages.getMessage(     "AbstractUserDetailsAuthenticationProvider.badCredentials",     "Bad credentials"));  } }

可以看到,密码比对就是通过 passwordEncoder.matches 方法来进行的。

关于Spring Boot 中密码加密的两种方法分别是怎样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: Spring Boot 中密码加密的两种方法分别是怎样的

本文链接: https://lsjlt.com/news/287887.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring Boot 中密码加密的两种方法分别是怎样的
    Spring Boot 中密码加密的两种方法分别是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。先说一句:密码是无法解密的。大家也不要再问松哥微人事项目中的密码怎么解...
    99+
    2023-06-17
  • Spring Boot集成Shiro并使用SHA-256加密密码的方法
    这篇文章主要介绍“Spring Boot集成Shiro并使用SHA-256加密密码的方法”,在日常操作中,相信很多人在Spring Boot集成Shiro并使用SHA-256加密密码的方法问题上存在疑惑,小...
    99+
    2024-04-02
  • Spring Boot 接口参数加密解密的实现方法
    目录1.开发加解密 starter2.打包发布2.1 安装到本地仓库2.2 发布到线上3.应用4.小结因为有小伙伴刚好问到这个问题,松哥就抽空撸一篇文章和大家聊聊这个话题。 加密解密...
    99+
    2024-04-02
  • Windows中redis设置密码的两种方法
    目录1. 命令行设置密码。2. 配置文件设置密码总结设置密码有两种方式。 1. 命令行设置密码。 运行cmd切换到Redis根目录,先启动服务端 >redis-server.exe 另开一个cmd切换到redis根...
    99+
    2023-04-12
    windows版redis修改密码 Redis设置密码 redis的密码设置
  • CentOS挂载NTFS分区的两种方法分别是怎样的
    这篇文章给大家介绍CentOS挂载NTFS分区的两种方法分别是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。第一种是安装内核模块,可到 http://sourceforge.net/projects/linux-...
    99+
    2023-06-10
  • SpringSecurity BCrypt密码加密和解密的方法是什么
    本篇内容主要讲解“SpringSecurity BCrypt密码加密和解密的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringSecurity BCrypt...
    99+
    2023-07-06
  • MySQL单实例重置密码的两种方法
    MySQL单实例重置密码的两种方法在工作学习中,我们有时会忘记数据库的密码,下面是MySQL单实例密码重置的步骤。说明:(1)[root@mysql1 ~]# cat /etc/redhat-release...
    99+
    2024-04-02
  • PHP源码的加密方法分享
    关于PHP PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的WEB站点。 PHP是能让你生成动态网页的工具之一。PHP网页文件被当作一般HTML网页文件来处理并且在编辑时你可以用编辑HT...
    99+
    2023-09-07
    php 开发语言 加密 工具 服务器
  • Win7怎样文件夹加密码?Win7文件夹加密码的方式
    大家有时为了更好地一些文档的安全系数会对文件夹开展数据加密,可是也有还许多应用Win7的小伙伴们不清楚文件夹如何加密,那麼碰到这样的事情要怎么办呢?下边就和小编一起来了解一下应当怎样实际操作吧。Win7文件夹加密码的方式最先寻找必须加登陆密...
    99+
    2023-07-18
  • php中的加密解密方法是什么
    本篇内容主要讲解“php中的加密解密方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中的加密解密方法是什么”吧!php加密解密的实现方法:1、可以使用“openssl_encryp...
    99+
    2023-06-20
  • Win10系统自带加密文件夹的两种方法
    在Windows 10系统中,有两种方法可以使用自带的加密文件夹功能:1. 使用文件资源管理器加密文件夹:- 打开文件资源管理器并导...
    99+
    2023-09-01
    Win10
  • windows系统密码破解的方法是怎样的
    今天就跟大家聊聊有关windows系统密码破解的方法是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。密码破解方法如下所述:下面为大家介绍的密码破解方法具有简单、安全,并且成功率...
    99+
    2023-06-17
  • windows系统中加密算法若按照密钥的类型划分可以分为哪两种
    这篇文章给大家介绍windows系统中加密算法若按照密钥的类型划分可以分为哪两种,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。加密算法若按照密钥的类型划分可以分为“非对称密钥加密算法”和“对称密钥加密算法”两种。非对称...
    99+
    2023-06-25
  • python代码的几种常见加密方式分享
    目录1.发行.pyc文件1.1 编译加密1.2 是否可逆1.3是否影响模块调用2.代码混淆3.生成exe可执行文件4…py文件转化为.so文件5.附加运行辅助包文件方式...
    99+
    2024-04-02
  • Shell脚本中非交互式修改密码的两种方法
    今天在写一个shell脚本的时候发现需要设置用户的密码,而设置密码是交互式的,这样在脚本中显然是不太好的,因此上网查找资料,发现了以下两种常见的非交互式设置密码的方式: 1:使用chpasswd chpas...
    99+
    2022-06-04
    中非 两种 脚本
  • 解决ubuntu中mysql密码初始化的两种常用方法
    下面讲讲关于解决ubuntu中mysql密码初始化的两种常用方法,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完解决ubuntu中mysql密码初始化的两种常用方法这篇文章你一定...
    99+
    2024-04-02
  • Encrypted Wallet加密方面的理解是怎样的
    Encrypted Wallet加密方面的理解是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 You ...
    99+
    2024-04-02
  • Android中EditText显示明文与密码的两种方式
    效果图如下所述: 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xm...
    99+
    2022-06-06
    edittext Android
  • Mysql忘记密码怎么重置密码的几种实现方法
    目录一、使用 mysqladmin 重置密码二、使用 mysqld 重置密码三、使用 MySQL 安全性模式重置密码四、使用 my.cnf ...
    99+
    2023-10-18
    Mysql忘记密码 Mysql重置密码
  • centos7中Mysql修改密码的几种方法
    修改密码root修改自己密码方法一: mysqladmin -uroot -p'123' password 'new_password' //123为旧密码 方法二:在Mysql中 upda...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作