Как правильно настроить spring TextEncryptor для использования на Heroku

у меня есть spring 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 ответов


мой ответ немного опоздал, но я написал его, чтобы помочь всем, кто в этом нуждается. По умолчанию spring security использует 256-разрядный ключ для шифрования. По умолчанию это не разрешено JDK, который поддерживает только 128-разрядные ключи.

чтобы решить эту проблему, вам нужно загрузить local_policy.Джар & US_export_policy.Джар банки из oracle (Java Cryptography Extension (JCE) неограниченная сила юрисдикции файлы политики 7 Скачать) и заменить их в jdk_path/jre/lib/security/. Убедитесь, что вы перезапустили сервер приложений, чтобы изменения вступили в силу.

на отдельной заметке я бы не поместил секретный ключ в файл свойств. Вместо этого я рекомендую вам поместить его в хранилище ключей. Если тебе понадобится помощь, дай мне знать.


поэтому я думаю,что я пришел к выводу, что Heroku просто не поддерживает 256-битный AEP, который используется в текстовых кодерах spring-security.

вместо этого я использовал BasicTextEncryptor из Java Упрощенное Шифрование библиотека в качестве альтернативного бэкэнда и реализован интерфейс TextEncryptor.

Это менее безопасно, но это работает. Он не обеспечивает механизм соления, хотя я думаю, что есть положения для этого в другом месте в библиотека.

Если у кого-нибудь есть идеи, как заставить фондовые шифраторы работать на heroku, то это все равно было бы предпочтительнее, я думаю.


вы также можете сделать следующее. Хотя это, похоже, перестало работать над последними сборками 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);