2012-09-27 24 views
8

Tengo un TextEncryptor primavera definido como esto¿Cuál es la forma correcta de configurar un TextEncryptor espiral para usar con 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> 

que se alimenta estas propiedades

security.encryptPassword=47582920264f212c566d5e5a6d 
security.encryptSalt=39783e315e6a207e733d6f4141 

que funciona muy bien en mi local, ambiente. Cuando despliego a Heroku obtengo

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 

Así que probé algunas teclas más pequeñas, pero siempre tengo el mismo problema. ¿Cuál es el tamaño de clave correcto para usar en Heroku?

Respuesta

7

Así que creo que he llegado a la conclusión de que Heroku simplemente no admite AEP de 256 bits, que es lo que usan los TextEncoders stock en primavera.

En su lugar, he utilizado BasicTextEncryptor de la biblioteca Java Simplified Encryption como un back-end alternativo e implementé la interfaz TextEncryptor.

Es menos seguro pero funciona. No proporciona un mecanismo de salazón, aunque creo que hay disposiciones para eso en otra parte de la biblioteca.

Si alguien tiene alguna idea de cómo hacer que los encriptadores en stock trabajen en heroku, creo que eso sería preferible.

12

Mi respuesta es un poco tarde pero la escribí para ayudar a cualquier persona necesitada. De forma predeterminada, la seguridad de primavera utiliza una clave de 256 bits para el cifrado. Esto no está permitido por el JDK de forma predeterminada, que solo admite claves de hasta 128 bits.

Para resolver esto, es necesario que descargar el local_policy.jar & US_export_policy.jar frascos de Oracle (Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download) y reemplazarlos en jdk_path/jre/lib/security /. Asegúrese de reiniciar el servidor de aplicaciones para que los cambios surtan efecto.

En una nota aparte, no colocaría la clave secreta en un archivo de propiedades. En cambio, te recomiendo que lo pongas en una tienda clave. Si necesitas ayuda con eso, házmelo saber.

+0

Sí, esa es la solución correcta para una instalación local. El punto está en una plataforma administrada remota como heroku, no tenemos control sobre el JDK. –

+0

Simplemente sorprendente: por qué estos archivos no están incluidos en java. – msangel

+1

@msangel Diría que es una restricción de exportación de criptografía de EE. UU. Me sorprende que nosotros (los que no son ciudadanos estadounidenses) tengamos acceso gratuito a ellos). – HankCa

0

También puede hacer lo siguiente. Aunque esto parece haber dejado de funcionar en las versiones más recientes de 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); 
Cuestiones relacionadas