jasypt-spring-boot-starter实现加解密和数据返显
jasypt-spring-boot-starter实现加解密和数据返显
⼀、jasypt-spring-boot-starter在springboot中的加解密(默认加密法)
1、导包
<!--实现⾃动加密解密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
注意这⾥引⼊的版本号,2.x和3.x会有差别,后⾯会讲
2、配置yml
2.1、关于jasypt部分的配置:
jasypt:
encryptor:
#加解密的密码
password: atpingan
#jasypt默认更改了算法,如果不指定那么会报错:failed to bind properties under 'spring.datasource.druid.password' to java.lang.String
#解决办法:①把版本降到2.x②指定加密⽅法,如下
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
2.2、关于加密部分的配置:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: sql.cj.jdbc.Driver
url: jdbc:mysql://192.168.200.141:3306/mysql?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=fal se&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
#加密密码atpingan
username: ENC(kud5ZnaMJYve284geT0ITw==)
password: ENC(0CwfH4246HP22Rv74d/ZPw==)
其中ENC()是默认加密法的固定配置,后⾯会讲⾃定义加密法
2.3、重点:(2.x和
3.x的区别)
jasypt默认更改了算法,如果不指定那么会报错:failed to bind properties under spring.datasource.druid.password' to java.lang.String #解决办法:
①把版本降到2.x
②指定加密⽅法,如下
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
3、计算ENC()中的内容
上⾯你是否疑惑ENC(kud5ZnaMJYve284geT0ITw==)中的内容是怎么来的?
他是根据:
jasypt:
encryptor:
#加解密的密码
password: atpingan
的密码来计算出来的。⾃⼰建⼀个main⽅法类,计算出来即可,计算完这个类就没⽤了,可以删除。public static void main(String[] args){
BasicTextEncryptor textEncryptor =new BasicTextEncryptor();
textEncryptor.setPassword("atpingan");
String userName = pt("root");
String passWord = pt("123456");
System.out.println("userName==="+userName);
System.out.println("passWord==="+passWord);
}
4、添加注解
在启动类上添加注解 @EnableEncryptableProperties
启动项⽬,发现正常,那就是对数据库的账号密码实现了加密
⼆、⾃定义加密、解密及前缀后缀⽅法
1、导包(只列出最主要的包,其他相关的包不⼀⼀列举)
<!--实现⾃动加密解密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
2、写配置类(重点)
2.1、启动加载的配置类JasyptConfiguration ,即⼊⼝。
@Configuration
public class JasyptConfiguration {
//这⾥的名字必须是jasyptStringEncryptor,不能改动
@Bean(name ="jasyptStringEncryptor")
@ConditionalOnMissingBean
public StringEncryptor stringEncryptor(MyEncryptablePropertyDetector propertyDetector){
return new DefaultEncryptor(propertyDetector);
}
/
/这⾥的名字必须是encryptablePropertyDetector,不能改动
@Bean(name ="encryptablePropertyDetector")
@ConditionalOnMissingBean
public MyEncryptablePropertyDetector encryptablePropertyDetector(){
return new MyEncryptablePropertyDetector();
}
}
2.2、监听类,它会到配置⽂件中包含指定前后缀的数据,如这⾥指定的 ikms( 和 )
public class MyEncryptablePropertyDetector implements EncryptablePropertyDetector { private String prefix ="ikms(";
private String suffix =")";
public MyEncryptablePropertyDetector(){
}
public MyEncryptablePropertyDetector(String prefix, String suffix){
this.prefix = prefix;
this.suffix = suffix;
}
/**
*判断配置⽂件中的数据是否是按这⾥指定前后缀组装的
**/
@Override
public boolean isEncrypted(String message){
if(StringUtils.isBlank(message)){
return false;
}else{
String trimmedValue = im();
return trimmedValue.startsWith(this.prefix)&& dsWith(this.suffix);
}
}
@Override
public String unwrapEncryptedValue(String message){
/**
*获取到上⾯⽅法返回true的数据
* 此处原数据返回,不作处理,统⼀在DefaultEncryptor处理
*/
return message;
}
public String getPrefix(){
return prefix;
}
public void setPrefix(String prefix){
this.prefix = prefix;
}
public String getSuffix(){
return suffix;
}
public void setSuffix(String suffix){
this.suffix = suffix;
}
}
2.3、实现凯撒解密并把数据返显回配置⽂件
public class DefaultEncryptor implements StringEncryptor {
/**
*获取写在配置⽂件中的参数,这⾥是解密的密码
**/
@Value("${ptor.password}")
private int decryptPassword;
private MyEncryptablePropertyDetector propertyDetector;
public DefaultEncryptor(){
}
public DefaultEncryptor( MyEncryptablePropertyDetector propertyDetector){
this.propertyDetector = propertyDetector;
}
/**
*这⾥是加密⽅法,我们不在这⾥加密,原参数返回
**/
@Override
public String encrypt(String encryptMessage){
return encryptMessage ;
}
/**
*凯撒解密
**/
@Override
public String decrypt(String decryptMessage){
/**
* 从MyEncryptablePropertyDetector的 unwrapEncryptedValue⽅法返回的数据在这⾥处理 */
String prefix = Prefix();
String suffix = Suffix();
int prefixIndex = decryptMessage.indexOf(prefix);
int suffixIndex = decryptMessage.indexOf(suffix);
/**
* 截取括号中间部分,例如:ikms(邻居⼩玲) ⾥⾯的:邻居⼩玲
*/
decryptMessage = decryptMessage.substring(prefixIndex+prefix.length(),suffixIndex);
/**
* 做凯撒解密:加解密公共⽅法,请往后看
*/
String result = KaiserUtil.decryptKaiser(decryptMessage,decryptPassword);
return result;
}
}
2.4、凯撒加解密的公共⽅法
public class KaiserUtil {
public static void main(String[] args){
String encryptKaiser =encryptKaiser("root",123456789);
String decryptKaiser =decryptKaiser(encryptKaiser,123456789); System.out.println("encryptKaiser==="+encryptKaiser);
System.out.println("decryptKaiser==="+decryptKaiser);
}
/**
* 使⽤凯撒加密⽅式加密数据
* @param orignal :原⽂
* @param key :密钥
* @return :加密后的数据
*/
public static String encryptKaiser(String orignal,int key){
// 将字符串转为字符数组
char[] chars = CharArray();
StringBuilder sb =new StringBuilder();
/
/ 遍历数组
for(char aChar : chars){
// 获取字符的ASCII编码
int asciiCode = aChar;
// 偏移数据
asciiCode += key;
// 将偏移后的数据转为字符
char result =(char) asciiCode;
// 拼接数据
sb.append(result);
}
String();
}
/**
* 使⽤凯撒加密⽅式解密数据
* @param encryptedData :密⽂
* @param key :密钥
* @return : 源数据
*/
public static String decryptKaiser(String encryptedData,int key){
// 将字符串转为字符数组
springboot结构char[] chars = CharArray();
StringBuilder sb =new StringBuilder();
// 遍历数组
for(char aChar : chars){
// 获取字符的ASCII编码
int asciiCode = aChar;
// 偏移数据
asciiCode -= key;
// 将偏移后的数据转为字符
char result =(char) asciiCode;
// 拼接数据
sb.append(result);
}
String();
}
}
3、写配置⽂件
3.1、配置jasypt密钥及指定加解密⽅法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论