Springboot集成jasypt使用SM4对数据库密码加密过程中遇到的几个问题
如何集成:
1.引入maven依赖:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.0.7</version>
</dependency>
2.自定义加密的工具类,我是沿用公司之前写好的SM4工具类,下面是别人写的:
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SM4;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;
import org.jasypt.encryption.StringEncryptor;
import java.nio.charset.StandardCharsets;
/**
* @author leon
* @date 2023-08-19 10:54:32
*/
@Slf4j
public class Sm4Encryptor implements StringEncryptor {
private static final SM4 SM_4;
static {
byte[] key = "1234567891234560".getBytes();
byte[] iv = "1234567891234560".getBytes();
SM_4 = new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv);
}
@Override
public String encrypt(String message) {
return SM_4.encryptHex(message);
}
@Override
public String decrypt(String encryptedMessage) {
return SM_4.decryptStr(encryptedMessage);
}
public static void main(String[] args) {
String originalValue = "123456";
String encrypted = SM_4.encryptHex(originalValue);
String decrypted = SM_4.decryptStr(encrypted);
log.info("Original Value: {}" , originalValue);
log.info("Encrypted Value: {}" , encrypted);
log.info("Decrypted Value: {}", decrypted);
}
}
3.注册bean:
@Configuration //这个注释别忘了
public class EncryptorConfig{
@Bean(name = "myEncryptor")
public StringEncryptor myEncryptor(){
return new Sm4Encryptor();
}
}
4.修改application.properties:
#新增如下配置 自定义加解密工具的bean名称
jasypt.encryptor.bean=encryptorBean
#另外属性解密的前缀和后缀都是支持自定义 默认如下
jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix=)
#其中cab60ba208f8a7d87c4f631e2763607a为源密码加密后的内容
spring.datasource.password=ENC(cab60ba208f8a7d87c4f631e2763607a)
就完成了。
遇到JCE cannot authenticate the provider BC
Caused by: java.lang.SecurityException: JCE cannot authenticate the provider BC
at javax.crypto.Cipher.getInstance(Cipher.java:656)
at javax.crypto.Cipher.getInstance(Cipher.java:595)
...
... 9 common frames omitted
Caused by: java.util.jar.JarException: file:/C:/app-with-dependencies.jar has unsigned entries - app.properties
at javax.crypto.JarVerifier.verifySingleJar(JarVerifier.java:502)
at javax.crypto.JarVerifier.verifyJars(JarVerifier.java:363)
at javax.crypto.JarVerifier.verify(JarVerifier.java:289)
at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:164)
at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:190)
at javax.crypto.Cipher.getInstance(Cipher.java:652)
网上查了很久,比较有用的办法是更换jdk为openjdk,openjdk不去校验;
我的这个问题也是莫名其妙好的,最开始试着修改了java.security配置,加上了BouncyCastle的配置;
然后在pom中引入了各种BouncyCastle相关的包,都没好,最后本地尝试换了jdk就好了。
然后再换回来,试了居然也好了,不知道是不是之前的security配置没生效。
有大佬知道的话,辛苦不吝赐教。
更多推荐
所有评论(0)