2010-09-10 22 views
29

Estoy usando Jasypt para el cifrado. Este es mi código:¿Cómo averiguar qué algoritmo [cifrado] son ​​compatibles con mi JVM?

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 todavía no instalado el Java Cryptography Ex tensión (JCE) una fuerza ilimitada política de jurisdicción Archivos en esta Java Virtual Machine

API dice:

Establece el algoritmo que se utiliza para el cifrado Establece el algoritmo que se utiliza para el cifrado , como PBEWithMD5AndDES.

Este algoritmo tiene que ser apoyado por su proveedor JCE (si se especifica uno, o el proveedor de JVM por defecto si no lo hace ) y, si es compatible, que puede el modo y el relleno también especificar para , como ALGORITMO/MODO/ACOLCHADO.

se refieren: 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 no tendrán ningún problema. Eso significa que md5 es compatible con mi JVM. Ahora, cómo averiguar qué otros algoritmos de cifrado son compatibles con mi JVM.

Gracias,

Respuesta

36

A continuación una lista de todos los proveedores y el partidario de algoritmos. ¿Qué versión de Java estás usando? A menos que esté en una versión anterior, JCE debería 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 usando

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

2) Crear una Cipher usando

cipher = Cipher.getInstance(algorithm); 

3) de inicialización de su sistema de cifrado con la clave

cipher.init(Cipher.ENCRYPT_MODE, key); 

4) ¿Tienen el cifrado con

byte[] encrypted = cipher.doFinal(data) 
+0

estoy usando JDK 1.6 –

+4

En lugar de: System.out.println ("Algoritmo:" + service.getAlgorithm()); use System.out.println ("" + servicio); y podrás ver los niveles de encriptación disponibles. Por ejemplo, lo siguiente indica que se admite cifrado AES de 128 bits, pero no AES de 256 bits: SunJCE: Cipher.AES -> com.sun.crypto.provider.AESCipher ... SupportedModes = ECB | CBC | PCBC | CTR | CTS | CFB | OFB | CFB8 | CFB16 | CFB24 | CFB32 | CFB40 | CFB48 | CFB56 | CFB64 | OFB8 | OFB16 | OFB24 | OFB32 | OFB40 | OFB48 | OFB56 | OFB64 | CFB72 | CFB80 | CFB88 | CFB96 | CFB104 | CFB112 | CFB120 | CFB128 | OFB72 | OFB80 | OFB88 | OFB96 | OFB104 | OFB112 | OFB120 | OFB128} –

+0

El código enumera una gran cantidad de algoritmos que no se pueden utilizar. Código no tan útil. – Jonas

1

Qwerky todavía tiene una pregunta pendiente: ¿por qué usar Jasypt en lugar de usar javax.crypto?

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

Con Jasypt, puede comenzar a aprovechar rápidamente javax.crypto con un poco de conocimiento de JCE y la criptografía. Si desea administrar contraseñas de usuario o cifrar/descifrar datos, el marco proporciona una simple abstracción de la pregunta.

Al mismo tiempo, el marco expone todas las posibilidades de la especificación JCE para permitir a los usuarios experimentados tener el control total.

Además de esto, Jasypt proporciona muchas más funciones fuera de la caja de preguntas bien conocidos (que se ocupan de los datos sensibles almacenados en la base de datos, ...)

+0

Si quiere hacer una pregunta, no debería ponerla en una respuesta. Esto no es un hilo de discusión – Mick

4

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

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

2

Probé el código publicado por @Qwerky, pero no es muy útil. Agregué el último proveedor de BouncyCastle, y los resultados que obtuve fueron muy confusos. Esto muestra con mayor detalle quién es el proveedor, la versión y el tipo y nombre del algoritmo.

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()); 
    } 
} 
Cuestiones relacionadas