Cómo averiguar qué algoritmo [cifrado] se apoya en mi JVM?
-
02-10-2019 - |
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.
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,
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í:
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, ...)