Как правильно настроить 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);