Avatar billede Jim Rasmussen Novice
06. august 2011 - 16:52 Der er 15 kommentarer og
1 løsning

Gemme data i registry lib i windows

Er det sikkert nok at gemme en encrypton key i windows registry
Avatar billede arne_v Ekspert
06. august 2011 - 20:33 #1
Sikkert i forhold til hvem?

Hvis du forlader din PC og en saetter sig ned og koerer regedit saa nej.

Den skulle ikke vaere tilgaengelig over internettet.
Avatar billede Jim Rasmussen Novice
06. august 2011 - 20:55 #2
Mener over for angreb fra nettet. Min kryptering skal jo sørge for at ubudne gæster udefra ikke kan stjæle og læse xml filen med den følsomme data (:


Men det fik jeg jo lige svaret på så (:

Og hvis nu jeg gemmer den under CurrentUser. Så kan del vel ikke ses fra en anden bruger kan den??
Avatar billede arne_v Ekspert
06. august 2011 - 21:04 #3
Nu vil XML filen vel heller ikke vaere tilgaengelig over internettet.

Saa hvis den antagelse kikser, kikser antagelsen om at registry saa ogsaa?
Avatar billede Jim Rasmussen Novice
07. august 2011 - 01:40 #4
hvad mener du? Der er vel ikke så svært for en erfaren hacker at få adgang til filer på en pc?

Men det er vel noget svære at opsnappe data fra registrerings databasen, ikke?
Avatar billede arne_v Ekspert
07. august 2011 - 01:58 #5
Er det?

Jeg er ikke ekspert i Windows security, men jeg synes ikke at det er selvindlysende.
Avatar billede bvli Praktikant
07. august 2011 - 10:56 #6
Er det her en eller anden form for morsomhed?? Du har flere gange tidligere fået at vide at det ikke er sikkert at gemme din key sammen med dit program. Om det er indlejret i programmet, som fil eller i reistry er underordnet. Sikkerhrdsregel nr. 1 siger, at du ikke skal prøve at opfinde metoder selv, til at gemme hemmeligheder. Brug anerkendte veldokumenterede metoder som man ved virker i stedet.

Jeg har før vist dig to gange endda, hvordan du bruger Windows data protection api til at løse din opgave. Men alligevel insisterer du på at opfinde din egen måde. Hvorfor?
Avatar billede Jim Rasmussen Novice
07. august 2011 - 12:34 #7
Jamen, brugte jo den algoritme som "Arne_v" viste mig?

Og den virker fint. Skal bare brge et sted at gemme den encryption key.



Med hensyn til de oplysninger du siger jeg har fået? Er det så disse -->
--------------------------------------------------
Men altså - det er vel lige præcis det den kodestump jeg postede gør for dig.

string stuff = dinXml.ToString();
string encryptedStuff = stuff.Encrypt();

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);
}

Det er vel egentlig ret ligetil eller hur?
--------------------------------------------------------

Eller dette?
-->
--------------------------------------------------------
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).
---------------------------------------------------------
Avatar billede Jim Rasmussen Novice
07. august 2011 - 13:22 #8
Holder fast ved at bruge Rijndael til at kryptere med. Men så kan jeg vel bruge DPapr til at gemme min encrypton key med? (:

Kan ikke se hvad du mener med at finde sin egen metode ikke er sikker. INGEN metode er helt 100% skudsikker. Ifølge msdn selv. Så er det programmørens egenskab til at blande flere løsninger der gør krypteringen sikker. Og ikke brugen af én metode. Så dan forstod jeg det i hvert fald.


Men hvad med denne kombination nedenfor.

"Min hemmelige tekst"

Jeg kryptere min tekst med Rijndael ved brug af IV og key.

Min key gemmer jeg så med følgende metoder


-------
// Original Key
string Key = "[b]jioeygtHET153Kræ[b/]";


-----Encrypt-------
byte[] entropy =
    Encoding.Unicode.GetBytes("mysalt");

byte[] encryptedData = ProtectedData.Protect
  (Encoding.Unicode.GetBytes("[b]jioeygtHET153Kræ[b/]"),
    entropy, DataProtectionScope.CurrentUser);
-------------------


-------Decrypt-----
byte[] decryptedData = ProtectedData.Unprotect
  (encryptedData, entropy, DataProtectionScope
    .CurrentUser);

string originalKey = Encoding.Unicode.
    GetString(decryptedData);
--------------------

----
Avatar billede Jim Rasmussen Novice
07. august 2011 - 13:24 #9
"DPapr" var en tastefejl for "DPapi"
Avatar billede Jim Rasmussen Novice
07. august 2011 - 13:28 #10
MEN. Nu skal jeg jo så igen finde et sted at gemme min "entropy key" ??

Det stiller mig vel bare i samme situation som ved bare at bruge "Rijndael" og så skulle gemme min key?
Avatar billede bvli Praktikant
07. august 2011 - 16:59 #11
Du skal bruge begge kodestumper. Den ene bruger jo den anden.

At kryptere en streng:
string s = "test".Encrypt();

At dekrypte igen:
string uncrypted = s.Decrypt();

Du skal ikke gemme nogen key. Det klarer Windows for dig. Men det virker selvfølgelig kun hvis det er samme Windows-bruger der både krypterer og dekrypterer.
Avatar billede Jim Rasmussen Novice
07. august 2011 - 17:12 #12
Du forstår ikke?

Ved godt at jeg både skal bruge encrypt og decrypt.

Men du har lagt to eksempler? Hvilket burde jeg bruge??

Det ene er kortere end det andet og den ene bruger streams.
Avatar billede Jim Rasmussen Novice
07. august 2011 - 18:18 #13
Arh. Sorry!? Nu forstår jeg :p Havde lige et lyst øjeblik! xD
Avatar billede Jim Rasmussen Novice
07. august 2011 - 18:48 #14
bvli. send svar (:
Avatar billede bvli Praktikant
07. august 2011 - 20:00 #15
:)
Avatar billede arne_v Ekspert
07. august 2011 - 21:55 #16
Saa vidt jeg kan laese mig til gemmer DPAPI faktisk key i registry.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester