Benutzer mit den meisten Antworten
Verschlüsseln/Entschlüsseln von XML Dateien

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
Antworten
-
Hab es hinbekommen.
LG
Claudia
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 11. Oktober 2012 07:24
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.
-
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 -
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.
-
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.- Bearbeitet Jürgen Röhr Dienstag, 4. September 2012 15:43
-
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
-
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 -
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 -
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
-
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 -
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>[]()[])
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.
-
-
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
- Bearbeitet Stefan FalzModerator Mittwoch, 5. September 2012 19:03
-
Hab es hinbekommen.
LG
Claudia
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 11. Oktober 2012 07:24
-
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.