17. juli 2011 - 00:46Der er
16 kommentarer og 1 løsning
Encrypt/Decrypt
Hej. (:
Jeg har en xml fil som indeholder nogle meget følsomme data. Disse data skal kun være mulige at læse ved brug af det program (wpf project) som xml filen tilhøre.
Har læst på nettet angående kryptering og dekryptering, men har kun fundet nogle (Syns jeg) MEGET komplicerede løsninger. Er det bare en hel ny verden jeg bevæger mig ind i? Har aldrig brugt eller arbejdet med kryptering før
har hørt at Rijndael er en god algoritme. Men er den svær at bruge?
Blot for at gøre det mere tydeligt: Der menes ikke forskellig IV til hhv. at kryptere og dekryptere, men derimod at IV skal vælges forskellig hver gang du krypterer noget (aldrig genbruge IV's). Den IV der blev brugt til at kryptere med skal også bruges til at dekryptere med. Dog er IV som sådan ikke hemmelig, og du kan derfor gemme den sammen med dine data ukrypteret, og således let finde den når du skal dekryptere.
Formålet med IV er at sikre, at hvis man krypterer samme data flere gange, så fås stadig forskellig output ved kryptering. Det giver en øget sikkerhed.
Koden er som key'en kan bindes på den konto programmet køres under. På samme måde som når man krypterer sections i web.config. Jeg tror jeg har et eksempel et sted.
using System.Configuration; using System.Xml; using System.Xml.Linq;
namespace B.Testing {
static class StringEncryptionExtensions {
public static string Encrypt(this string argument) { if (string.IsNullOrEmpty(argument) throw new ArgumentException("argument is null or empty.", "argument"); DpapiProtectedConfigurationProvider cp = new DpapiProtectedConfigurationProvider(); XmlElement n = new XmlDocument().CreateElement("temp"); n.InnerText = argument; return cp.Encrypt(n).FirstChild.FirstChild.InnerText; }
public static string Decrypt(this string argument) { if (string.IsNullOrEmpty(argument) throw new ArgumentException("argument is null or empty.", "argument"); DpapiProtectedConfigurationProvider cp = new DpapiProtectedConfigurationProvider(); XElement e = new XElement("EncryptedData", new XElement("CipherData", new XElement("CipherValue", argument))); using (XmlReader xr = e.CreateReader()) { XmlDocument d = new XmlDocument(); d.Load(xr); return cp.Decrypt(d.FirstChild).InnerText; } } } }
--- Koden bruger Windows DPapi til at kryptere stringen med. Dvs. krypteringen er bundet op på dine windows credentials (eller de credentials programmet kører under).
#4, som bvli siger, tænk 'salt'. Altså, IV har intet med key at gøre, og du kan ikke bruge IV til noget uden også at have koden. Altså det er ikke sådan du kan delvis dekryptere alene med IV. Hvis man aldrig genbruger IV's, så vil man ikke kunne se på krypteret data (selvom IV ikke er krypteret) ligheder imellem oprindelig data.
Med hensyn til iv saa er der forskellige problemer med genbrug af iv. Nogen af dem er lidt tekniske, men lad os tage et eksempel som er saa simpelt at alle kan foelge med.
Riversen du bliver ansat af Warren Buffet til at handle aktier i Maersk.
Hver aften sender Buffet dig en email med et ord "Buy" eller "Sell" og saa handler du dagen efter.
Da det aabenlyst er interessant at vide om Buffer koeber eller saelger, saa krypteres den email. Buffet og dig har key'en.
Den skumle sidegade vekseler arne_v opsnapper emailene.
Uden iv:
17/7: Buffet sender msg=HJTW 18/7: du koeber, Buffet sender msg=LQZP 19/7: du saelger, Buffet sender msg=HJTW 20/7: du koeber, Buffet sender msg=LQZP 21/7: jeg saelger fordi jeg ved at du vil saelge
Med iv:
17/7: Buffet sender iv=317,msg=JAGW 18/7: du koeber, Buffet sender iv=922,msg=QBFS 19/7: du saelger, Buffet sender iv=731,msg=AHJA 20/7: du koeber, Buffet sender iv=693,msg=AJKT 21/7: jeg skifter erhverv
Er der eksterne krav? I så fald bør du være helt sikker på, om de krav indebærer at dine nøgler aldrig må optræde i klar (heller ikke i RAM i meget kort tid). Hvis det er tilfældet, så skal du (som ny i den verden) overveje ekstern hjælp - og forberede dig på at løsningen er meget dyr.
Pointen er, at løsninger med 'meget følsomme data' ofte har kunder, der forventer sikkerhed via hardware moduler, og det vil være yderst uheldigt at opdage det sent i forløbet.
Programmet køre i windows jo, og lader brugeren gemme sine personlig /følsomme data via programmet i en xml fil. Programmet skal gøre det nemt for brugeren at tilgå login's og andre personlige data med blot et login.
Windows har vel en form for beskyttelse for ubudne gæster udefra ikke?? Så er en hashing ikke nok i dette tilfælde?
Det skal bare beskytte andre brugere af computeren fra at læse det der står i xml filen ved at åbne den. (:
using (Stream stream = File.Open("pathTilDinSettingsFile_EllerEndnuBedre_IsolatedStorage")) using (TextWriter writer = new StreamWriter(stream)) { writer.Write(encryptedStuff); }
Og når du skal loade igen:
using (Stream stream = File.Open("pathTilDinSettingsFile_EllerEndnuBedre_IsolatedStorage")) using (TextReader reader = new StreamReader(stream)) { string encryptedStuff = reader.ReadLine(); string stuff = encryptedStuff.Decrypt(); XDocument dinXml = XDocument.Parse(stuff); }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.