2011-05-25 22 views
9

Estoy usando la biblioteca de cifrado Jasypt para encriptar/descifrar algo de texto. Este código está incrustado en un archivo WAR y se implementa en un servidor.org.jasypt.exceptions.EncryptionOperationNotPossibleException en Tomcat

Cuando se ejecuta localmente, y en pruebas unitarias, el ciclo de cifrado/descifrado funciona perfectamente. Yo uso Jetty para desarrollar la aplicación. El código funciona perfectamente en ese servidor. Por alguna razón, la implementación en Tomcat lo rompe con la siguiente excepción:

FYI, tengo las fuertes bibliotecas de cifrado instaladas tanto en mi entorno local como en el servidor y estoy usando la última versión 1.6 (parche nivel 25).

org.jasypt.exceptions.EncryptionOperationNotPossibleException

La excepción no tiene ningún mensaje.

El código es completamente simétrico. Lo pegué aquí para su examen. Aquí están los bits relevantes:

Encontré un old Nabble post donde un usuario tenía un problema muy similar. El código funcionaba en todas partes, excepto en Tomcat. No se dio ninguna solución.

Cualquier idea sería muy apreciada.

** Actualización: ** Corriendo en Tomcat en mi sistema local, parece que funciona. Entonces hay algo sobre mi servidor. En el servidor, estoy usando una JVM de 64 bits en Windows Server 2008. Estoy usando una JVM de 32 bits localmente (debido a que mi sistema es un poco más antiguo). Me pregunto si esto tiene algo que ver con el problema.

public void initializeService() { 
    binaryEncryptor = new BasicBinaryEncryptor(); 
    binaryEncryptor.setPassword(keyBase64); 
} 

@Override 
public <T extends Serializable> String simpleEncrypt(T objectToEncrypt) throws EncryptionException { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     ObjectOutputStream oos = new ObjectOutputStream(bos); 
     oos.writeObject(objectToEncrypt); 

     byte[] bytes = binaryEncryptor.encrypt(bos.toByteArray()); 
     return new String(Base64.encodeBase64(bytes)); 
    } catch (IOException e) { 
     LOGGER.error("failed to encrypt String: " + e.getMessage()); 
     throw new EncryptionException(e.getMessage(), e); 
    } catch (Exception e) { 
     LOGGER.error("failed to encrypt String: " + e.getMessage()); 
     throw new EncryptionException(e.getMessage(), e); 
    } 
}; 

@SuppressWarnings("unchecked") 
@Override 
public <T> T simpleDecrypt(String objectToDecrypt) throws EncryptionException { 
    try { 
     byte[] bytes = Base64.decodeBase64(objectToDecrypt); 
     byte[] decryptedBytes = binaryEncryptor.decrypt(bytes); 

     ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(decryptedBytes)); 
     T object = (T)ois.readObject(); 
     return object; 
    } catch (IOException e) { 
     LOGGER.error("failed to decrypt String: '" + objectToDecrypt + "', mesage = " + e.getMessage()); 
     throw new EncryptionException(e.getMessage(), e); 
    } catch (Exception e) { 
     LOGGER.error("failed to decrypt String: '" + objectToDecrypt + "', mesage = " + e.getMessage()); 
     throw new EncryptionException(e.getMessage(), e); 
    } 
} 
+1

me gustaría una confirmación - es que la operación de descifrado que está fallando con la excepción? Si es así, ¿ya ha revisado [esta pregunta en StackOverflow] (http://stackoverflow.com/questions/4905281/miffed-simple-code-but-org-jasypt-exceptions-encryptionoperationnotpossib)? –

+0

Este es un comentario impresionante de los documentos de jayst: está destinado a proporcionar muy poca información (si la hay) de las causas del error, de modo que las partes internas de cifrado no se revelan a través de mensajes de error. –

+0

Bien, he resuelto el problema. Estaba colocando el String encriptado en la URL después de Base64encoding, luego URLencoding the string. En mi entorno, esto funcionó bien. En mi servidor, donde yo soy el front-end de Tomcat con Apache, esto no funcionó. Encontré una respuesta en las preguntas frecuentes de Jasypt. Cambié de codificación Base64 a codificación Hex. Esto lo solucionó. Supongo que Apache puede haber alterado la cadena de consulta sin procesar antes de pasar a Tomcat. – Erik

Respuesta

1

Me enfrenté a un problema similar. Para mí, fue porque estaba intentando descifrar una contraseña que no se pudo haber descifrado utilizando el mecanismo de descifrado.

Por lo tanto, I cifró la contraseña y la almacenó en la base de datos antes de que el método de descifrado intente descifrarla.

Espero que ayude a alguien.

2

@biniam_Ethiopia
me habría comentado su respuesta pero no tengo la reputación suficiente, por lo que escribir mi propia respuesta:

que tenía un problema muy similar, pero en mi caso fue debido al cambio de la encriptación algoritmo (PBEWithMD5AndTripleDES), mientras que las entradas en el db se guardaron con una diferente antes (PBEWithMD5AndDES). Así que también recibí una EncryptionOperationNotPossibleException, que no contiene información debido al comentario anterior de @Nathan Feger.

espero que esto podría ayudar a alguien algún día también;)