Deseo utilizar el siguiente código para una aplicación de alta concurrencia donde ciertos datos deben estar cifrados y descifrados. Por lo tanto, necesito saber qué parte de este código debe sincronizarse, si corresponde, para evitar problemas impredecibles.¿Es seguro este hilo de código de cifrado de Java?
public class DesEncrypter {
Cipher ecipher;
Cipher dcipher;
// 8-byte Salt
byte[] salt = {
(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
(byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
};
int iterationCount = 19;
DesEncrypter(String passPhrase) {
try {
// Create the key
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
ecipher = Cipher.getInstance(key.getAlgorithm());
dcipher = Cipher.getInstance(key.getAlgorithm());
// Prepare the parameter to the ciphers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
// Create the ciphers
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
} catch (...)
}
public String encrypt(String str) {
try {
// Encode the string into bytes using utf-8
byte[] utf8 = str.getBytes("UTF8");
// Encrypt
byte[] enc = ecipher.doFinal(utf8);
// Encode bytes to base64 to get a string
return new sun.misc.BASE64Encoder().encode(enc);
} catch (...)
}
public String decrypt(String str) {
try {
// Decode base64 to get bytes
byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
// Decrypt
byte[] utf8 = dcipher.doFinal(dec);
// Decode using utf-8
return new String(utf8, "UTF8");
} catch (...)
}
}
Si creo un nuevo sistema de cifrado en el cifrar() y descifrar() métodos para cada invocación, entonces puedo evitar problemas de concurrencia, es que no estoy seguro de si hay un montón de gastos generales en conseguir un nuevo instancia de un cifrado para cada invocación.
public String encrypt(String str) {
try {
// Encode the string into bytes using utf-8
byte[] utf8 = str.getBytes("UTF8");
// Encrypt
//new cipher instance
ecipher = Cipher.getInstance(key.getAlgorithm());
byte[] enc = ecipher.doFinal(utf8);
// Encode bytes to base64 to get a string
return new sun.misc.BASE64Encoder().encode(enc);
} catch (...)
No lo sabía, gracias. Planeo guardar la sal y la frase de paso en archivos separados bajo estrictos permisos del sistema operativo disponibles solo para la aplicación. – user646584
El uso de una sal constante (incluso si está protegido) en gran medida no tiene nada que ver con el uso de una sal. –
¿Estás diciendo que la sal debería obtenerse aleatoriamente en tiempo de ejecución? Estoy confundido, claramente la contraseña no puede cambiar una vez que los datos han sido encriptados con ella, entonces ¿qué necesita ser generado por adelantado y almacenado en un archivo seguro, la sal y la frase de contraseña, solo la frase de contraseña, etc.? – user646584