El cifrado autenticado requiere que usemos algún estándar aceptado para encriptar y autenticar un mensaje. Así que ambos encriptamos el mensaje y calculamos un MAC en el mensaje para verificar que no haya sido alterado.¿Cuál es la forma correcta de realizar el cifrado autenticado en Java?
This question esboza una forma de realizar el fortalecimiento de claves basado en contraseña y cifrado:
/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));
Pero por lo que yo puedo decir, esto no computa cualquier MAC en el texto cifrado y así sería insegura. ¿Cuál es el estándar aceptado para realizar cifrado autenticado en Java?
Si encriptas/descifras el mensaje completo, sabes que no ha sido alterado, ¡no !? ¿No se utiliza HMAC cuando desea enviar un mensaje (o datos) en "texto sin formato" y luego enviar el HMAC para autenticar el texto sin formato? – TacticalCoder
No hay un estándar aceptado para realizar cifrado autenticado, puede ser firmas (asimétricas), MAC (por ejemplo, AESCMAC), HMAC o modos autenticados. Sin embargo, hay algunas inseguras (el AES-MAC predeterminado no es muy seguro, por ejemplo). Vea a continuación una buena respuesta que debe ajustarse a su caso de uso. –
Cualquier problema con las respuestas Eric? –