2011-09-02 14 views
6

Io lavoro su alcune cose cripto.Come generare in modo sicuro un IV per la crittografia AES CBC?

  • Io uso AES 256 con modalità CBC
  • Io uso OPENSSL

Sono consapevole delle seguenti cose (fonte = wikipedia):

un vettore di inizializzazione del dovrebbe essere:

  • Unico: non deve essere ripetuto per qualsiasi messaggio crittografato con una chiave data
  • Imprevedibile: un attaccante che osserva un numero illimitato di messaggi e le loro IV dovrebbe avere alcuna informazione per prevedere quello successivo con probabilità di successo superiore al 50% per bit (cioè, indistinguibile da casuale)

La mia domanda è , come generare in modo sicuro IV con OPENSSL e PHP? So che esiste una funzione simile in lib mcrypt (http://fr2.php.net/manual/fr/function.mcrypt-create-iv.php)

Non ho trovato nulla per fare ciò con OPENSSL (generando un IV unico e imprevedibile).

+0

Autenticate i vostri testi cifrati? –

risposta

5

Utilizzare openssl_random_pseudo_bytes (preferibilmente con il secondo parametro impostato su una variabile esistente, che è quindi necessario verificare che sia stato impostato su TRUE). Questo genererà IV con caratteristiche di casualità appropriate.

$wasItSecure = false; 
$iv = openssl_random_pseudo_bytes(16, $wasItSecure); 
if ($wasItSecure) { 
    // We're good to go! 
} else { 
    // Insecure result. Fail closed, do not proceed. 
} 

In alternativa, PHP 7 offre random_bytes() che è molto più semplice.

+1

Come determinare la lunghezza appropriata per IVs? – foochow

+2

Si noti che il secondo parametro opzionale di openssl_random_pseudo_bytes è un riferimento a una variabile. Il suo valore è impostato da openssl quando la stringa generata è considerata "crittograficamente forte". Vedi http://www.openssl.org/docs/crypto/RAND_bytes.html – dod

+1

corretto. Il secondo parametro viene passato per riferimento e dopo la chiamata contiene true solo se l'algoritmo utilizzato è crittograficamente forte. Vedere la mia risposta qui sotto con un esempio e l'uso corretto. – techdude

2

È possibile utilizzare openssl_random_pseudo_bytes (len, & crypto_stron).

Il primo parametro è la lunghezza desiderata in byte. Se si utilizza questa opzione per l'utilizzo in uno dei metodi ssl aperti, è possibile utilizzare la funzione openssl_cipher_iv_length (metodo) per ottenere la lunghezza corretta per il metodo utilizzato.

Il secondo parametro, & crypto_strong, consente di passare una variabile booleana che verrà impostata su true o false a seconda che l'algoritmo utilizzato sia crittograficamente sicuro. È quindi possibile controllare questa variabile e gestirla correttamente se la variabile torna falsa. Non dovrebbe mai accadere, ma se così fosse, probabilmente vorresti saperlo.

Ecco un esempio di corretto utilizzo:

$method = 'aes-256-cbc'; 
$ivlen = openssl_cipher_iv_length($method); 
$isCryptoStrong = false; // Will be set to true by the function if the algorithm used was cryptographically secure 
$iv = openssl_random_pseudo_bytes($ivlen, $isCryptoStrong); 
if(!$isCryptoStrong) 
    throw new Exception("Non-cryptographically strong algorithm used for iv generation. This IV is not safe to use."); 

Per maggiori informazioni consultare:

1

Semplicemente più comodo usare le stesse cose su cui Thomas ha provato:

private function genIv() 
{ 
    $efforts = 0; 
    $maxEfforts = 50; 
    $wasItSecure = false; 

    do 
    { 
     $efforts+=1; 
     $iv = openssl_random_pseudo_bytes(16, $wasItSecure); 
     if($efforts == $maxEfforts){ 
      throw new Exception('Unable to genereate secure iv.'); 
      break; 
     } 
    } while (!$wasItSecure); 

    return $iv; 
} 
Problemi correlati