Moin!
Hallo,
Ein Programm soll einige Benutzereinstellungen und -Daten speichern (XML), unter anderem auch Passwörter. XML-Dateien kann man einfach lesen, deswegen müssen die Passwörter irgendwie verschlüsselt gespeichert werden. Nun will ich aber den Quelltext des Programms frei zugänglich machen (erstmal Open Source ohne Lizens). Wie soll das mit der Verschlüsselung gehen?
Zunächst mal: Kein Mechanismus in XML hindert dich daran, die Daten verschlüsselt in XML abzulegen. XML ist ja nur der Container.
Dann: Logischerweise kann man deinen Mechanismus der Verschlüsselung nachvollziehen, wenn du deinen Quelltext offenlegst. Entsprechend kann man also die Daten entschlüsseln, wenn du dich beim Verschlüsseln dumm anstellst. ;) Deshalb: Benutze eines der altbekannten, lange erprobten und als sicher betrachteten Verfahren und erfinde kein neues Verfahren. Dann ist sichergestellt, dass du keine dummen Hintertüren in ein selbst ausgedachtes Verfahren einbaust.
Dann: Kläre, ob du Einwegverschlüsselung benutzen willst. Crypt (nicht empfehlenswert) oder MD5 bieten sich an. Du mußt nur den Mechanismus implementieren bzw. kannst möglicherweise externe Funktionen bzw. Bibliotheken einbinden und mußt dich ansonsten um nichts weiter kümmern.
Wenn du die Daten aus irgendeinem Grund wiederherstellen mußt: Nimm ein symmetrisches Verfahren wie 3DES oder Blowfish. Zum Verschlüsseln benötigst du dann einen Schlüssel, der unter allen Umständen geheim bleiben muss. Aus diesem Grund kannst du dann durchaus dein Programm selbst veröffentlichen - solange der Schlüssel geheim bleibt, sind auch deine verschlüsselten Daten unzugänglich. Der kritische Punkt ist hierbei, den geheimen Schlüssel wirklich geheim zu halten. Je nach Systemarchitektur ist das mehr oder weniger einfach bis hin zu unmöglich - und auch der Komfort der Lösung (Lesen aus einer Datei oder Eingabe über die Tastatur und Bereithalten im RAM) ist variabel.
Entsprechend kannst du natürlich auch asymmetrische Verfahren wie PGP verwenden. Dann kannst du jederzeit über den öffentlichen Schlüssel verschlüsselte Daten generieren, und den Zugriff auf die verschlüsselten Daten erfolgen über den privaten Schlüssel - dieser ist natürlich wieder geheim zu halten, ansonsten sind die verschlüsselten Daten nicht geheim.
Das Problem bei umkehrbaren Verschlüsselungen ist immer die Geheimhaltung des Schlüssels. Deshalb hängt die zu wählende Lösung auch ganz stark davon ab, welche Datenströme vorliegen bzw. welche Zugriffe auf die Daten von wem erfolgen sollen.
Für Passworte empfiehlt sich ein Hash-Verfahren wie MD5. Ein später eingegebenes Passwort wird einfach auch MD5-codiert, das Ergebnis mit dem gespeicherten Wert verglichen. Wird ein Passwort vergessen, generiert man einfach ein neues (anderes), teilt es einmal im Klartext dem Benutzer mit und speichert es gleich MD5-codiert ab.
Für Daten, die nur in eine Richtung durch einen unsicheren Übertragungskanal übertragen werden müssen, ist ein Asymmetrisches Verfahren geeignet. Wenn beispielsweise persönliche Daten erfasst und per SSL zum Server gesendet werden, dort aber nur ein Formmailer eingesetzt werden soll, ist es ratsam, die Mail mit PGP verschlüsselt abzusenden. Auf die eingegebenen Daten wird der Server nicht wieder zurückgreifen.
Wenn hohe Sicherheit mit ständigem Zugriff gefordert ist, ist sehr zu prüfen, wo man mit dem Sicherheitsmechanismus ansetzt. Denn wenn der geheime Schlüssel z.B. einem CGI-Skript bekannt ist, d.h. von ihm gelesen werden kann, wäre es grundsätzlich möglich, ihn eventuell vom Server auslesen zu lassen. Außerdem besteht bei Multi-Host-Servern das Problem, dass vermutlich auch Skripte von anderen Usern Lesezugriff haben, wenn der Schlüssel in einer Datei steht. In diesem Fall ist es angebracht, den Schlüssel von einer weiteren, unabhängigen Instanz, z.B. einem Crypto-Deamon, verwalten zu lassen, der unter der eigenen oder einer separaten User-ID läuft und als einziger Lesezugriff auf die Schlüsseldaten hat.
Bedenke aber, dass auch dann Root vermutlich immer feststellen kann, wie dein Schlüssel lautet. Wenn du aktiv wieder an die Daten ran willst und nicht selbst Root auf dem System bist, kannst du symmetrische Verschlüsselung deshalb eigentlich vergessen. Sorge dafür, dass kein Mitbenutzer die Daten lesen kann (der systemeigene Zugriffsschutz sollte das erledigen können), und gut ist. Alternativ ist eine asymmetrische Verschlüsselung geeignet, um Daten erstmal zu sichern und dann auf ein vertrauenswürdiges eigenes System zu transferieren, um sie dort wieder zu entschlüsseln.
Ach ja: Wenn die Daten bei der Erfassung unverschlüsselt über das Internet übertragen werden, brauchst du sie hinterher auch nicht mehr intensiv zu verschlüsseln. Der schwächste Punkt bzw. die schlechteste Verschlüsselung der Transferkette entscheidet über die Sicherheit - unverschlüsselt ist daher immer schlecht und macht jede weitere Verschlüsselung im Prinzip sinnlos.
Informiere dich, falls du Root auf deinem eigenen System bist, auch über die Möglichkeiten, verschlüsselte Dateisysteme zu benutzen. Dann mußt du nicht mehr deine einzelnen Dateien verschlüsseln, sondern lagerst diese Problematik auf dein Betriebssystem aus. In der Regel muss man beim Systemstart ein Passwort eingeben, um auf das verschlüsselte Dateisystem Zugriff zu erlangen - damit sind die Daten geschützt, wenn der Rechner von unautorisierten Personen gestartet wird. Wenn er beispielsweise aus dem Serverraum geklaut wird, wird man ihn in der Regel herunterfahren müssen, kriegt beim erneuten Hochfahren dann aber keinen Zugriff auf sensible Daten mehr.
- Sven Rautenberg
Diese Signatur gilt nur am Freitag.