Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 28 di 58
  • livello intermedio
Indice lezioni

Cifratura e decifratura dei dati

Conoscere le potenzialità di MySQL in ambito di sicurezza dei dati: ecco come cifrare, comprimere ed "hashare" i dati di un database.
Conoscere le potenzialità di MySQL in ambito di sicurezza dei dati: ecco come cifrare, comprimere ed "hashare" i dati di un database.
Link copiato negli appunti

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 funzione SHA(), 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 con COMPRESS;
  • 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 e DES_DECRYPT: funzioni crittografiche basate sull'algoritmo DES. Sono state decprecate nella versione 5.7.6 e dovrebbero essere sostituite con le menzionate AES_ENCRYPT e AES_DECRYPT;
  • ENCRYPT: funzione crittografica basata sulla chiamata di sistema Unix crypt(). Come le precedenti, dovrebbe essere rimpiazzata da AES_ENCRYPT;
  • PASSWORD e OLD_PASSWORD: fornivano una versione hash di una password. Possono essere rimpiazzate con MD5, SHA1 o SHA2;
  • ENCODE e DECODE: rispettivamente si occupavano della crittografia e decrittografia di una stringa tramite una password. Anche queste dovrebbero essere sostituite con AES_ENCRYPT e AES_DECRYPT.

Ti consigliamo anche