2012-09-27 61 views
8

使用弹簧TextEncryptor正确的方式,我有这样的什么是配置在Heroku

<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 

的正常工作定义弹簧TextEncryptor环境。当我部署到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上使用的正确密钥大小是多少?

回答

7

所以我认为我已经总结了Heroku只是不支持256位AEP,这是Spring-Security使用的股票TextEncoders。

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

它不太安全,但它的工作原理。它没有提供一个腌制机制,但我认为在图书馆的其他地方有规定。

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

12

我的答案有点晚了,但我写了它来帮助有需要的人。默认情况下,spring安全使用256位密钥进行加密。这是JDK默认不允许的,它只支持128位密钥。

为了解决这个问题,你需要需要从甲骨文(Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download)下载local_policy.jar & 的US_export_policy.jar罐子和JDK_PATH/JRE/lib/security中/替换它们。确保您重新启动应用程序服务器以使更改生效。

在另一个笔记上,我不会将密钥放置在属性文件中。相反,我建议你把它放在一个关键商店。如果你需要帮助,请告诉我。

+0

是的,这是本地安装的正确解决方案。重点在于像Heroku这样的远程托管平台,我们无法控制JDK。 –

+0

我真了不起 - 为什么这些文件没有与Java捆绑在一起。 – msangel

+1

@msangel我会说,它的美国加密出口限制。我很惊讶我们(那些非美国公民)有这样的免费访问权限)。 – HankCa

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);