Spring Security:简单加密/解密不起作用:InvalidKeyException

Posted

技术标签:

【中文标题】Spring Security:简单加密/解密不起作用:InvalidKeyException【英文标题】:Spring Security: Simple Encryption / decryption not working: InvalidKeyException 【发布时间】:2018-03-18 02:42:27 【问题描述】:

我正在尝试编写一个非常简单的程序来加密和解密字符串:

    String password = "kdfljxcasd";
    String encodeThat = "Hello World + some special chars!^^-";
    String salt = KeyGenerators.string().generateKey();
    BytesEncryptor encryptor = Encryptors.standard(password, salt);

    // breakpoint steping doesn't reach that point - it gets stuck here for some reason... 
    byte[] encrypted = encryptor.encrypt(encodeThat.getBytes());
    byte[] decrypted = encryptor.decrypt(encrypted);

    System.out.println("Before encryption: " + encodeThat);     
    System.out.println("Encrypted: " + encrypted.toString());       
    System.out.println("After encryption: " + decrypted.toString());

但由于某种原因,我从未得到加密值。当我打电话给enryptor.encrypt() 时,它永远不会到达那个点。

我收到以下异常:

'Unable to initialize due to invalid secret key' java.lang.IllegalArgumentException: Unable to initialize due to invalid secret key

我做错了什么?

【问题讨论】:

【参考方案1】:

好的,经过几个小时的搜索,我终于找到了解决方案:

显然我没有安装正确的无限力量政策。

我就是这样解决的:

    从以下位置下载政策:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

    解压并将 local_policy.jarUS_export_policy.jar 放入 $jdk -path/jre/lib/security 并覆盖现有文件。 (注意:不要把它放在 JRE 文件夹中。你必须把它放在 jdk/jre/... - 这花了我几个小时 :))

    重启服务器就可以了!

希望有所帮助:)

【讨论】:

有没有办法在不添加外部 jar 的情况下做到这一点? 我不知道,抱歉。但是您需要一个没有外部 jar 的解决方案吗?【参考方案2】:

从 Java 8u151 开始,您可以使用属性解决此问题:

Security.setProperty("crypto.policy", "unlimited");

【讨论】:

【参考方案3】:

尝试升级到较新的 java 8 JDK 版本。

对我来说,我尝试了 2 个版本:

1.8.131 - 失败 1.8.201 - 成功

【讨论】:

【参考方案4】:

遇到这个问题并通过从JDK 1.8 切换到Adopt Open JDK 8 来解决它

【讨论】:

以上是关于Spring Security:简单加密/解密不起作用:InvalidKeyException的主要内容,如果未能解决你的问题,请参考以下文章

AES简单加密解密的方法实现

Spring Cloud Config 加密和解密

Spring Cloud Config 加密和解密

Spring Cloud(03)——内置加解密支持

如何从 Grails 中的 Spring Security 获取普通密码或解密密码?

AES加密解密