Ciao a tutti!
Con l'introduzione del GDPR è opportuno iniziare a crittografare i dati sensibili inseriti nel proprio database. All'uopo intendevo attrezzarmi con un paio di funzioni realizzate proprio allo scopo.
Il dubbio che tuttavia mi assaliva è il seguente: e se un domani, cambiando server o aggiornado il php ad una versione più giornata, gli algoritmi pedissequamente copiati da php.net e ben referenziati da molti utenti dovessero risultare obsoleti e per questo non più supportati? Mi ritroverei con una impressionante mole di dati su un database senza potermene fare nulla.
Al momento sto adoperando il seguente codice.
Codice PHP:
public function secured_encrypt($data){
$first_key = base64_decode($this -> FIRSTKEY);
$second_key = base64_decode($this -> SECONDKEY);
$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_length);
$first_encrypted = openssl_encrypt($data, $method,$first_key, OPENSSL_RAW_DATA ,$iv);
$second_encrypted = hash_hmac('sha3-512', $first_encrypted, $second_key, TRUE);
$output = base64_encode($iv.$second_encrypted.$first_encrypted);
return $output;
}
public function secured_decrypt($input){
$first_key = base64_decode($this -> FIRSTKEY);
$second_key = base64_decode($this -> SECONDKEY);
$mix = base64_decode($input);
$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);
$iv = substr($mix,0,$iv_length);
$second_encrypted = substr($mix,$iv_length,64);
$first_encrypted = substr($mix,$iv_length+64);
$data = openssl_decrypt($first_encrypted,$method, $first_key,OPENSSL_RAW_DATA, $iv);
$second_encrypted_new = hash_hmac('sha3-512', $first_encrypted, $second_key, TRUE);
if (hash_equals($second_encrypted,$second_encrypted_new))
return $data;
return false;
}
Nel database tutti i campi sono varchar con dimensione 129, in quanto la stringa criptata è di 128 caratteri.
Pensate che ci siano rischi? Come vi sembra il codice?
Grazie mille, siete la mia salvezza
P.S.: finché sono in tempo a modificare il messaggio: personalmente non ho mai approfondito l'argomento crittografia, ma sono abbastanza ferrato in analisi. Non riesco a spiegarmi come una stringa, di dimensione qualunque, possa essere compressa in un'altra stringa di 128 caratteri. Condizione necessaria affinché una funzione sia biettiva, è che nel dominio e nel codomio devono essere presenti lo stesso numero di elementi. Ciò è evidentemente falso per il caso di specie in quanto il dominio è un insieme illimitato superiormente, al contrario, il codominio è, per quanto vasto, limitato sia superiormente che inferiormente. Ne scaturisce che per ogni stringa da 128 bit esistono infinite corrispondenze nel linguaggio ordinaio. Non me lo spiego!