2012-09-27 105 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);