MySQL ha a disposizione una serie di funzioni che si occupano di compressione, crittografia e codifica delle informazioni. Il loro ruolo è determinante soprattutto sotto l'aspetto della sicurezza dei dati e della conservazione di password, qualora il DBMS costituisca la base di un sistema di autenticazione.
In questa lezione verranno presentate le funzioni appartenenti a questa categoria, suddivise per tipologie, mettendo in evidenza le indicazioni d'uso. Le funzioni, come si vedrà, possono essere sperimentate all'interno del client mysql, utilizzando solo il costrutto SELECT
.
Funzioni hash
Molto comune è l'utilizzo di funzioni hash, che attuano una forma di crittografia “a senso unico”. In pratica esse consentono di ricavare un stringa di lunghezza fissa ed apparentemente incomprensibile (detta codice hash), a partire da una stringa qualsiasi, facendo però in modo che l'operazione inversa sia impossibile. In altre parole, non dovrebbe essere possibile utilizzare il codice hash per risalire alla stringa originale. Le funzioni hash possono tornare utili per memorizzare password di utenti nel database, in maniera che non siano leggibili in modo diretto nel remoto caso in cui qualche malintenzionato ottenga l'accesso al DB.
L'operazione viene svolta tramite appositi algoritmi, e le funzioni che li applicano sono le seguenti:
-
MD5: calcola una checksum da 128 bit, a partire da una stringa qualsiasi, restituendo un codice esadecimale di 32 caratteri:
> SELECT MD5('cane'); 0165801c0cce07c7a8751949845c93d2
-
SHA1: applica l'algoritmo SHA (Secure Hash Algorithm) a 160 bit, che permette di ottenere un codice esadecimale di 40 caratteri:
> SELECT SHA1('cane'); 95df5d1bd9fbc6c52626039f90ab8d1b57406680
È possibile usare anche la funzioneSHA()
, ma si tratta di un sinonimo di SHA1; -
SHA2: implementa un algoritmo più sicuro rispetto a MD5 e SHA1 che può essere applicato nelle versioni SHA-224, SHA-256, SHA-384 e SHA-512. SHA2 richiede due parametri in input: il primo è la stringa da cifrare, il secondo è la lunghezza in bit desiderata per il risultato (i valori accettabili sono 224, 256, 384 e 512 mentre se si indica lo 0 verrà utilizzato ugualmente 256):
> SELECT SHA2('cane',256); df39220189ca8225b3ef4bb8f3654b2217c11b056cb764a806586f3b95530052
Funzioni per la compressione
Esistono alcune funzioni utili per comprimere e decomprimere informazioni, il cui utilizzo è subordinato all'installazione del modulo zlib.
Si tratta di:
-
COMPRESS
: comprime le informazioni fornendo come risultato una stringa binaria; -
UNCOMPRESS
: decomprime delle informazioni compresse conCOMPRESS
; -
UNCOMPRESSED_LENGTH
: fornisce la lunghezza della stringa prima di essere compressa.
Qualora fosse necessario immagazzinare nel database il risultato di una compressione, non si dovrebbero usare campi CHAR
o VARCHAR
, bensì BLOB
o VARBINARY
, più adatti per stringhe binarie.
Funzioni per la crittografia
Per la crittografia viene utilizzato l'algoritmo AES (Advanced Encryption Standard), molto conosciuto nel mondo informatico. Le funzioni a disposizione sono AES_ENCRYPT
per crittografare e AES_DECRYPT
per decrittare.
La crittografia che viene applicata è simmetrica: si utilizza una chiave (generalmente una stringa) per codificare i dati, e la stessa password dovrà essere fornita per leggerli in chiaro.
Ad esempio, la seguente invocazione:
> SELECT AES_ENCRYPT('questo è il mio segreto','melarossa');
cifrerà la frase “questo è il mio segreto” utilizzando la stringsmelarossa come password. La stessa chiave segreta deve essere fornita al momento di invocare AES_DECRYPT
.
Verificare la forza di una password
Proprio per il ruolo che MySQL svolge nella conservazione delle credenziali di utenti, nella versione 5.6.6 del DBMS è stata introdotta una nuova funzione, chiamata VALIDATE_PASSWORD_STRENGTH
, che riceve in input una password, scritta in chiaro, e restituisce un intero compreso tra 0 e 100 che ne indica la forza: 0 è il livello di debolezza assoluta, 100 il massimo della forza.
Il funzionamento di VALIDATE_PASSWORD_STRENGTH
si basa su criteri che valutano le vulnerabilità della parola chiave scelta come quantità e tipo di caratteri utilizzati. Il livello di sufficienza per la forza di una password dovrebbe superare il valore 50 e possibilmente il 75.
Funzioni deprecate
Nell'ambito delle funzioni di codifica ne esistono diverse, tra l'altro molto usate in passato, che attualmente sono deprecate e pertanto dovrebbero essere evitate perchè rivelatesi insicure, e quindi probabilmente non più supportate in futuro.
Eccone un elenco:
-
DES_ENCRYPT
eDES_DECRYPT
: funzioni crittografiche basate sull'algoritmo DES. Sono state decprecate nella versione 5.7.6 e dovrebbero essere sostituite con le menzionateAES_ENCRYPT
eAES_DECRYPT
; -
ENCRYPT
: funzione crittografica basata sulla chiamata di sistema Unixcrypt()
. Come le precedenti, dovrebbe essere rimpiazzata daAES_ENCRYPT
; -
PASSWORD
eOLD_PASSWORD
: fornivano una versione hash di una password. Possono essere rimpiazzate conMD5
,SHA1
oSHA2
; -
ENCODE
eDECODE
: rispettivamente si occupavano della crittografia e decrittografia di una stringa tramite una password. Anche queste dovrebbero essere sostituite conAES_ENCRYPT
eAES_DECRYPT
.