配置Spring TextEncryptor以在Heroku上使用的正确方法是什么

时间:2012-09-27 11:09:15

标签: heroku spring-security

我有一个像这样定义的春天TextEncryptor

<bean id="textEncryptor" class="org.springframework.security.crypto.encrypt.Encryptors"
                                                  factory-method="text">
        <constructor-arg value="${security.encryptPassword}" />
        <constructor-arg value="${security.encryptSalt}" />
</bean>

为这些属性提供了哪些

security.encryptPassword=47582920264f212c566d5e5a6d
security.encryptSalt=39783e315e6a207e733d6f4141

在我的本地环境中工作正常。当我部署到Heroku时,我得到了

java.lang.IllegalArgumentException: Unable to initialize due to invalid secret key
at org.springframework.security.crypto.encrypt.CipherUtils.initCipher(CipherUtils.java:110)
at org.springframework.security.crypto.encrypt.AesBytesEncryptor.encrypt(AesBytesEncryptor.java:65)
at org.springframework.security.crypto.encrypt.HexEncodingTextEncryptor.encrypt(HexEncodingTextEncryptor.java:36)
...
Caused by: java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:972)
at javax.crypto.Cipher.implInit(Cipher.java:738)
at javax.crypto.Cipher.chooseProvider(Cipher.java:797)
at javax.crypto.Cipher.init(Cipher.java:1276)
at javax.crypto.Cipher.init(Cipher.java:1215)
at org.springframework.security.crypto.encrypt.CipherUtils.initCipher(CipherUtils.java:105)
... 53 more

所以我尝试了一些较小的键,但我总是遇到同样的问题。在Heroku上使用的密钥大小是多少?

3 个答案:

答案 0 :(得分:12)

我的回答有点晚,但我写的是为了帮助有需要的人。默认情况下,spring security使用256位密钥进行加密。默认情况下,JDK不允许这样做,它仅支持最多128位密钥。

要解决此问题,您需要下载 local_policy.jar &amp;来自oracle(Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download)的 US_export_policy.jar jars并将其替换为jdk_path / jre / lib / security /。确保重新启动应用程序服务器以使更改生效。

另外,我不会将密钥放在属性文件中。相反,我建议你把它放在一个密钥库中。如果您需要帮助,请告诉我。

答案 1 :(得分:7)

所以我认为我已经结束Heroku只是普通不支持256位AEP,这是Spring-security使用的TextEncoders库存。

相反,我使用Java Simplified Encryption库中的BasicTextEncryptor作为替代后端并实现了TextEncryptor接口。

它不太安全但它有效。它没有提供腌制机制,但我认为图书馆的其他部分也有规定。

如果有人有任何想法如何让股票加密器在heroku上运行那么我认为这仍然是可取的。

答案 2 :(得分:0)

您还可以执行以下操作。虽然这似乎已经停止了Java 8的最新版本。

    Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
    if (Boolean.TRUE.equals(field.get(null))) {
        if (Modifier.isFinal(field.getModifiers())) {
            Field modifiers = Field.class.getDeclaredField("modifiers");
            modifiers.setAccessible(true);
            modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        }
        field.setAccessible(true);
        field.setBoolean(null, false); // isRestricted = false;
        field.setAccessible(false);
    }
    textEncryptor = Encryptors.text(key, salt);