Crittografare e decrittografare un file

di Marco Leoncini, in asp.net,

per configuare varie parti di un sito, ricorro spesso a file xml e classi serializzabili, tutto questo non è un toccasana per la sicurezza specialmente se i file xml contengono informazioni sensibili, come ad esempio la stringa di connessione al database.

fin da subito mi sono posto (propio subito subito no ;)) il problema di come, non dico impedire, ma perlomeno rendere più difficile l'accesso a queste risorse.

la risposta è stata crittografare il file xml :) e tenicamente la soluzione lo trovata sulla Knowledge Base

http://support.microsoft.com/default.aspx?scid=kb;it;307010

ho apportato veramente poche modifiche, strasformando l'applizazione console in una "semplice" classe, lo dotata di due costruttori uno che richiama il metodo privato per crittare e l'altro che richiama il metodo per decrittare, infine una propieta pubblica che mi restituisce uno stream (il risulatato della decrittazione non lo salvo su disco) che viene usato per deserializzarlo in un oggetto.

ecco il codice del tutto simile a quello della Knowledge Base apparte le leggere modifice apportate:

using System;

using System.IO;

using System.Security;

using System.Security.Cryptography;

using System.Text;

 

namespace Soluzioni4D.WebModules.EncryptDecrypt

{

/// <summary>

/// Summary description for Class1.

/// </summary>

public sealed class EncryptDecryptFile

{

//Must be 64 bits, 8 bytes.

private const string sSecretKey = "Password";

Stream streamOutput;

 

public EncryptDecryptFile(string sInputFilename)

{

streamOutput = DecryptFile(sInputFilename, sSecretKey);

}

public  EncryptDecryptFile(string sInputFilename, string sOutputFilename)

{

EncryptFile(sInputFilename,sOutputFilename,sSecretKey);

}

 

private void EncryptFile(string sInputFilename,

string sOutputFilename,

string sKey)

{

FileStream fsInput = new FileStream(sInputFilename,

FileMode.Open,

FileAccess.Read);

 

FileStream fsEncrypted = new FileStream(sOutputFilename,

FileMode.Create,

FileAccess.Write);

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);

DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

ICryptoTransform desencrypt = DES.CreateEncryptor();

CryptoStream cryptostream = new CryptoStream(fsEncrypted,

desencrypt,

CryptoStreamMode.Write);

 

byte[] bytearrayinput = new byte[fsInput.Length];

fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Close();

fsInput.Close();

fsEncrypted.Close();

}

 

private Stream DecryptFile(string sInputFilename,string sKey)

{

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

//A 64 bit key and IV is required for this provider.

//Set secret key For DES algorithm.

DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);

//Set initialization vector.

DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

 

//Create a file stream to read the encrypted file back.

FileStream fsread = new FileStream(sInputFilename,

FileMode.Open,

FileAccess.Read);

//Create a DES decryptor from the DES instance.

ICryptoTransform desdecrypt = DES.CreateDecryptor();

//Create crypto stream set to read and do a

//DES decryption transform on incoming bytes.

CryptoStream cryptostreamDecr = new CryptoStream(fsread,

desdecrypt,

CryptoStreamMode.Read);

return cryptostreamDecr;

}

 

public Stream StreamOutput

{

get{return streamOutput;}

}

 

}

}

il cammino per la sicurezza non di conclude di certo quà :) adesso tocca alla classe essere resa sicura, sarà di sicuro argomento di una prossima bloggata :)

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese