微服务SpringBoot整合Jasypt加密工具
文章目录
- 一、Jasypt介绍
- 二、Jasypt手动使用
- 2.1 密码加密场景
- 2.2 文本加密场景
- 2.3 数值加密场景
- 2.4 二进制数据加密场景
- 三、Jasypt整合SpringBoot
- 四、生成环境启动
- 无、参考文档
一、Jasypt介绍
Jasypt是Java加密工具包,能支持对密码的哈希加密,对文本和二进制数据的对称加解密,还能集成SpringBoot项目对配置文件中的密钥进行加密存储。
引入依赖如下:
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version>
</dependency>
二、Jasypt手动使用
2.1 密码加密场景
用户注册账户的时候需要输入密码,我们将密码加密后保存到数据库中,保证用户的敏感数据的安全性。当用户再次登录的时候,我们需要将登录密码和注册时保存的密文密码进行比对,只有比对一致才能完成登录。
密码加密工具类主要有三个,它们都是实现了PasswordEncryptor
接口,下面我们逐步来看。
@Slf4j
@RestController
public class SignController {private final BasicPasswordEncryptor basicPasswordEncryptor = new BasicPasswordEncryptor();private String encryptedPassword = null;@GetMapping("/signup/{password}")public String signup(@PathVariable String password){log.info("用户注册密码为:{}", password);encryptedPassword = basicPasswordEncryptor.encryptPassword(password);log.info("用户注册密码加密后为:{}", encryptedPassword);return encryptedPassword;}@GetMapping("/signin/{password}")public String signin(@PathVariable String password){log.info("用户登录密码为:{}", password);if(basicPasswordEncryptor.checkPassword(password, encryptedPassword)){log.info("用户登录成功!");return "success";}log.info("用户登录失败!");return "fail";}}
启动项目后,我们首先注册用户密码localhost:8080/signup/123456
,就能得到密文5b32ygn5pbBvphjIKco6X8Z2VfWqwEUw
,并将其保存到类变量中暂存,当我们再次登录localhost:8080/signin/123456
,就能登录成功了。相反的,如果登录时密码随意输错,就会登录失败。
2022-10-11 15:41:57.038 INFO 26268 --- [nio-8080-exec-1] c.e.myapp.controller.SignController : 用户注册密码为:123456
2022-10-11 15:41:57.039 INFO 26268 --- [nio-8080-exec-1] c.e.myapp.controller.SignController : 用户注册密码加密后为:5b32ygn5pbBvphjIKco6X8Z2VfWqwEUw
2022-10-11 15:42:07.405 INFO 26268 --- [nio-8080-exec-3] c.e.myapp.controller.SignController : 用户登录密码为:123456
2022-10-11 15:42:07.406 INFO 26268 --- [nio-8080-exec-3] c.e.myapp.controller.SignController : 用户登录成功!
2022-10-11 15:42:12.767 INFO 26268 --- [nio-8080-exec-4] c.e.myapp.controller.SignController : 用户登录密码为:123457
2022-10-11 15:42:12.767 INFO 26268 --- [nio-8080-exec-4] c.e.myapp.controller.SignController : 用户登录失败!
那么这种加密方式是什么呢?我们可以打开BasicPasswordEncryptor
的源码,看到类上面的注释:
- Algorithm: MD5.
- Salt size: 8 bytes.
- Iterations: 1000.
意思就是使用的MD5这种哈希算法,并且使用8字节(64位)的盐值,迭代计算1000次得到的密文。
除了使用如上的BasicPasswordEncryptor
工具之外,还有StrongPasswordEncryptor
工具类,它的加密登记更加的安全:
- Algorithm: SHA-256.
- Salt size: 16 bytes.
- Iterations: 100000.
如果这些加密算法都不能满足你的要求,就可以使用ConfigurablePasswordEncryptor
来自定义加密工具类ConfigurablePasswordEncryptor
,可以设置自己需要使用的算法。
总结:
接口类PasswordEncryptor
主要有如下三个实现类:
BasicPasswordEncryptor
,使用MD5算法;StrongPasswordEncryptor
,使用SHA-256算法;ConfigurablePasswordEncryptor
,可自定义指定哈希算法;
哈希算法是不可逆的,因此只有加密encryptPassword和检查checkPassword两个方法。
2.2 文本加密场景
用户的手机号、身份证号等敏感信息在存储的时候需要进行加密,但是这些敏感数据在需要使用的时候是需要明文解密的,因此不适合使用2.1节的哈希算法,而是使用对称加密的形式。
文本加密工具类主要有三个,它们都是实现了TextEncryptor
接口,下面我们逐步来看。
@Slf4j
@RestController
public class TextController {private static final BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();private static final String SECRET = "hello";private String encryptedText = null;static {basicTextEncryptor.setPassword(SECRET);}@GetMapping("/encryptText/{plainText}")public String encryptText(@PathVariable String plainText){log.info("用户输入明文:{}", plainText);encryptedText = basicTextEncryptor.encrypt(plainText);log.info("用户加密密文:{}", encryptedText);return encryptedText;}@GetMapping("/decryptText")public String decryptText(){String plainText = basicTextEncryptor.decrypt(encryptedText);log.info("用户原始明文:{}", plainText);return plainText;}}
项目启动后,我们分别访问localhost:8080/encryptText/hello
进行加密,访问localhost:8080/decryptText
进行解密。
2022-10-11 15:52:36.949 INFO 21652 --- [nio-8080-exec-1] c.e.myapp.controller.TextController : 用户输入明文:hello
2022-10-11 15:52:36.950 INFO 21652 --- [nio-8080-exec-1] c.e.myapp.controller.TextController : 用户加密密文:u/qYluhyFpyOA6xMD3z3JA==
2022-10-11 15:52:46.345 INFO 21652 --- [nio-8080-exec-2] c.e.myapp.controller.TextController : 用户原始明文:hello
我们同样打开BasicTextEncryptor
可以看到它的加密原理:
- Algorithm: PBEWithMD5AndDES.
- Key obtention iterations: 1000.
同样的,我们可以使用安全性更高的StrongTextEncryptor
:
- Algorithm: PBEWithMD5AndTripleDES.
- Key obtention iterations: 1000.
还有安全性更高的AES256TextEncryptor
:
- Algorithm: PBEWithHMACSHA512AndAES_256".
- Key obtention iterations: 1000.
2.3 数值加密场景
如果需要对整数或者小数进行加密,就可以分别使用IntegerNumberEncryptor
接口和DecimalNumberEncryptor
接口的实现类。同样的,这种场景的加密也都是对称加密,用法完全一样。
IntegerNumberEncryptor:主要用来对整数进行加解密。
- BasicIntegerNumberEncryptor
- Algorithm: PBEWithMD5AndDES.
- Key obtention iterations: 1000.
- StrongIntegerNumberEncryptor
- Algorithm: PBEWithMD5AndTripleDES.
- Key obtention iterations: 1000.
- AES256IntegerNumberEncryptor
- Algorithm: PBEWithHMACSHA512AndAES_256.
- Key obtention iterations: 1000.
DecimalNumberEncryptor:主要用来对小数进行加解密。
- BasicDecimalNumberEncryptor
- Algorithm: PBEWithMD5AndDES.
- Key obtention iterations: 1000.
- StrongDecimalNumberEncryptor
- Algorithm: PBEWithMD5AndTripleDES.
- Key obtention iterations: 1000.
- AES256DecimalNumberEncryptor
- Algorithm: PBEWithHMACSHA512AndAES_256.
- Key obtention iterations: 1000.
2.4 二进制数据加密场景
暂未遇到需要加密二进制数据的业务场景,此处略过,使用方法可以参考官网。
三、Jasypt整合SpringBoot
SpringBoot应用中有很多密钥和密码都是存储在配置文件中的,我们需要将它们以密文的方式存储起来。
# 服务器配置
server:port: 8080# Spring配置
spring:# 数据源配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&&serverTimezone=Asia/Shanghai&&useSSL=falseusername: root# 此处是密码的密文,要用ENC()进行包裹password: ENC(KZeGx0ixuy4UrBp1HuhiDNnKB0cJr0cW)# mybatis配置
mybatis:mapper-locations: classpath:mapper/*Mapper.xml# 加密配置
jasypt:encryptor:# 指定加密密钥,生产环境请放到启动参数里面password: your-secret# 指定解密算法,需要和加密时使用的算法一致algorithm: PBEWithMD5AndDES# 指定initialization vector类型iv-generator-classname: org.jasypt.iv.NoIvGenerator
如上是对数据库密码进行加密存储,密文是怎么的来的?可以写一个测试类,使用第二节介绍的内容自己手动加密。
@Slf4j
public final class JasyptUtils {/*** 加密使用密钥*/private static final String PRIVATE_KEY = "lybgeek";private static BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();static {basicTextEncryptor.setPassword(PRIVATE_KEY);}/*** 私有构造方法,防止被意外实例化*/private JasyptUtils() {}/*** 明文加密** @param plaintext 明文* @return String*/public static String encrypt(String plaintext) {log.info("明文字符串为:{}", plaintext);// 使用的加密算法参考2.2节内容,也可以在源码的类注释中看到String ciphertext = basicTextEncryptor.encrypt(plaintext);log.info("密文字符串为:{}", ciphertext);return ciphertext;}/*** 解密** @param ciphertext 密文* @return String*/public static String decrypt(String ciphertext) {log.info("密文字符串为:{}", ciphertext);ciphertext = "ENC(" + ciphertext + ")";if (PropertyValueEncryptionUtils.isEncryptedValue(ciphertext)) {String plaintext = PropertyValueEncryptionUtils.decrypt(ciphertext, basicTextEncryptor);log.info("明文字符串为:{}", plaintext);return plaintext;}log.error("解密失败!");return "";}
}
@Slf4j
public class JasyptUtilsTest {@Testpublic void testEncrypt(){String plainText = "Glrs@1234";String ciperText = JasyptUtils.encrypt(plainText);log.info("加密后的密文为:{}", ciperText);}@Testpublic void testDecrypt(){String ciperText = "KZeGx0ixuy4UrBp1HuhiDNnKB0cJr0cW";String plainText = JasyptUtils.decrypt(ciperText);log.info("解密后的明文为:{}", plainText);}}
经过如上的配置,启动项目,如下从数据库获取数据的应用逻辑就能正常使用了。
@Slf4j
@RestController
public class HelloController {@AutowiredUserMapper userMapper;@GetMapping("/getHello")public String getHello(){log.info("myapp works!");List<User> users = userMapper.listUsers();return users.toString();}}
@Mapper
public interface UserMapper {List<User> listUsers();
}
<mapper namespace="com.example.myapp.mapper.UserMapper"><select id="listUsers" resultType="com.example.myapp.bean.User">select zu.user_id userId, zu.user_name userName, zu.age age, zu.user_email userEmail from zx_user zu;</select>
</mapper>
四、生成环境启动
生产环境密钥作为启动参数:
java -jar -Djasypt.encryptor.password=your-secret
无、参考文档
Jasypt: Java simplified encryption - Jasypt: Java simplified encryption - Main
微服务SpringBoot整合Jasypt加密工具相关推荐
- 微服务Springboot实战大揭秘/高并发/高可用/高负载/互联网技术-任亮-专题视频课程...
微服务Springboot实战大揭秘/高并发/高可用/高负载/互联网技术-320人已学习 课程介绍 Java架构师系列课程是针对有志向架构师发展的广大学员而设置,不管你是工作一到三年, ...
- SpringBoot +SpringCloud微服务示例,整合FreeMaker,AngularJS
SpringBoot +SpringCloud为服服务示例,整合FreeMaker,AngularJS 干货一篇,本节以SpringBoot + SpringCloud为例 构建轻量级微服务,旨在推荐 ...
- springboot整合Jasypt对数据库密码进行加密
Jasypt 的特点 1.高安全性.基于标准的加密技术,适用于单向和双向加密.加密密码.文本.数字.二进制文件 2.适合集成到基于 Spring 的应用程序中 3.用于加密应用程序(即数据源)配置的集 ...
- 【springboot】jasypt加密
参考: https://blog.csdn.net/enthan809882/article/details/105529349 https://amore.blog.csdn.net/article ...
- 近两年火热的微服务springboot不同配置文件详细讲解
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...
- Dubbo系列之微服务框架整合教程
文章目录 一.分布式基本知识 1.1) 架构演变 1.2).分布式基本概念 二.RPC简介 2.1) RPC概念 2.2) RPC核心模块 三.Dubbo原理简介 3.1) Dubbo简介 3.2) ...
- Springboot 整合 jasypt 实现配置文件敏感信息加密,详细步骤
文章目录 一.jasypt 加密介绍 二.springboot 集成步骤 2.1.使用 jasypt -spring-boot-starter 2.2.启动类添加注解 2.3.配置文件 三.测试步骤 ...
- 微服务项⽬整合SwaggerUI3.0
一.在cloud项目中,父工程锁定版本,在common项⽬引入SwaggerUI3.0依赖 parent项⽬已经声明了版本 父工程加入版本控制 <springfox.boot.starter.v ...
- Springboot整合SM2加密的笔记
首先要明白公钥是加密,私钥用来解密. 国密公钥格式:公钥为64位,前后各32位,对应椭圆算法中BigInteger X 和 BigInteger X ,私钥为32位,对应算法中的BigInteger ...
- 微服务调用链监控开源工具CAT
1 监控在微服务架构的地位 2 为何需要调用链监控? 在初期的单体应用,应用都打在一个包中,无分布式概念,监控也只需对一些埋点监控. 但是微服务时代下,很多服务在各自的包,一旦出现问题,没有调用链监控 ...
最新文章
- 王木匠,我服了你一半
- pwnable input2 之 write up
- **52.常用的存储保护方法有哪些?
- jenkins中通过git发版操作记录
- HZOJ visit
- 红帽企业linux7 u盘安装,RedHat企业版7 “yum”重装 CentOS7 “yum”
- Android各种屏幕尺寸
- mvp的全称_库里常规赛mvp是哪一年,分别于2014-15和2015-16赛季荣膺
- 区块链快速入门(八)——以太坊
- 美国通胀大幅下降?可衰退却成为投资者2023年最担心的问题
- 基于依存句法分析的实体关系提取
- 设计模式之结构型模型
- 【正点原子FPGA连载】 第一章 MPSoC简介 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
- 【云栖大会】联想云与阿里云携手打造智能时代云架构
- 移动端特点(重点)~~~
- C++ Vjudge 训练题
- 腾讯云增值税发票OCR
- 局域网安全防护技术(内网)
- 西安工程大学计算机学院薛涛,计算机科学学院召开2021年度国家自然科学基金申报动员会...
- Android 系统应用解析之——odex
热门文章
- halcon教程之VisionPro软件和Halcon软件 的详细对比
- 实用网站合集(持续更新ing)
- 【AI识人】OpenPose:实时多人2D姿态估计 | 附视频测试及源码链接
- 苹果笔记本下载视频剪辑软件pr cc 2019 for mac
- HTML代码页面无法跳转为什么,html超链接不跳转 html为什么超链接不跳转页面
- 计算机密码突然不正确,win10开机密码明明正确,win10密码突然不对了
- 【愚公系列】2022年02月 攻防世界-进阶题-MISC-86(picture2)
- ts无损剪辑合并_视频如何合并?视频合并太难?其实很简单
- 【STC15】使用PCA0和PCA1做的模拟串口
- 学习计算机编程(IT、偏网站开发)的参考学习网址syk