15. september 2010 - 09:02Der er
12 kommentarer og 1 løsning
Gemme og læse krypteret password
Problemet er som følgende: Jeg har et program der skal have brugernavn/kodeord gemt i en fil, så det kan blive loadet hver gang programmet starter. Det er ikke selve programmet der skal bruge koden, men i stedet for skal det bruges til et andet program jeg ikke kontrollere. Derfor kan jeg ikke bruge hash.
Jeg har søgt lidt efter en forholsvis sikker metode til at kryptere og dekryptere en string.
Indtil videre har jeg fundet frem til at DPAPI (DataProtection API) fra Microsoft hvor det hele er krypteret så kun den nuværende bruger kan dekryptere det vil være en god metode.
Jeg kan sagtens kryptere/dekryptere i runtime. MEN når jeg vil gemme det i en fil, så kan jeg ikke få det til at spille.
Indtil videre har jeg forsøgt med en XmlTextWriter for at gemme det i XML, men det giver "forkert parameter" fejl når jeg prøver at læse dataene fra xml-filen, under password er der følgende tekst (uddrag): ���?????z�?O??
Jeg har overvejet at lave et object der indeholder brugernavn og password, og så serializere det. Men hvordan vil i anbefale jeg gør det?
Hvis i i stedet vil anbefale mig en anden måde at gøre det på vil det også være okay.
Ps. Bruger pt. Framework 3.5, men hvis det er en nem løsning til Framework 4.0 så gør det ikke noget
Skal du serializere den krypterede værdi, så sørg for at skrive den i Base64. Det garanterer "læsbare" tegn og ikke volapyk. Understøttes af Framework 2 i hvert fald.
Jeg har selv lige haft samme opgave og lavede nedenstående. Den bruger protectedConfigurationProvideren og returnerer altså kun xml-gyldige tegn.
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; } } } }
Jeg har nu fået det til at virke. Jeg brugte aabergs som udgangspunkt, så jeg vil gerne give point til aaberg. Læg venligst et svar.
Hele klassen der kan bruges til DPAPI kan ses her:
using System; using System.Security.Cryptography; using System.Text; using AutoLoginSDE;
namespace Crypto { // bruger Microsoft encryption metode, kun den samme bruger som krypterede kan dekryptere // Hvis det skal gælde for en bestemt maskine så brug i stedet DataProtectionScope.LocalMachine public class DataProtection { public static string EncryptPasswordToBase64(string text, byte[] s_aditionalEntropy) { byte[] cipherData = Protect(Encoding.UTF8.GetBytes(text), s_aditionalEntropy); if (cipherData == null) return "";
I princippet ingenting tror jeg, bortset fra et ekstra byte array jeg sender me fra selve programmet. selvfølgelig kan en med forstand på reflector slippe forbi det, men jeg har vurderet at ud fra hvor mange der skal bruge programmet, så er den her sikkerhed bedre end ingenting.
Hvis du har et andet og bedre forslag så vil jeg da gerne kigge på det.
Løsningen bruger dpapi. Og du skal altså enten have adgang til maskinen eller bedre - brugeren som skal anvende data for at kunne dekryptere.
dpapi bruger en kontospecifik key til det. Det smarte ved den brugerspecifikke løsning er, at selvom nogen får tiltusket sig rollen som administrator vil det ikke nytte bare at resette kendeordet, da det også vil slette den nøgle (hash'en af dine credentials) data i dpapi er krypteret med. Så en hacker med onde hensigter skal altså have adgang til den specifikke konto. Normalt vil man sætte flere restriktioner på denne og normalt vil det være en lokal konto.
God pointe du har, men i dette tilfælde er behovet mere at sørge for selvom en kopiere filen hvor kodeord gemmes i, kan personen ikke bruge den til. Og at det heller ikke skal være nemt for en person der lige låner computeren at få kodeordet ud af programmet.
Hvis det er setuppet og det er et krav at bruger ikke skal indtaste et password, så er det nok den bedste løsning.
Synes godt om
Ny brugerNybegynder
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.