微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SecretKeyFactory 不可用 (Jasypt)

如何解决SecretKeyFactory 不可用 (Jasypt)

我正在尝试使用 Jasypt 1.9.3 加密字符串,而我的 JDK 版本是 1.8.0_281。

这是我写的代码

Security.setProperty("crypto.policy","unlimited");
            
if (pooledPBEStringEncryptor == null) {
    
    pooledPBEStringEncryptor = new PooledPBEStringEncryptor();
    
    pooledPBEStringEncryptor.setPassword(encryptionKey);
    pooledPBEStringEncryptor.setAlgorithm("PBEWITHHMACSHA512ANDAES256");
    pooledPBEStringEncryptor.setPoolSize(4);
    pooledPBEStringEncryptor.setSaltGenerator(new RandomSaltGenerator());
}       

encrypted = pooledPBEStringEncryptor.encrypt(cValue);

但是当我运行它时,我得到了错误

Exception in thread "main" java.lang.RuntimeException: Security Error in doEncrypt: org.jasypt.exceptions.EncryptionInitializationException: java.security.NoSuchAlgorithmException: PBEWITHHMACSHA512ANDAES256 SecretKeyFactory not available

我运行了 AlgorithmRegistry.getAllPBEAlgorithms(),我的输出是:

PBEWITHHMACSHA1ANDAES_128,PBEWITHHMACSHA1ANDAES_256,PBEWITHHMACSHA224ANDAES_128,PBEWITHHMACSHA224ANDAES_256,PBEWITHHMACSHA256ANDAES_128,PBEWITHHMACSHA256ANDAES_256,PBEWITHHMACSHA384ANDAES_128,PBEWITHHMACSHA384ANDAES_256,PBEWITHHMACSHA512ANDAES_128,PBEWITHHMACSHA512ANDAES_256,PBEWITHMD5ANDDES,PBEWITHMD5ANDTRIPLEDES,PBEWITHSHA1ANDDESEDE,PBEWITHSHA1ANDRC2_128,PBEWITHSHA1ANDRC2_40,PBEWITHSHA1ANDRC4_128,PBEWITHSHA1ANDRC4_40

当我使用算法 PBEWITHHMACSHA256ANDAES_256 时,我得到一个不同的错误

Exception in thread "main" java.lang.RuntimeException: Security Error in doEncrypt: org.jasypt.exceptions.EncryptionoperationNotPossibleException

我有点不知所措。

我已从 Oracle 下载了无限制策略 jar 并将它们保存在 JAVA_HOME\jre\lib\security\ 文件夹中。而我使用的是 Windows。

解决方法

代码缺少带有 setIvGenerator() 的 IV 生成器的规范,例如:

pooledPBEStringEncryptor.setIvGenerator(new RandomIvGenerator());

默认使用NoIvGenerator,这会导致异常,因为算法应用了CBC模式,需要IV。

顺便说一下,默认的盐生成器是 RandomSaltGenerator,所以不一定需要用 setSaltGenerator() 指定。

PooledPBEStringEncryptor#encrypt() 方法返回盐(16 字节)、IV(16 字节)和密文的 Base64 编码串联。


异常 org.jasypt.exceptions.EncryptionOperationNotPossibleException 是在许多错误情况下生成的一般异常,因此意义不大,请参阅 here。这包括例如缺少 JCE Unlimited Strength Jurisdiction Policy(但似乎已安装在您的系统上)。

为了完整起见:该算法称为 PBEWITHHMACSHA512ANDAES_256(您自己已经找到了)。
PBEWITHHMACSHA512ANDAES_256 使用 PBKDF2 从密码和 salt 派生出 AES-256 的 32 字节密钥。应用 HMAC/SHA512。由于未明确指定,因此使用默认迭代计数 1000。该算法采用 CBC 模式进行加密(这就是为什么需要 IV)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。