none
Verschlüsseln/Entschlüsseln von XML Dateien RRS feed

  • Frage

  • Hallo,

    ich möchte eine verschlüsselte XL-Datei mit Lizenznummern erstellen, welche nur von meiner ASP.NET Anwendung gelesen und verändert  werden kann. Ich habe dazu ein Beispiel gefunden:

    Rijndael RijndaelAlg = Rijndael.Create();
    
                FileStream writeStream = File.Open("data.xml", FileMode.Create);
                CryptoStream cStream = new CryptoStream(writeStream,
                    RijndaelAlg.CreateEncryptor(RijndaelAlg.Key, RijndaelAlg.IV),
                    CryptoStreamMode.Write);
    
                StreamWriter writer = new StreamWriter(cStream);
    
                writeContacts.Save(writer);
    
                writer.Flush();
                writer.Close();

    Ein Bekannter sagte mir, dass soetwas besser mit einem öffentlichen und einem privaten Schlüssel zu managen sei. Welches ist für meinen Zweck die beste Lösung und wie muss ich den Schlüssel verstecken bzw. übergeben, damit das Ganze sicher ist? Wie kann man dieses am besten realisieren und gibt es dazu iregndwo ein brauchbares Beispiel? Ich verstehe das mit den Schlüsseln nicht so ganz. Im obigen Beispiel werden die Schlüssel ja so erzeugt:

    RijndaelAlg.Key, RijndaelAlg.IV, oder? Wie muss ich das in meiner Webanwendug dann speichern, damit diese die Datei dann lesen kann? Ich finde einfach keinen brauchbaren Ansatz.

    Liebe Grüße

    Claudia

    Dienstag, 4. September 2012 13:05

Antworten

