¿El uso de un MAC para cifrado elimina la necesidad de relleno PKCS7 con esta clase?

1

Estoy trabajando con este cifrado PHP clase usando MCRYPT_RIJNDAEL_256 y MCRYPT_MODE_CBC con un fijo de 32 bytes ( 64 caracteres) clave HMAC, como mi base.

La clase es el resultado de discusiones y comentarios anteriores realizados sobre este página del blog . y parece una implementación sólida como tal. Sin embargo, hay algunos aspectos discutidos que aún no tengo claro:

  

Lo único que agrega son las posiciones predecibles de texto plano que serán   Ayudar a un criptoanalista. Recomiendo eliminar la serialización y usar   Relleno PKCS7.

comment 1304 .

Ahora que el método de cifrado utiliza HMAC y que la serialización evita el problema de relleno '\ 0' . ¿Sigue siendo una buena idea usar un relleno PKCS incluso cuando se usa el HMAC (y se mantiene la serialización)?

O en otras palabras, ¿el HMAC por sí solo resuelve la "posición predecible de texto sin formato"?

Mis suposiciones acerca de los productos para la serialización, es que parece hacer que la longitud del texto sea menos predecible, incluso si el mensaje es una cadena de texto sin formato, por ejemplo, para una longitud predecible corta, especialmente para un número de tamaño fijo. Sin embargo, solo quiero asegurarme de que la serialización no sea un contra negativo.

    
pregunta hexalys 29.01.2015 - 22:46
fuente

2 respuestas

2

De acuerdo con la documentación de PHP, la salida de Serialize() 'ed puede contener bytes nulos y debe manejarse en consecuencia. Entonces, a menos que haya una garantía (que no veo) de que un byte nulo no pueda estar al final de los datos serializados, entonces sí, es definitivamente recomendable usar el relleno PKCS # 7.

En el caso del autor de ese bit de código, de hecho se le asegura que los datos no terminarán en un byte nulo, porque está agregando el MAC al texto plano antes del cifrado, en un MAC y luego cifrar esquema. Esto está mal. No hagas esto. Esto es lo que lleva a los ataques de oráculo de relleno como POODLE. Debe garantizar la integridad del texto cifrado antes de descifrarlo, lo que significa en su lugar, cifrar y luego MAC.

Además, la clave HMAC parece estar fuertemente relacionada con la clave de cifrado. Esto no es lo ideal. La clave HMAC y la clave de cifrado no deben estar relacionadas.

En tercer lugar, el cálculo de HMAC debe realizarse en un tiempo constante para evitar ataques de temporización. Las técnicas para hacer esto en PHP están cubiertas en un comentarios sobre hash_hmac .

    
respondido por el Xander 29.01.2015 - 23:45
fuente
2

Hay requisitos separados para realizar el modo de relleno determinístico y proporcionar una etiqueta de autenticación.

El relleno es necesario para los modos de operación ECB y CBC. Estos modos solo manejan mensajes que son N veces el tamaño de bloque en longitud. El relleno PHP estándar no es determinístico si el mensaje puede terminar con bytes de valor cero.

La etiqueta de autenticación (proporcionada por un HMAC, por ejemplo) es necesaria para proteger la integridad del mensaje y para mostrar que fue enviada por el remitente esperado (autenticidad). Si no se valida la integridad del texto cifrado , cualquier atacante puede enviar o modificar mensajes (ataques activos o ataques de intermediario). Esto puede incluso romper la confidencialidad si son posibles los ataques oracle de relleno.

Por lo tanto, debe probar y usar el relleno compatible con PKCS # 7 incluso si proporciona un HMAC y especialmente si sus mensajes pueden terminar en cero. El comentario sobre "posiciones de texto plano predecibles" puede ser ignorado; debe esperar que los atacantes conozcan cierta cantidad de información sobre el texto en claro (como el tamaño del texto en claro). Esto está bien siempre y cuando la integridad y la confidencialidad hayan sido protegidas.

Tenga en cuenta que el autor del artículo parece adquirir bastante educación de los comentarios. El hecho de que el autor confunda Rijndael con un tamaño de bloque de 256 bits ( MCRYPT_RIJNDAEL_256 en PHP) con AES muestra que el autor no sabe mucho sobre criptografía.

No debes confiar en este código. Debe comprender la criptografía antes de usar una biblioteca o un fragmento de código. Al menos intente utilizar un formato de contenedor conocido si no está seguro. Cualquiera puede aplicar AES. Sin embargo, al menos el 90% de StackOverflow (donde esta pregunta se publicó anteriormente) lo aplica incorrectamente.

    
respondido por el Maarten Bodewes 29.01.2015 - 23:40
fuente

Lea otras preguntas en las etiquetas