para - encriptar y desencriptar rsa en java
¿Cómo puedo averiguar qué algoritmo[cifrado] es compatible con mi JVM? (5)
Estoy usando 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 );
}
}
setAlgorithm
línea setAlgorithm
y lanzará una excepción
org.jasypt.exceptions.EncryptionOperationNotPossibleException : El cifrado generó una excepción. Una posible causa es que está utilizando algoritmos de cifrado potentes y no ha instalado los archivos de política de jurisdicción de fuerza ilimitada Java Cryptography Ex tension (JCE) en esta máquina virtual Java.
api dice:
Establece el algoritmo que se utilizará para el cifrado Establece el algoritmo que se utilizará para el cifrado, como PBEWithMD5AndDES.
Este algoritmo debe ser compatible con su proveedor de JCE (si especifica uno, o el proveedor de JVM predeterminado si no lo tiene) y, si es compatible, también puede especificar el modo y el relleno para él, como ALGORITMO / MODO / ACOLCHADO .
Ahora, cuando comentas ''setAlgorithm'' utilizará el Algoritmo predeterminado [supongo que es md5], y funcionará bien. Eso significa que md5 es compatible con mi JVM. Ahora, cómo averiguar qué otros algoritmos de cifrado son compatibles con mi JVM.
Gracias,
A continuación, se enumerarán todos los proveedores y los defensores de los 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: ¿Alguna razón por la que no usa el material estándar del paquete javax.crypto?
1) Generar una Key
usando
Key key = SecretKeyFactory.getInstance(algorithm).generateSecret(new PBEKeySpec(password.toCharArray()));
2) Crea un Cipher
usando
cipher = Cipher.getInstance(algorithm);
3) Inicia tu cifrado con la clave
cipher.init(Cipher.ENCRYPT_MODE, key);
4) Hacer la encriptación con
byte[] encrypted = cipher.doFinal(data)
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 descargarlo y usarlo aquí: http://www.jasypt.org/cli.html#Listing_algorithms
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());
}
}
Si no lo tiene instalado ya, entonces necesita instalar el JCE (Java Cryptography Extension) que proporciona soporte para los algoritmos.
Puedes ver cómo instalar aquí:
http://download.oracle.com/javase/1.4.2/docs/guide/security/CryptoSpec.html#ProviderInstalling
La biblioteca se puede encontrar aquí: http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136007.html
Todavía hay una pregunta ''pendiente'' formulada por Qwerky: ¿por qué utilizar Jasypt en lugar de usar javax.crypto?
Bueno, recomendaría usar Jasypt, ya que es una forma sencilla de cifrado 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 ofrece muchas más funciones listas para usar para preguntas bien conocidas (manejo de datos confidenciales almacenados en la base de datos, ...)