Pregunta

Estoy utilizando Jasypt para el cifrado. Este es mi código:

public class Encryptor {    
    private final static StandardPBEStringEncryptor pbeEncryptor = new StandardPBEStringEncryptor();
    private final static String PASSWORD = "FBL";
    private final static String ALGORITHM = "PBEWithMD5AndTripleDES";

    static{
        pbeEncryptor.setPassword( PASSWORD );
        //pbeEncryptor.setAlgorithm( ALGORITHM );       
    }

    public static String getEncryptedValue( String text ){
        return pbeEncryptor.encrypt( text );
    }

    public static String getDecryptedValue( String text ){
        return pbeEncryptor.decrypt( text );
    }

}

Elimine la línea setAlgorithm y va a lanzar una excepción

  

org.jasypt.exceptions.EncryptionOperationNotPossibleException :   Cifrado levantó una excep ción. UN   posible causa es que está utilizando fuertes   algoritmos de cifrado y no tienen   instalado el Java Cryptography Ex   la tensión de la fuerza (JCE) ilimitado   Jurisdicción archivos de directivas en este Java   Virtual Machine

api dice:

  

Establece el algoritmo que se utilizará para   Establece el algoritmo de cifrado para ser   utilizada para el cifrado, como   PBEWithMD5AndDES.

     

Este algoritmo tiene que ser apoyado por   su proveedor de JCE (si se especifica uno,   o el proveedor de JVM por defecto si se   no) y, si es compatible,   También el modo y el relleno puede especificar para   que, al igual que ALGORITMO / MODE / relleno.

se refiere: http://www.jasypt.org/api/jasypt/apidocs/org/jasypt/encryption/pbe/StandardPBEStringEncryptor.html#setAlgorithm%28java.lang.String%29

Ahora, cuando usted comenta 'setAlgorithm' se utilizará el algoritmo por defecto [supongo que es MD5], y que va a funcionar bien. Eso significa que MD5 es apoyada por mi JVM. Ahora, la manera de averiguar lo que otros algoritmos de cifrado son compatibles con mi JVM.

Gracias,

¿Fue útil?

Solución

A continuación una lista de todos los proveedores y el partidario de algoritmos. ¿Qué versión de Java está utilizando? A menos que usted está en una versión antigua JCE debe incluirse como estándar.

import java.security.Provider;
import java.security.Security;

public class SecurityListings {
    public static void main(String[] args) {
        for (Provider provider : Security.getProviders()) {
            System.out.println("Provider: " + provider.getName());
            for (Provider.Service service : provider.getServices()) {
                System.out.println("  Algorithm: " + service.getAlgorithm());
            }
        }

    }
}

Editar: Cualquier razón por la que no se utiliza el material estándar del paquete javax.crypto?

1) Generar un Key utilizando

Key key = SecretKeyFactory.getInstance(algorithm).generateSecret(new PBEKeySpec(password.toCharArray()));

2) Crear un Cipher utilizando

cipher = Cipher.getInstance(algorithm);  

3) Init su sistema de cifrado con la clave

cipher.init(Cipher.ENCRYPT_MODE, key);  

4) Hacer la encriptación con

byte[] encrypted = cipher.doFinal(data)

Otros consejos

La herramienta de línea de comandos Jasypt ahora viene con un script para hacer esto se llama listAlgorithms.bat para ventanas y listAlgorithms.sh para Linux.

Puede encontrar instrucciones sobre cómo descargar y utilizar aquí: http: //www.jasypt .org / cli.html # Listing_algorithms

Si no lo tienes instalado ya, entonces usted necesita para instalar la JCE (Java Cryptography Extension), que proporciona soporte para los algoritmos.

Se puede ver cómo instalar aquí:

http://download.oracle .com / JavaSE / 1.4.2 / docs / guía / security / CryptoSpec.html # ProviderInstalling

La biblioteca se puede encontrar aquí: http://www.oracle.com/technetwork/ java / JavaSE / tecnología / index-jsp-136007.html

He probado el código publicado por @Qwerky, pero no es muy útil. Yo había añadido el último proveedor de BouncyCastle, y los resultados que obtuve fueron muy confuso. Esto demuestra que en un mejor detalle del proveedor, la versión y el tipo de algoritmo y el nombre.

for (Provider provider : Security.getProviders()) {
    System.out.println("Provider: " + provider.getName() + " version: " + provider.getVersion());
    for (Provider.Service service : provider.getServices()) {
        System.out.printf("  Type : %-30s  Algorithm: %-30s\n", service.getType(), service.getAlgorithm());
    }
}

Hay todavía una cuestión 'pendiente' preguntó por qwerky: ¿por qué el uso de Jasypt en lugar de utilizar javax.crypto

Bueno, yo recomendaría usar Jasypt ya que es una forma sencilla de criptografía para principiantes y altamente configurable para usuarios experimentados.

Con Jasypt, puede empezar a tomar ventaja de javax.crypto rápidamente con un poco de conocimiento de la JCE y la criptografía. Tanto si desea administrar las contraseñas de usuario o cifrar / descifrar los datos, el marco proporciona una abstracción sencilla a la pregunta.

En el mismo tiempo, el marco expone todas las posibilidades de la especificación JCE para permitir a los usuarios experimentados estar en pleno control.

Además de esto, Jasypt ofrece muchas más características fuera de la caja de preguntas bien conocidos (se trata de datos sensibles almacenados en la base de datos, ...)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top