如何集成:

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配置没生效。

有大佬知道的话,辛苦不吝赐教。

                    

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