Logo UGIdotNET

Discussione 'Database crittografato'

# Pubblicato il 15 lug 2002 15.55 - Rispondi
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
# Pubblicato il 15 lug 2002 16.15 - Rispondi
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
# Pubblicato il 15 lug 2002 16.30 - Rispondi
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????
# Pubblicato il 15 lug 2002 20.13 - Rispondi
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
# Pubblicato il 16 lug 2002 11.31 - Rispondi
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????
# Pubblicato il 16 lug 2002 12.03 - Rispondi
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.
# Pubblicato il 16 lug 2002 12.22 - Rispondi
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
# Pubblicato il 16 lug 2002 13.09 - Rispondi
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
# Pubblicato il 16 lug 2002 14.49 - Rispondi
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.
# Pubblicato il 16 lug 2002 14.55 - Rispondi
Antonio Antonicelli
Re: Database crittografato
grazie ancora
# Pubblicato il 16 lug 2002 14.55 - Rispondi
Antonio Antonicelli
Re: Database crittografato
grazie mille ci do un'occhiata

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185