¿Puede alguien explicar el tratamiento extraño de la etiqueta de autenticación OpenSSL AES-256-GCM en PHP 7.1?

6

Estoy usando PHP 7.1 y puedo cifrar con éxito un trozo de cadena, así:

$key = random_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-gcm'));
$cipherText = openssl_encrypt(
    'The quick brown fox jumps over the lazy dog.',
    'aes-256-gcm',
     $key,
     OPENSSL_RAW_DATA,
     $iv,
     $tag,
     ''
)

Entonces, puedo descifrarlo exitosamente con:

openssl_decrypt(
    $cipherText,
    'aes-256-gcm',
    $key,
    OPENSSL_RAW_DATA,
    $iv,
    $tag,
    ''
);

Sin embargo, durante las pruebas, descubrí que si lo descifraba de la siguiente manera:

openssl_decrypt(
    $cipherText,
    'aes-256-gcm',
    $key,
    OPENSSL_RAW_DATA,
    $iv,
    mb_substr($tag, 0, mb_strlen($tag) - 15),
    ''
);

Todavía obtendría mi cuerda perfectamente bien. Sin sorpresa, esto también sucede si elimino datos de la etiqueta de autenticación cuando estoy en formato base64url.

¿Por qué sucede esto?

    
pregunta Sergiu The Penguin 11.01.2018 - 20:16
fuente

1 respuesta

3

Según wikipedia :

  

La longitud de bits de la etiqueta, denotada t, es un parámetro de seguridad. En general, t puede ser cualquiera de los cinco valores siguientes: 128, 120, 112, 104 o 96. Para ciertas aplicaciones, t puede ser 64 o 32, pero el uso de estas dos longitudes de etiqueta limita la longitud de la entrada Los datos y la duración de la clave.

Después de la prueba, parece que dado que openssl_decrypt no le permite especificar un tamaño de etiqueta esperado, aceptará cualquier tamaño de etiqueta siempre que la etiqueta sea válida. Desafortunadamente, no lo limita a 128-96 bits, y si tiene un solo byte, se descifra sin errores, lo que significa que GCM con PHP está casi roto, ya que la etiqueta es fácilmente forzosa. Puedes arreglar esto verificando la longitud de la etiqueta antes de pasarla a openssl_decrypt .

No estoy seguro de si se trata de un error con openssl_decrypt o si se pretendía que la longitud de la etiqueta se verificara fuera de la función, pero de cualquier modo, la documentación ciertamente falta aquí.

Parece que Ruby tiene exactamente el mismo problema .

    
respondido por el AndrolGenhald 11.01.2018 - 21:27
fuente

Lea otras preguntas en las etiquetas