我有一个像这样定义的春天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上使用的密钥大小是多少?
答案 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);