2012-03-05 15 views
11

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?

+0

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

+0

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. –

+0

Cualquier problema con las respuestas Eric? –

Respuesta

11

Recomendaría usar el cifrado de modo GCM. Está incluido en el último JDK (1.7) por defecto. Utiliza un cifrado de modo contador (un cifrado de flujo, no requiere relleno) y agrega una etiqueta de autenticación. Una gran ventaja es que requiere una sola clave, mientras que HMAC agrega otra clave a la mezcla. Bouncy Castle también tiene una implementación, que es muy compatible con una proporcionada por Oracle.

El cifrado de modo GCM también se presenta en un TLS RFC y en XML encrypt 1.1 (ambos no son definitivos). El modo GCM proporciona las tres características de seguridad: confidencialidad, integridad y autenticidad del envío de datos. The String sería "AES/GCM/NoPadding" en lugar del CBC que está implementando ahora. Como se dijo, asegúrese de tener el último JDK de Oracle o tener instalado el proveedor de Bouncy Castle.

También verifique mi respuesta here, que trata principalmente sobre la codificación de cadenas, pero también he probado con éxito el modo GCM - vea el comentario.

+0

Al igual que con cualquier cifrado de flujo, tenga cuidado de cómo usa el NONCE/IV , ya que la repetición del mismo valor dará lugar a inseguridades. –

+0

Sí, creo que esta es la mejor respuesta, todas las consideraciones. Estoy limitado a usar JDK 1.6, así que opté por una solución que realiza el fortalecimiento de claves basado en contraseñas para generar una clave de 256 bits. Tomo los primeros 128 bits de la clave y la uso para encriptar usando AES CBC y luego uso los últimos 128 bits para MAC el texto cifrado. –

+0

@EricConner ¡no olvides también MAC el vector de inicialización! – MauganRa

3

Al transferir archivos de un servidor a otro a través de ftp seguro, utilizo pares de claves privadas/públicas con la clave privada que reside en el servidor "desde" y la clave pública que reside en el servidor "a".

El uso de pares de claves privadas/públicas es un estándar seguro al transferir archivos.

Creo que también sería un medio seguro en el contexto de una aplicación Java.

Consulte Generating and Verifying Signatures y Generate Public and Private Keys para obtener más información sobre el uso de una configuración de par de claves privadas/públicas para firmas digitales en Java.

+0

OK, es un caso de uso completamente nuevo, pero fui un poco duro. Las firmas y PKI * son * un método válido de control de integridad y autenticación, pero es una forma bastante pesada de calcular un MAC. –

+1

@owlstead: recuerdo brevemente su comentario original pero no puedo verlo ahora porque parece que se ha eliminado. No se preocupe de ninguna manera. He tenido varias personas downvote mis respuestas y entiendo por qué en varios casos. Espero que más personas voten negativamente por la razón que se ve al pasar el voto negativo: "Esta respuesta no es útil".En este caso, realmente creo que mi respuesta podría ayudar al PO y es por eso que lo publiqué. Dios no permita que ninguno de nosotros arroje algo allí por puntos. Todos deberíamos esforzarnos por ayudarnos unos a otros en última instancia ... –

+0

Precisamente, es por eso que pensé que era bastante duro, a veces tengo que dejar de ser demasiado negativo. No estoy seguro de si FTP y RSA es lo que Eric estaba buscando, pero no es incorrecto, por lo que la respuesta debería ser luchar por sí mismo ... –

Cuestiones relacionadas