Signieren einer XML-Datei in C#

Vielleicht haben sich schon einige von euch mit Lizenzen beschäftigt. Man erstellt eine Software, verkauft sie und möchte natürlich nicht, dass sie einfach von anderen kostenlos genutzt wird. Ich möchte daher heute eine Möglichkeit vorstellen. Sie ist recht simpel aber dennoch sehr flexibel gestaltet.

Um meinen Ansatz zu verstehen, muss man wissen, was eine asymmetrische Verschlüsselung funktioniert. Während bei einer symmetrischen Verschlüsselung mit einem Passwort sowohl ver- als auch entschlüsselt wird, gibt es bei der asymmetrischen Verschlüsselung zwei Schlüssel. Den Private und den Public Key. Während der Private und der Public Key verschlüsseln können, ist nur der Private Key in der Lage wieder zu entschlüsseln. Will man hingegen wissen, ob eine Nachricht wirklich vom Besitzer des Private Keys kommt, spricht man von Signierung. Signieren kann nur der Besitzer des Privaten Schlüssels, während jeder Public Key Besitzer dies verifizieren kann.

Dieses Verhalten kann man ausnutzen, der Hersteller der Software ist im Besitz des Private Keys und signiert Dateien, welche von der Software, welche den Public Key kennt, verifiziert. Sollte die Signatur nicht gültig sein, verweigert die Software ihren Dienst. Sollte jemand den Inhalt der Datei manipulieren, so muss sie wieder mit dem Private Key neu signiert werden.

Ich habe mir daher eine kleine, aber feine Klasse erstellt, welche entweder ein XML-Dokument oder eine Klasse, welche per XmlSerializer serialisierbar ist, signieren kann. So kann man theoretisch jede Information in eine XML-Lizenz-Datei hinterlegen, etwa wie lange die Lizenz gültig ist. Die nötigen Klassen befinden sich alle im .NET-Framework ab Version 2.0. Der Code ist zum Teil aus der MSDN (siehe Links am Ende des Beitrages).

Diese Möglichkeit bietet keinen absoluten Schutz. Leute könnten mit Programmen wie dotPeek an den SourceCode gelangen und die Prüfung ausbauen. Mit einem Obfuscator kann dies erschwert werden. Zudem dürft ihr niemals den privaten Schlüssel herausgeben, da dieser sowohl signieren als auch einen Public Key erstellen kann.

Beispielapplikation:

Hier findet ihr eine kleine Beispielanwendung. Die Form ist sehr trivial, erstellt erst die Keys, dann die Dummy-Klasse, signieren und zum Schluss validieren.

Links:

How to: Sign XML Documents with Digital Signatures
How to: Verify the Digital Signatures of XML Documents
Beispielanwendung

Über ein Jahr mit dem Palm Pre

Seit über einem Jahr besitze ich nun ein Palm Pre. Vorher besaß ich ein Nokia E65, welches zwar gute Dienste leistete, es war aber kein Smart-Phone. Ich hatte damals eigentlich nicht so viele Anforderungen, ich wollte eigentlich ein Handy, mit dem ich meine Emails lesen und meine Termine und evtl. auch noch Kontakte verwalten kann. Das iPhone war mir einfach zu teuer, zudem hab ich ganz große Probleme mit dieser Politik die Apple veranstaltet, ich möchte doch schon gewisse Freiheiten haben. Ob ich sie nutze, ist die andere Frage aber ich könnte es theoretisch.

So wurde ich damals von Marc auf das Palm Pre aufmerksam gemacht. Es hat eine gute Integration von Googles Diensten, ein offenes System und eine riesige Community, welche mich mit allen möglichen Extras versorgen kann. Mit der App-Anzahl eines Apple AppStores kann es zwar nicht mithalten, aber ein gutes Handy bringt ja das wichtigste an Software bereits mit. Also wurde es das gute Ding.

Doch nun, nach einiger Zeit gibt es ein Paar Dinge, die mich dermaßen stören, dass ich drauf und dran bin, mir ein neues Telefon zuzulegen. Vor einiger Zeit erschien webOS 2.1, welches offiziell für mein Palm Pre nicht erschien, aber mit ein paar Tricks war auch das kein Problem. Allerdings löste das Update nicht wirklich meine Probleme oder Dinge, die mich (mittlerweile) nerven.

