| Antonio Antonicelli |
Database crittografato
Un saluto a tutti i frequentatori del forum prima di tutto.
Vorrei chiedervi un consiglio: il mio obiettivo è avere un database con dei dati crittografati (un applicazione client server gestionale), quando leggo i dati devo decrittografarli e lavorarci normalmente, e poi crittografarli quando salvo sul DB. La chiave sarà la stessa, quindi immagino vada bene un algoritmo di tipo simmetrico. Ho dato un occhiata al Namespace System.Security.Cryptography ma ho trovato solo esempi che utilizzano file stream, come posso fare? Avete qualche suggerimento??? Grazie mille Tony |
| Davide Vernole |
Re: Database crittografato
Ciao Antonio, ho già affrontato l'argomento nel corso del mio lavoro. Dovevo criptare e decriptare stringhe da inserire in database o in file di configurazione xml. La cosa, grazie al framework è abbastanza semplice. Eccone un esempio basato su l'algoritmo simmetrico DES:
public string DESEncode(string initValue, byte[] key, byte[] iv ) { byte[] initArray = Encoding.Default.GetBytes(initValue); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); des.Key = key; des.IV = iv; MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, des.CreateEncryptor(), CryptoStreamMode.Write); cStream.Write(initArray, 0, initArray.Length); cStream.FlushFinalBlock(); byte[] retVal = new byte[ mStream.Position]; Array.Copy( mStream.GetBuffer(), 0,retVal, 0, retVal.Length); mStream.Close(); cStream.Close(); des.Clear(); return Convert.ToBase64String(retVal); } In questo modo ottieni una stringa in base64 della tua stringa codificata che puoi scrivere sul tuo database. Analogamente puoi successivamente decodificarla: public string DESDecode(string initValue, byte[] key, byte[] iv ) { byte[] initArray = Convert.FromBase64String(initValue); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); des.Key = key; des.IV = iv; MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, des.CreateDecryptor(), CryptoStreamMode.Write); cStream.Write(initArray, 0, initArray.Length); cStream.FlushFinalBlock(); byte[] retVal = new byte[ mStream.Position]; Array.Copy( mStream.GetBuffer(), 0,retVal, 0, retVal.Length); mStream.Close(); cStream.Close(); des.Clear(); return Encoding.Default.GetString(retVal); } Ottieni così la tua stringa in chiaro. Note: la chiave key e il vettore di inizializzazione iv devono essere gli stessi sia in fase di codifica che di decodifica. Entrambi (key e iv) devono avere una dimensione conforme a quella richiesta dall'algoritmo DES. A titolo di esempio potresti crearli così: byte[] key = Encoding.ASCII.GetBytes("0AAAAAA1"); byte[] iv = Encoding.ASCII.GetBytes("01XXXX10"); Spero ti sia utile. Davide |
| Antonio Antonicelli |
Re: Database crittografato
sicuramente mi sarà utile, ma mi sorge una domanda, se io cripto per esempio una data, o un long, e poi questo valore lo metto nel database, Ado.Net si incazza????
|
| Davide Vernole |
Re: Database crittografato
L'algoritmo DES richiede un array di byte e quindi sia che tu passi una data che un long, prima devi preoccuparti di convertirlo in un array di byte. Il risultato che ottieni è anch'esso un array di byte. Conseguentemente i campi del database non potranno essere di tipo DateTime o Long. Così facendo ADO.NET non solleverà eccezioni per tipi di dati non congruenti.
Ciao Davide |
| Antonio Antonicelli |
Re: Database crittografato
Quindi pratticamente i campi delle tabelle del mio DB, devono essere tutti di tipi byte???E poi toccherebbe a me tramite codice gestire i tipi????
|
| Davide Vernole |
Re: Database crittografato
Se per "di tipo byte" intendi un binary o varbynary di MS SQL la risposta è si. In alternativa puoi ottenere una stringa dalla tua funzione e utilizzare un campo char o varchar.
In funzione della quantità di dati da criptare potresti anche valutare la creazione di una struttura serializzabile che, una volta criptata, potrà essere inserita in un'unico campo di tipo varbinary. Per quanto riguarda la loro riconversione, dopo averli recuperati dal db, spetta al tuo codice agire di conseguenza per tipizzarli in modo corretto. |
| Antonio Antonicelli |
Re: Database crittografato
grazie di tutto.
Un ultima domanda: non è che per caso esiste qualche clausola direttamente a livello di Database (sql server 7 o 2000) che permetta di rendere i dati crittografati? Ciao |
| Davide Vernole |
Re: Database crittografato
No, non esiste nulla del genere (almeno da quello che so io). L'unico supporto di criptazione che conosco in SQL è quello dedicato al codice delle stored procedure.
Il fatto è che in un server SQL, nei suoi db e nelle tabelle dei db non dovrebbe entrare utenza non autorizzata. Anche per questo in SQL Server si trova un buon supporto di security per limitare e restringere gli accessi agli oggetti server o di database. Ciao Davide |
| Carlo Pinasco |
Re: Database crittografato
Confermo la risposta di Davide e aggiungo che è possibile utilizzare i servizi di encription del file system di Windows2000, e in questo modo proteggere il database da letture in caso di 'furto' del sistema. In questo caso non ci sono problemi con i tipi perchè per quanto riguarda SQL Server e la tua applicazione il tutto è trasparente.
Esiste poi una società che ha prodotti specifici su questo tema, si tratta della Protegrity la trovi su www.protegrity.com e in particolare la brochure sul prodotto per SQL Server su http://www.protegrity.com/pdf/sd_222_sql_leaflet_final.pdf Non ho idea dei costi e non ho mai avuto modo di utilizzare i loro prodotti, ma forse possono esserti utili. |
| Antonio Antonicelli |
Re: Database crittografato
grazie ancora
|
| Antonio Antonicelli |
Re: Database crittografato
grazie mille ci do un'occhiata
|