Quanto è sicuro AES-256-CBC con la password e il vettore di inizializzazione forniti dall'utente

4

Da quanto ho capito, l'IV è usato come blocco precedente solo per il primo blocco. Ma dal momento che ogni blocco è utilizzato da quanto segue, questo aggiunge sicurezza significativa è un IV è fornito e non basato sulla password.

Così ho implementato un sistema di login quando l'utente fornisce entrambi, distinti con un minimo di 8 caratteri usando qualsiasi carattere a cui tengano conto a patto che usino almeno 3 tipi (superiore, inferiore, numerico, speciale, non ASCII).

Ma ora qualcuno mi ha detto che, definendo la IV, indebolisco la crittografia in quanto renderebbe la password un po 'inutile.

Non ho capito esattamente la sua spiegazione.

Il mio codice assomiglia a questo:

$hash = openssl_encrypt($username, 'aes-256-cbc', $password, false, md5($iv, true));
  • Sì, sto crittografando il nome utente
  • Sia la password che IV sono definite dall'utente
  • Sì, sto chiedendo loro due password
  • Sto avvolgendo l'IV in RAW md5 per assicurarmi di ottenere una lunghezza di 16 chr standard

Qualcuno può chiarire se l'uso IV in questo modo è una buona pratica ed è un'idea abbastanza strong.

    
posta transilvlad 22.03.2016 - 15:20
fonte

2 risposte

20

Il mio sospetto è: stai facendo torto ™ .

Questo è il motivo per cui la penso così, in cima alla mia testa:

  1. La variabile che contiene il testo cifrato si chiama hash .
  2. Stai crittografando il nome utente.
  3. Sembra un XY-Problem .
  4. Non lo fai (mostra come tu) ottieni la chiave dalla password (il openssl_encrypt password è la chiave, secondo i documenti. Quindi, a meno che tu non stia derivando una chiave dalla password fornita dall'utente, non sta andando per risolvere.)
  5. Non sei utilizzando un CSPRNG per ottenere un IV per AES-CBC.

But now someone told me that by defining the IV I weaken the encryption as that would make the password sort-of useless.

Qualcuno aveva ragione. Vedi la domanda collegata su crypto sull'utilizzo di un CSPRNG con AES-CBC per saperne di più.

    
risposta data 22.03.2016 - 15:39
fonte
10

Prima di tutto, il solito avvertimento: Non tirare la tua cripto, è probabile che ti stia sbagliando.

Ora il secondo avviso: sembri crittografare i dati utilizzando esclusivamente AES- CBC , che è molto pericoloso, dovresti davvero usare AES- GCM , poiché la modalità operativa CBC per AES non previene il messaggio di essere modificato, che potrebbe portare a risultati indesiderati.

Ora il grosso problema con il tuo schema di crittografia: Non si introduce la casualità esterna .
La modalità CBC richiede un IV che è imprevedibile o altrimenti sei suscettibile agli attacchi. Dal momento che si utilizza MD5(pw2) , questo IV è non imprevedibile poiché la maggior parte delle password sarà prevedibile . Ancor peggio, l'IV dovrebbe introdurre casualità nella crittografia e fare in modo che lo stesso testo in chiaro venga crittografato in diversi testi cifrati. È probabile tuttavia che il tuo utente non lo capisca e che riutilizzi le sue password attraverso più crittografie e quindi sei suscettibile agli attacchi IV statici.

Altri piccoli problemi:

  1. Non ti assicuri che la chiave (alias $password ) sia lunga esattamente 32 byte (un requisito per l'utilizzo di AES-256) e (pseudo-) casuale (un requisito formale per la sicurezza), probabilmente eseguirai nei problemi una volta che gli utenti scelgono le password con più di 32 caratteri.
  2. Chiedete all'utente due password, mentre in effetti potreste semplicemente chiederne una e ricavarne le due (in modo deterministico).
  3. Non elabori la password . In questo momento, se viene fuoriuscito un testo cifrato, potrei semplicemente andare avanti e provare a forzare la password dell'utente, perché non hai implementato contromisure per indovinare la password (come usare bcrypt ).

Quindi, come risolverlo?

  1. Utilizza AES-GCM con un nonce da 12 byte.
  2. Utilizzare OpenSSLs RNG per generare detto nonce.
  3. Ricava la chiave AES-GCM dalla password degli utenti in modo sicuro (cioè utilizzando bcrypt o Argon2 )
risposta data 22.03.2016 - 15:46
fonte

Leggi altre domande sui tag