Qualcuno può spiegare lo strano trattamento del tag di autenticazione OpenSSL AES-256-GCM in PHP 7.1?

6

Sto usando PHP 7.1 e posso criptare con successo un pezzo di stringa, in questo modo:

$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,
     ''
)

Quindi, posso decodificarlo correttamente con:

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

Tuttavia, durante i test, ho scoperto che se decrittalo nel modo seguente:

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

Vorrei ancora ottenere la mia stringa perfettamente bene. Senza sorpresa, questo accade anche se rimuovo i dati dal tag di autenticazione quando si trova in formato base64url.

Perché succede?

    
posta Sergiu The Penguin 11.01.2018 - 20:16
fonte

1 risposta

3

Secondo wikipedia :

The bit-length of the tag, denoted t, is a security parameter. In general, t may be any one of the following five values: 128, 120, 112, 104, or 96. For certain applications, t may be 64 or 32, but the use of these two tag lengths constrains the length of the input data and the lifetime of the key.

Dopo il test, sembra che dal momento che openssl_decrypt non ti consente di specificare le dimensioni previste del tag, accetta qualsiasi dimensione del tag finché il tag è valido. Sfortunatamente non lo limita a 128-96 bit, e se hai un solo byte decodificherà senza errori, il che significa che GCM con PHP è per lo più rotto, poiché il tag è facilmente forzato. Puoi correggere questo problema verificando la lunghezza del tag prima di passarlo a openssl_decrypt .

Non sono sicuro che si tratti effettivamente di un bug con openssl_decrypt o si intendeva che la lunghezza del tag fosse verificata al di fuori della funzione, ma in entrambi i casi la documentazione è sicuramente carente qui.

Sembra che Ruby abbia lo stesso problema .

    
risposta data 11.01.2018 - 21:27
fonte

Leggi altre domande sui tag