2016-03-22 5 views
0

Ich würde die ProtectedData verwende ich hier gefunden: https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspxProtectedData verwenden, um ein Wörterbuch von Strings

Mein Problem ist, dass ich nicht verstehen kann, wie ich ein Wörterbuch mit einer Quelle von Bytes anpassen kann, auch wenn es von einem Byte konvertiert [] string, wenn ich den Unprotect mache, kann es nicht entschlüsseln. Ich habe so versucht:

Code ohne Datenschutz Seite:

public static void SetLoginUserDataForFile(ConnectionData data) 
{ 
    Dictionary<string, Dictionary<string, string>> retVal = new Dictionary<string, Dictionary<string, string>>(); 
    Dictionary<string, string> dataValues = new Dictionary<string, string>(); 

    if (File.Exists(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE"))) 
    { 
     string fileData = File.ReadAllText(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE")); 
     try 
     { 
      retVal = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(Decrypt(fileData, "pa$$w0rd")); 
     } 
     catch (Exception ex) 
     { 
      retVal = new Dictionary<string, Dictionary<string, string>>(); 
     } 

     dataValues.Add("HashedPwd", data.HashedPwd); 
     dataValues.Add("CanAccessOffline", data.LoggedUser.CanAccessOffline.ToString()); 
     dataValues.Add("CanSavePassword", data.LoggedUser.CanSavePassword.ToString()); 

     if (retVal.ContainsKey(data.LoggedUser.UserName)) 
      retVal[data.LoggedUser.UserName] = dataValues; 
     else 
      retVal.Add(data.LoggedUser.UserName, dataValues); 

     File.WriteAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE"), Encrypt(JsonConvert.SerializeObject(retVal), "pa$$w0rd")); 
    } 
} 

ich versuche dies:

public static void SetLoginUserDataForFile(ConnectionData data) 
{ 
    Assembly assembly = Assembly.GetExecutingAssembly(); 
    String GuidID = assembly.GetType().GUID.ToString(); 

    Dictionary<string, Dictionary<string, string>> retVal = new Dictionary<string, Dictionary<string, string>>(); 
    Dictionary<string, string> dataValues = new Dictionary<string, string>(); 

    if (File.Exists(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE"))) 
    { 
     string fileData = File.ReadAllText(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE")); 
     try 
     { 
      retVal = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(Decrypt(fileData, DataProtection.Unprotect(GetBytes(GuidID)).ToString())); 
     } 
     catch (Exception ex) 
     { 
      retVal = new Dictionary<string, Dictionary<string, string>>(); 
     } 

     dataValues.Add("HashedPwd", data.HashedPwd); 
     dataValues.Add("CanAccessOffline", data.LoggedUser.CanAccessOffline.ToString()); 
     dataValues.Add("CanSavePassword", data.LoggedUser.CanSavePassword.ToString()); 

     if (retVal.ContainsKey(data.LoggedUser.UserName)) 
      retVal[data.LoggedUser.UserName] = dataValues; 
     else 
      retVal.Add(data.LoggedUser.UserName, dataValues); 

     File.WriteAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE"), Encrypt(JsonConvert.SerializeObject(retVal), DataProtection.Protect(GetBytes(GuidID)).ToString())); 
    } 
} 

public static byte[] GetBytes(string str) 
{ 
    byte[] bytes = new byte[str.Length * sizeof(char)]; 
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 
    return bytes; 
}  

Einmal habe ich es noch einmal lesen, indem Sie die Datei aufrufen, nicht mehr in der Lage, es zu öffnen .. Wie repariere ich?

Antwort

0

Aus irgendeinem Grund nehmen Sie an, dass Ihre Datei eine Textdatei ist und dass Byte-Arrays mit einem einfachen Aufruf an ToString() serialisiert und deserialisiert werden können. Das ist nicht der Fall.

Verwenden Sie die Methoden File, die Bytearrays lesen und schreiben. Weil du das hast.

+0

Ich weiß, dass Sie Recht haben, ich muss die Save-Struktur ändern. –

Verwandte Themen