Il modo migliore per crittografare i dati usando php - Non sono sicuro se lo faccio correttamente [duplicato]

2

Voglio crittografare alcuni dati nel mio file php quando aggiungo le cose al mio database mysql.

Ecco come lo faccio.

Creo una chiave statica come:

$key = md5("pass");

Allora ho due funzioni chiamate encrypt () e decrypt () e fanno questo:

function encrypt($string, $key){
    $string = rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB)));
    return $string;
}

function decrypt($string, $key){
    $string = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($string), MCRYPT_MODE_ECB));
    return $string;
}

Non sono sicuro che questa sia la procedura migliore, ma come faccio a generare una chiave diversa da md5?

    
posta Benj Mikesozery 25.03.2016 - 11:53
fonte

1 risposta

7

Ci sono almeno due problemi con questo approccio.

  1. La tua scelta della generazione della chiave
  2. La scelta della modalità di crittografia

Generazione chiave

Stai facendo md5("static password") come chiave. Questo è veramente brutto. In primo luogo, si sta "solo" ottenere 128 bit da MD5 e si sta utilizzando 256-bit AES con chiave, sprecando così cicli (perché AES-256 è più lenta di AES-128) su qualcosa che non si sta usando in ogni modo. In secondo luogo, la password è debole. "pass" è not una password sicura e spero davvero che tu la sostituisca con qualcosa molto più strong per l'uso in produzione. In terzo luogo, si sta utilizzando pianura MD5 per la lavorazione della password ( vedere anche la nostra risposta canonica password hashing ). Questo è il peggiore possibile, perché i testi cifrati potrebbero essere attaccati utilizzando tabelle (arcobaleno) precalcolate e MD5 è una funzione di hash veloce, che consente una forzatura bruta della password. Quarto: Perché usi addirittura una password!? . Non vi è alcun motivo logico per utilizzare una password statica (leggibile dall'uomo) anziché una chiave sicura generata casualmente della dimensione desiderata. In questo modo non devi preoccuparti della forza bruta, non devi preoccuparti di usare MD5 (che darà una cattiva stampa), non devi preoccuparti che la tua chiave sia troppo corta.

Modalità di crittografia

Mentre si utilizza AES-256 come algoritmo di crittografia (che è OK), si sta utilizzando BCE come modalità operativa per AES. In questo modo hai due problemi: a) stai perdendo quali blocchi AES (16-byte) sono uguali eb) devi riempire i tuoi messaggi per essere un multiplo di 16-byte. Per risolvere questi problemi è necessario cambiare la modalità. GCM è l'opzione migliore che hai. Unfortunaly, questo non è adeguatamente supportato da PHP fino PHP 7.1 tramite openssl_encrypt() o mcrypt_encrypt() (che si ha realmente shouldn Da usare, perché è più lento, non più mantenuto e meno rigido di OpenSSL). Se hai già PHP 7.1, quindi, puoi usare AES-GCM con openssl_encrypt() , che proteggerà il tuo testo cifrato dalla lettura e / o dalla modifica, a patto di consegnare un nonce unico (non segreto) per ogni crittografia. Fino a quando non avrai la corretta crittografia PHP 7.1 AEAD , devi utilizzare una costruzione ad-hoc. Ciò significa che per prima cosa cripterai i dati utilizzando un (casuale) 16 byte IV con CTR modalità e quindi si calcola il HMAC - SHA256 del testo cifrato e memorizza il tag risultante, così puoi verificarlo al prossimo accesso in lettura.

    
risposta data 25.03.2016 - 12:25
fonte

Leggi altre domande sui tag