Alle Antworten

  • Recht hat er. Siehe Erzeugen von Schlüsseln für die Ver- und Entschlüsselung. Benutze ein asymetrisches Verfahren und signiere damit dein XML.
    Dienstag, 4. September 2012 14:37
  • Recht hat er. Siehe Erzeugen von Schlüsseln für die Ver- und Entschlüsselung. Benutze ein asymetrisches Verfahren und signiere damit dein XML.

    Wobei man aber dazu sagen muss, dass das alles bei .NET Anwendungen recht wenig bringt, wenn man sich sowohl den Code an sich als auch die Laufzeitvariablen, usw. mit sehr wenig Aufwand anschauen kann.

    Sobald der Inhalt entschlüsselt wird, gibt es auch Mittel und Wege, sich den Inhalt anzuschauen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 4. September 2012 14:44
    Moderator
  • Das Ausspähen von Code ist kein Problem, deswegen nehmen wir ja ein asymetrisches Verfahren. Natürlich bringt alleiniges Signieren nicht so viel, da ja auch die Gültigkeit des öffentlichen Schlüssel bestätigt werden muss. Hierzu ist aber eine korrekt signierte Assembly hinreichend.

    Dienstag, 4. September 2012 15:00
  • Hi,

    ohne allzu tiefe Kenntnisse in Verschlüsselung etc. zu haben: wenn sie mit DERSELBEN Anwendung lesen (=entschlüsseln) UND schreiben (=verschlüsseln) will, müssen doch auch beide (=öffentlicher UND privater) Schlüssel in dieser Anwendung zur Verfügung stehen - also zumindest über das Ausspähen von Code auffindbar sein. Da ist es doch egal, ob  symmetrisch (=ein leicht auszuspähender Schlüssel) oder asymmetrisch (=zwei leicht auszuspähende Schlüssel) gearbeitet wird. Oder liege ich falsch??

    Gruß
    Jürgen


    @Claudia: Vor wem willst Du denn "sicher" sein? Wer könnte Deine Anwendung bzw. Deine Daten ausspähen oder korrumpieren? Eine ASP-Anwendung liegt ja auf einem Webserver, an den der 'normale' Anwendungsbenutzer nicht rankommt.
    Dienstag, 4. September 2012 15:31
  • Der Server wird von einem Kunden von uns genutzt. Darin sollen Lizenzen abgespeichert werden für Zugriffe von Außerhalb. Ich will einfach in der verschlüsselten Datei die Lizenzen als XML hinterlegen für jeden Rechner, welcher zugreifen kann.

    Meinen Code schütze ich durch den .NET Reactor von Eziriz.

    LG

    Claudia

    Dienstag, 4. September 2012 15:53
  • Hi,

    kommt der Kunde nur auf dem Weg als ASP-Anwendungsbenutzer auf den Server oder gibt es auch Dateisystem- oder RDP-Zugriffe?

    Im ersten Fall reichte Dir nämlich schon ein per ASP-Rollenverwaltung zugriffsbeschränkter Ordner, in dem die Lizenzen liegen. Im zweiten Fall sieht das anders aus.

    Und zu Deinem Rijndael-Programm-Ansatz (aber: ich bin tatsächlich kein Krypto-Experte):

    Mit Rijndael.Key bzw. Rijndael.IV generierst Du keinen Schlüssel. Die beiden Felder sind Bytefolgen, wovon .Key als Schlüssel verwendet wird (symmetrisch, also zum Ver- und Entschlüsseln) und .IV der Initialisierungsvektor ist. Die Rijndael-Verschlüsselung arebeitet blockweise, wobei der Block N mit dem Ergebnis der Verschlüsselung des Blocks N-1 verschlüsselt wird. Damit das auch mit Block 0 funktioniert, brauchst Du ein 'simuliertes Block -1-Ergebnis': den IV.

    Für beide (.Key und .IV) sind beliebige Bytefolgen zulässig - also auch wie bei Dir ohne explizite Zuweisung lauter Nullen. Wenn Du mit Rijndael (oder ähnlichen Algorithmen) arbeiten willst, denkst Du Dir eine Bytefolge entsprechender Länge aus, speicherst sie in einer Datei (File.WriteAllBytes) und liest sie vor dem Ver- bzw. Entschlüsseln (File.ReadAllBytes). Den Rest hast Du in Deinem Code ja schon stehen bzw. kannst ihn aus diversen Beispielen abschreiben.

    Gruß
    Jürgen

    Dienstag, 4. September 2012 16:12
  • @Jürgen,

    Na ja. So steht es zwar geschrieben, macht aber keinen Sinn, wenn die Lizenzdatei den Server nicht verläßt...

    Dienstag, 4. September 2012 16:55
  • Es geht also darum, das die Anwendung auf dem Server prüft, ob sie gewisse Funktionen (Anzahl Verbindungen) ausführen darf? Oder wie ist das mit "jedem Rechner, welcher zugreifen kann" zu verstehen?
    Dienstag, 4. September 2012 16:57
  • Hallo Stefan,

    so soll es funktionieren. Es wird abgeprüft, ob der Rechner zugreifen kann. Der Rechner hat eine Nummer, die gegen die Nummer in der Datei geprüft werden soll.

    LG

    Claudia

    Dienstag, 4. September 2012 17:11
  • Hi,

    vielleicht magst Du auch die oben gestellte Frage beantworten, damit Dir geholfen werden kann.

    kommt der Kunde nur auf dem Weg als ASP-Anwendungsbenutzer auf den Server oder gibt es auch Dateisystem- oder RDP-Zugriffe?

    Im ersten Fall reichte Dir nämlich schon ein per ASP-Rollenverwaltung zugriffsbeschränkter Ordner...

    Außerdem wäre noch zu (er)klären, wie der einzelne Rechner zu seiner Nummer kommt (MAC-Adresse?). Denn was nützt Dir die ganze Verschlüsselei auf dem Server, wenn die Nummer im Client einfachst von einem anderen Client kopiert werden kann. Und wie schützt Du Dich gegen kopierte virtuelle Maschinen? Möglicherweise ist die Verschlüsselung gar nicht DAS Problem.

    Gruß
    Jürgen

    Dienstag, 4. September 2012 17:41
  • Der Kunde kommt an das Dateisystem des Servers. Deshalb soll das Ganze auch verschlüsselt funktionieren, damit keiner sieht, was gespeichert wird. Die einzelnen Rechner schickt beim ersten Anmelden seine MAC-Adresse mit. Diese wird auch mit gespeichert.

    LG

    Claudia

    Dienstag, 4. September 2012 17:46
  • Was ich noch nicht verstehe - was ist ein Initialisierungsvektor? Wie lang kann der Key sein?

    LG

    Claudia

    Dienstag, 4. September 2012 18:20
  • Hi,

    das mit dem IV habe ich weiter oben schon zu erklären versucht. Ab wo muss ich nochmal nachbessern?

    Zur Länge des Keys (und des IV) schau mal unter "BlockSize" bzw. "LegalBlockSizes" in der Hilfe oder im Debugger ... das kommt auf den Algorithmus an und ich weiß die konkreten Zahlen nicht).

    Gruß
    Jürgen

    Dienstag, 4. September 2012 18:31
  • Was ich noch nicht verstehe - was ist ein Initialisierungsvektor? Wie lang kann der Key sein?

    Hallo Claudia Salzwedel,

    Macht es Sinn ein wenig „Salz hinstreuen“ J ? Rfc2898DeriveBytes Constructor (String, array<Byte>[]()[])

    Initialisierungsvektor

    Initialization vector | Initialisierungsvektor | IV („Die Länge der IV (die Anzahl Bits oder Bytes) hängt von der Verschlüsselungsmethode ab. Die IV-Länge ist meist vergleichbar mit der Länge des Verschlüsselungsschlüssels oder Chiffreblocks.“)

    Textverschlüsselung per Rjindael

    Salt: Wird üblicherweise bei der Password-Generierung verwendet. Der Klartext wird mit dem Salt "verknüpft" (versch. Verfahren sind möglich) und daraus wird ein Hash gebildet. Das ganze wird ggf. mehrfach wiederholt und ggf. mehrfach fließt dabei auch das "Salz" mit ein.

    IV: Wird im Prinzip bei allen Ciphermodes benötigt, die irgendeine Art von "Feedback" unterstützen. Das bedeutet das Ergebnis des vorherigen Verschlüsselungsvorgangs (eines Blocks!) fließt in die Verschlüsselung des folgenden Blocks mit ein. Da der 1. Block aber ja keinen "Vorgänger" hat, verwendet man hier den Initialization Vector. Der IV wird dann genau einmal verwendet, nämlich nur beim ersten Block. Bei Cipher Modes OHNE Feedback (z.B. ECB) wird ein IV nicht verwendet - weil er ja keinen Sinn macht. (CFB)

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 5. September 2012 17:12
    Moderator
  • Was spricht gegen eine AD-basierte Authentifizierung der Clients? Abhängig von der Art der Anwendung muss auch darüber nachgedacht werden, ob du (ihr) nicht selbst einen Aktivierungsserver betreibt, der die Lizenzdateien erzeugt (signiert).
    Mittwoch, 5. September 2012 17:34
  • Der Schutz bringt nicht viel, außer dir Mehrarbeit, da du im Grunde einen erhöhten Testaufwand hast, da du nach der Obfuskation nochmal alle Test als Blackbox tests laufen lassen musst..
    Mittwoch, 5. September 2012 17:37
  • Hallo Claudia,

    Der Kunde kommt an das Dateisystem des Servers. Deshalb soll das Ganze auch verschlüsselt funktionieren, damit keiner sieht, was gespeichert wird.

    wie gesagt, sobald Du etwas wieder entschlüsseln musst und der "Angreifer" Zugriff auf deine ausführbaren Dateien hat, gibt es keinen wirklichen Schutz. Wenn es jemand drauf anlegt, wird er die gewünschten Informationen auch erhalten.

    Die einzelnen Rechner schickt beim ersten Anmelden seine MAC-Adresse mit. Diese wird auch mit gespeichert.

    Und wo soll da der Schutz sein? MAC Adressen lassen sich problemlos fälschen. Zudem kann es gut sein, dass es mehrere davon in einem Rechner gibt. Welche wird denn dann übergeben? Was, wenn es die MAC der internen Karte ist, die beim nächsten mal gar nicht existiert oder deaktiviert ist und Du dann eine andere MAC Adresse übermittelst? ...?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 5. September 2012 19:03
    Moderator
  • Hab es hinbekommen.

    LG

    Claudia

    Freitag, 14. September 2012 20:31
  • Hab es hinbekommen.

    LG

    Claudia


    Hallo Claudia Salzwedel,

    Es freut uns dass Du Dein Problem lösen könntest. Es wäre schön und hilfreich, wenn Du posten würdest wie es funktioniert hat, denn dann profitieren unter Umständen andere mit dem gleichen Problem davon.

    Ich möchte Dich bitte folgendes lesen und die Beiträge die Dir geholfen haben zu bewerten. Vielen Dank.

    Nutzen Sie die Bewertungsfunktionen ("Antwort" und "Hilfreich") in den MSDN Foren! Unter anderem können andere später eine Lösung schneller finden. Es ist also wünschenswert, dass die fragenden (Benutzer) die Postings anderer Beantworter bewerten.
    Hier dazu die wichtigsten Anhaltspunkte aus den
    Forenregelnund FAQs.

    Lösungsbeiträge als „Die Antwort“ markieren
    Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort". Durch Bewerten eines Beitrags als "Die Antwort" können andere Teilnehmer die Lösung schneller finden. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen.
    [Quelle:
    Forenregeln]

    Bitte markiere den/die Beiträge als Antwort, die dir geholfen haben, dein Problem zu lösen. Das ist zum einen eine Anerkennung für die Autoren dieser Beiträge, zum anderen hilft es zukünftigen Lesern, sich in diesem Thread besser zu orientieren und Antworten auf ihre Fragen schneller zu identifizieren.

    Wie zeige ich an, dass meine Frage durch einen Beitrag beantwortet wurde?

    Wie bewerte ich einen Beitrag als hilfreich? Um einen Beitrag als hilfreich zu bewerten, klicken Sie in einem beliebigen Beitrag auf Als hilfreich bewerten. Sie können Ihre Stimme nur einmal für einen Beitrag abgeben.
    [Quelle:
    Häufig gestellte Fragen]

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 18. September 2012 06:42
    Moderator