C# XML Verschlüsseln und Entschlüsseln

Xervos

Erfahrenes Mitglied
Hallo Leute,

Ich arbeite gerade an einem Programm mit dem man Immobilien auf eine Homepage stellen kann, diese bearbeiten, löschen und Soweiter. Da ich nicht will das jeder in das Programm einsteigen kann habe ich mir überlegt ich mache einen login die auf eine XML zugreift. In dieser XML soll es mehrere Acoounts geben zb. User A darf nur die Fertigen angebote lesen, User B darf nicht zu lesen sondern auch neue anlegen und bestehende Bearbeiten. User C darf alles machen (darunter zählt auch neue User anlegen usw.) ich habe mir dann überlegt ich mache Accounts und weiße denen gewisse Rechte zu (schreiben, lesen, löschen, Bearbeiten usw.) mit desen hilfe ich dann im Programm steuer welche Formulare usw. zur verfügung stehen. Wenn man das Programm startet kommt zu einem login wo man Username und Passwort eingeben soll. Nach drücken des login button soll eine XML datei im Hintergrund abgerufen werden, geprüft werden ob username und passwort überein stimmen, ist das der Fall werden noch die Rechte geprüft, gesetzt und dann erfolgt der Login. Die XML sollte natürlich wieder verschlüsselt und geschlossen werden wenn das alles gemacht wurde (auch bei falschen login). Ich habe im Internet was von einem XMLWriter gelesen nur bin ich mir nicht sicher wie ich das mit Rijndael verschlüsselung koppeln kann.

Das verschlüsseln von Txt dateien funktioniert super und auch das entschlüsseln nur brauch ich eben eine XML datei. Ich will in Zukunft nicht nur Accountdaten in einer XML datei speichern sondern auch Versions hinweise usw. (die erweiterungen sind hier echt viel). Ich hänge mal einfach meine Klasse hier rein die das entschlüsseln und verschlüsseln übernimmt.

Das ist im Grunde das beispiel von MSDN nur gering angepasst

Code:
public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV)
        {
            try
            {
                // Create or open the specified file.
                FileStream fStream = File.Open(FileName, FileMode.Create);

                // Create a new Rijndael object.
                Rijndael RijndaelAlg = Rijndael.Create();
                RijndaelAlg.IV = IV;
                RijndaelAlg.Key = Key;

                // Create a CryptoStream using the FileStream 
                // and the passed key and initialization vector (IV).
                CryptoStream cStream = new CryptoStream(fStream,
                    RijndaelAlg.CreateEncryptor(Key, IV),
                    CryptoStreamMode.Write);

                // Create a StreamWriter using the CryptoStream.
                StreamWriter sWriter = new StreamWriter(cStream);

                try
                {
                    // Write the data to the stream 
                    // to encrypt it.
                    sWriter.WriteLine(Data);
                   
                }
                catch (Exception e)
                {
                    Console.WriteLine("An error occurred: {0}", e.Message);
                }
                finally
                {
                    // Close the streams and
                    // close the file.
                    sWriter.Close();
                    cStream.Close();
                    fStream.Close();
                }

            }
            catch (CryptographicException e)
            {
                Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
            }
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine("A file error occurred: {0}", e.Message);
            }
            catch (Exception e)
            {

                Console.WriteLine("An error occurred: {0}", e.Message);
            }
          

        }

  
    public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV)
    {
        try
        {
            // Create or open the specified file. 
            FileStream fStream = File.Open(FileName, FileMode.Open);

            // Create a new Rijndael object.
            Rijndael RijndaelAlg = Rijndael.Create();
            RijndaelAlg.IV = IV;
            RijndaelAlg.Key = Key;

            // Create a CryptoStream using the FileStream 
            // and the passed key and initialization vector (IV).
            CryptoStream cStream = new CryptoStream(fStream,
                RijndaelAlg.CreateDecryptor(Key, IV),
                CryptoStreamMode.Read);

            // Create a StreamReader using the CryptoStream.
            StreamReader sReader = new StreamReader(cStream);

            string val = null;

            try
            {
                // Read the data from the stream 
                // to decrypt it.
                while (!sReader.EndOfStream)
                {
                    val = val + sReader.ReadLine() + "\r\n";
                }
                


            }
            catch (Exception e)
            {

                Console.WriteLine("An error occurred: {0}", e.Message);
            }
            finally
            {
                // Close the streams and
                // close the file.
                sReader.Close();
                cStream.Close();
                fStream.Close();
            }
           

            // Return the string. 
            return val;
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
            return null;
        }
        catch (UnauthorizedAccessException e)
        {
            Console.WriteLine("A file error occurred: {0}", e.Message);
            return null;
        }
        catch (Exception e)
        {

            Console.WriteLine("An error occurred: {0}", e.Message);
            return e.Message;
        }
    }

wie gesagt das mit einer File klappt super. Wie kann ich das jetzt umschreiben das ich eine XML verschlüsselt schreiben kann. Noch eine Weitere Frage ich parse ich das ganze dann durch ?

Danke für eure Hilfe

lg
 
Zuletzt bearbeitet:
Wieso nicht für das Tool und die Anmeldung an der Website denselben Mechanismus wählen? D.h. du könntest ein Webservice anbieten, welches die Anmeldung vornimmt. Dann ersparst du es dir, für jede Programm-Installation ein Passwort-File mitzuliefern. Zusätzlich können Logins zentral gespeichert/gesteuert werden. Auch Änderungen an Rollen etc. wäre wesentlich einfacher zu verwalten.
 
Hallo,

die Idee mit der zentralen Datenhaltung ist auf jeden Fall gut. Dazu würde ich dir auch raten.

Zu deiner XML File. Eigentlich ist die XML File auch nur eine normale Datei. Wenn du also den Inhalt Zeilenweise Ver-, bzw. Entschlüsselst sollte es keine probleme.
Um eine XML Datei parsen zu können kannst du natürlich die XMLReader Klasse benutzten, welche ich allerding heutzutage schon fast als veraltet ansehe ;)
Schau die lieber mal das Thema LINQ to XML an. Das finde ich sehr komfortabel, da du so den Inhalt der Datei wie Objekte handeln kannst. Mit LINQ hast du auch weniger Aufwand wenn du dich später mal einer Datenbank anstatt der XML Datei bedienen willst.

Gruß
 
Hallo

danke für die Antworten. Ich habe es mitlerweile geschafft eine XML datei zu ver und entschlüsseln. Die Daten auszulesen und den Login zu überprüfen. Ist eigentlich nicht so schwer. Ich habe mir hierfür eine eigene Klasse geschrieben die das übernimmt. Aber ich muss euch recht geben. Da dieses Programm ja ohnehin auf einen server zugreift werde ich das ganze wohl Zentral verwalten. Ich bin ja auch drauf gekommen das wenn ich das ganze Lokal verwalte ein Benutzer nur auf seinem PC einlogen kann und niemals einen anderen Benutzen kann (was auch nicht gerade gut ist).

Danke euch nochmal habe wenigstens was dabei gelernt und weiß nun für die Zukunft wie sowas funktionieren kann :) was ja auch nicht schlecht ist

lg
 
Zurück