Fangen wir mal an. Der „Desktop“ vom Pre, er ist riesig, ich kann mir einen schönen Hintergrund anzeigen lassen und sonst nichts. Warum kann ich dort nicht einfach eine Liste mit Terminen oder Notizen hinterlegen oder sonst was? Also ich habe eigentlich nicht ständig irgendwelche Programme laufen, die mir die Sicht versperren. Selbst mein altes Nokia konnte das besser.

Oder häufig habe ich das Problem, dass der Speicher nicht ausreichend ist. Obwohl kein Programm läuft, bekomme ich beim Programmstart die „Zuviele Karten“-Fehlermeldung. Unter webOS 1.x war es so schlimm, dass ich praktisch NIE Angry Birds spielen konnte. Dies hat sich glücklicherweise mit webOS 2.1 deutlich verbessert, tritt aber dennoch ab und an noch auf. Ist schon nett, wenn man jemanden anrufen will, aber das Anrufprogramm nicht starten kann.

Seit dem Update auf 2.1 meckerte mir meine Email / Kalender Synchronisation ab und an die Ohren voll, dass die Zugangsdaten nicht stimmen würden. Warum auch immer, trat sowohl bei Google als auch beim dienstlichen Exchange-Server auf. Manchmal ging es einfach wieder, manchmal musste ich die Daten neu eingeben oder im schlimmsten Fall das Handy neustarten. Direkt nach dem Update trat der Fehler praktisch mehrmals täglich auf, mittlerweile auch eher nur sporadisch (obwohl ich nichts gemacht habe).

Wie auch meine Kollegen habe ich ab und an das Problem, dass das Pre die Verbindung zur Sim-Karte verliert. Sehr ärgerlich, da mein Handy meistens nur rumliegt und ich es daher erst spät mitbekomme. Man ist also nicht erreichbar.
Allerdings habe ich auch sehr häufig das Phänomen, dass mein Handy Empfang hat und auf einmal bekomme ich eine SMS von wegen mich hätte jemand versucht anzurufen. Mein Handy hat aber nicht geklingelt. Ich kann hierbei aber nicht genau sagen, ob es an o2 oder am Pre liegt, mir fehlte bis jetzt die Motivation, es mit anderen Karten zu testen.

Und dann die Akkulaufzeit. Ich habe auf dem Handy selten irgendwas laufen, meistens werden also nur Email, Kalender und Kontakte abgerufen / synchronisiert. Auch habe ich unterwegs eigentlich G3 und WLan ausgeschaltet, um die Akkulaufzeit zu verlängern. Sollte ich dennoch einmal Abends vergessen, mein Telefon aufzuladen (oder ich lege es nicht korrekt auf den TouchStone), kann ich es nächsten Tag auch zu Hause lassen. Ab und an hab ich auch das Problem, dass das Handy mir einen Akkustand von 50% anzeigt, aber es bereits komplett aus ist, wenn ich rund eine halbe Stunde später wieder nach schaue. Ohne Grund, ohne Warnton ohne alles.

Dann zu meinem Lieblingsthema, die Uhr. Wie jedes Moderne Telefon kann sich das Handy die Zeit aus dem Mobilnetz holen. Nur leider scheint o2 dort nach zu gehen, ich weiß es nicht. Ich hatte sehr häufig unterschiede zur „realen“ Zeit bis zu einer Stunde. Auch ein aktualisieren brachte nichts. Dann hab ich das Synchronisieren mit der Netzzeit deaktiviert und manuell gestellt. Sollte nun aber das Telefon einfach ausgehen (wie oben beschrieben z.B.), zählt die Uhr nicht weiter. Ich lade es nun wieder auf und vergesse die Uhr nachzustellen, dann sitze ich halt nachts um drei auf Arbeit, also laut meinem Pre. Da ich keine Armbanduhr trage, muss ich mich auf mein Handy verlassen können, was ich aber augenscheinlich nicht kann.

Mal abgesehen vom verschenkten Desktop-Platz sind das alles Anforderungen, welche ein modernes Telefon erfüllen sollte. Und das Palm Pre tut es leider nicht.

Steam lässt sich nicht starten

Ich hatte eben das Problem, dass sich Steam nicht starten lassen wollte. In der Steam.log stand nur etwas wie

CsComm Session Jun-04-2011 20:02:44.582 [5612] ReconnectThread (5612) Starting

Dieser Eintrag im offiziellen Forum hat mir geholfen, einfach die Datei „ClientRegistry.blob“ im Steam ordner löschen.
Danach ging es wieder.

Update: oder wir starten einfach den Router neu.. Weiß der Geier, was da wieder los war..