2012-04-23 18 views
12

estoy un poco confundido cómo utilizar AES y HMAC (basado en SHA-256) de una manera adecuada cuando se transmite el mensaje cifrado del servidor al cliente o viceversaconfundido cómo utilizar AES y HMAC

corregirme por favor, si el método siguiente es incorrecto:

  1. tomar la llave seguro desde el archivo de clave (por ejemplo, se aconseja utilizar el AES-256 y ya tenemos una clave de longitud válida de 256 bits)
  2. Generar IV aleatorio para AES-256 para asegurarse de que el mismo texto plano tendrá una salida de cifrado diferente.
  3. Calcule HMAC-SHA-256 usando el texto sin formato y la clave segura. (La primera pregunta: ¿debo usar IV para el cálculo de HMAC? Por ejemplo, agregar a la clave de seguridad?)
  4. Encripte el texto sin formato con AES-256.
  5. redactar mensaje para el cliente de la siguiente manera: HMAC + IV + ENCRYPTED_MESSAGE

La gran pregunta es: ¿es posible de alguna manera a no enviar a IV cliente, pero en vez de generar la misma manera y aún así estar seguro de cifrado? ¿O está bien enviar el IV también?

He terminado con la generación IV aleatoria, porque es necesario que el mismo texto plano termine en diferentes resultados de cifrado.

Respuesta

11

No envíe hmac (mensaje), aes (mensaje). Si envía el mismo mensaje dos veces, cualquiera puede saberlo. Además, necesita mac el texto de cifrado para evitar ataques como el padding oracle attack.

IV: En general, la forma más fácil de tratar con el iv es anteponerlo, dado que es una longitud fija, al texto de cifrado. A continuación, puede leer esos bytes antes de descifrarlos. Los IV pueden ser públicos, pero deben ser aleatorios.

HMAC: La manera más fácil, si su biblioteca lo admite, es usar AES en modo GCM (o, menos preferiblemente EAX). Esto no es realmente un HMAC, pero proporciona una encriptación autenticada que es igual de buena. Si no son compatibles:

Necesita calcular el hmac tanto en el texto iv como en el texto cifrado. si || es la concatenación (que se podría hacer con, por ejemplo array copia si se trata de matrices de bytes), entonces usted quiere

CipherText = iv|| aes(key1,iv,message) 
tag = hmac(key2,ciphertext) 

y luego enviar (etiqueta, texto cifrado). En el otro extremo, ejecuta la misma llamada hmac para regenerar la etiqueta y comparar la etiqueta recibida con la calculada. Compara los valores hash sha1 o sha256 de las etiquetas en lugar de directamente para que no se filtre donde falla la comparación.

Debe utilizar una clave diferente para el hmac. En la práctica, hacer tachuelas con la suma sha1 de su clave de encriptación es suficiente.

+0

¿Y qué modo de operación recomendaría? CBC tiene sus gastos generales y deberíamos lidiar con el relleno. Creo que mi elección es OFB/CFB. – Valentin

+1

Desde un punto de vista de seguridad, son todos iguales (excepto el BCE, no lo use). Solo asegúrate de usar una IV fresca si el sistema toma una IV. Si desea ahorrarse un poco de esfuerzo, existen modos autenticados que no necesitan un hmac. GCM es el mejor de ellos. Qué idioma estás usando ? – imichaelmiers

+0

No recomendaría tomar la suma SHA1 de la primera clave como la segunda clave. En su lugar, puede derivar dos claves diferentes con diferentes parámetros y PBKDF2 a partir de una frase de contraseña.Lo mejor es tener dos claves independientes y no confiar en una (probablemente) frase de contraseña débil. –