Ich erstelle eine clientseitige Anwendung, die ein Protokoll der Benutzeraktivität erstellen muss, aber aus verschiedenen Gründen darf dieses Protokoll nicht für Menschen lesbar sein.
Momentan entwickle ich für meine Entwicklung ein Klartextprotokoll, das ungefähr so aussieht:
12/03/2009 08:34:21 - & gt; Benutzer 'Bob' hat sich angemeldet 12/03/2009 08:34:28 - & gt; Zur Konfigurationsseite navigiert 12/03/2009 08:34:32 - & gt; Option x wurde zu y geändert.
Wenn ich meine Anwendung ausliege, muss das Protokoll nicht im Nur-Text-Format vorliegen, daher muss der gesamte Text verschlüsselt werden. Dies scheint nicht einfach zu erreichen, da ich die Protokolldatei dynamisch aktualisieren muss, wenn jeder Eintrag hinzugefügt wird. Der Ansatz, über den ich nachdachte, war, eine Binärdatei zu erstellen, jeden Protokolleintrag isoliert zu verschlüsseln und ihn dann mit einer geeigneten Abgrenzung zwischen den einzelnen Einträgen an die Binärdatei anzuhängen.
Kennt irgendjemand irgendwelche gängigen Ansätze für dieses Problem, bin ich sicher, dass es eine bessere Lösung geben muss!
Das ist nicht wirklich mein Ding, das gebe ich dir gerne zu, aber kannst du nicht jeden Eintrag einzeln verschlüsseln und ihn dann an die Logdatei anhängen? Wenn Sie den Zeitstempel nicht verschlüsseln, können Sie Einträge, nach denen Sie suchen, leicht finden und bei Bedarf entschlüsseln.
Mein Punkt ist hauptsächlich, dass das Anhängen einzelner verschlüsselter Einträge an eine Datei nicht notwendigerweise binäre Einträge sein muss, die an eine Binärdatei angehängt werden. Die Verschlüsselung mit (zum Beispiel) gpg wird zu einem Ascii-Fehler führen, der an eine ASCII-Datei angehängt werden kann. Würde das dein Problem lösen?
Verschlüsseln Sie einzelne Protokolleinträge nicht separat und schreiben Sie sie in eine Datei, wie von anderen Postern vorgeschlagen, da ein Angreifer leicht Muster in der Protokolldatei identifizieren könnte. Weitere Informationen zu diesem Problem finden Sie im Blockchipheriemodus Wikipedia-Eintrag .
Stellen Sie stattdessen sicher, dass die Verschlüsselung eines Protokolleintrags von den vorherigen Protokolleinträgen abhängt. Obwohl dies einige Nachteile hat (Sie können einzelne Protokolleinträge nicht entschlüsseln, da Sie immer die gesamte Datei entschlüsseln müssen), macht dies die Verschlüsselung sehr viel stärker. Für unsere eigene Protokollierungsbibliothek SmartInspect verwenden wir die AES-Verschlüsselung und den CBC-Modus, um das Musterproblem zu vermeiden. Fühlen Sie sich frei, SmartInspect auszuprobieren, wenn eine kommerzielle Lösung geeignet wäre.
FWIW, das eine Mal, als ich einen verschlüsselten Logger brauchte, benutzte ich einen symmetrischen Schlüssel (aus Performance-Gründen), um die tatsächlichen Log-Einträge zu verschlüsseln.
Der symmetrische "Protokolldateischlüssel" wurde dann unter einem öffentlichen Schlüssel verschlüsselt und am Anfang der Protokolldatei gespeichert. Ein separater Protokollleser verwendete den privaten Schlüssel, um den "Protokolldateischlüssel" zu entschlüsseln und die Einträge zu lesen.
Das Ganze wurde mit log4j und einem XML-Protokolldateiformat implementiert (um dem Leser das Parsen zu erleichtern) und jedes Mal, wenn die Protokolldateien durchlaufen wurden, wurde ein neuer 'Protokolldateischlüssel' generiert.
Wenn Sie jeden Protokolleintrag einzeln verschlüsseln, würde dies die Sicherheit Ihres Chiffretextes stark beeinträchtigen, insbesondere weil Sie mit sehr vorhersagbarem Klartext arbeiten.
Folgendes können Sie tun:
Wählen Sie dann einen zufälligen temporären Schlüssel am Anfang jedes Fensters (alle 5 Minuten, alle 10 Minuten usw.)
Verschlüsseln Sie jedes Protokollelement separat mit dem temporären Schlüssel und hängen Sie es an eine temporäre Protokolldatei an.
Wenn das Fenster geschlossen ist (die vorgegebene Zeit ist abgelaufen), entschlüsseln Sie jedes Element mit dem temporären Schlüssel, entschlüsseln Sie die Master-Protokolldatei mit dem Hauptschlüssel, führen Sie die Dateien zusammen und verschlüsseln Sie mit dem Hauptschlüssel.
Wählen Sie dann einen neuen temporären Schlüssel und fahren Sie fort.
Ändern Sie auch den Hauptschlüssel jedes Mal, wenn Sie Ihre Hauptprotokolldatei rotieren (jeden Tag, jede Woche usw.)
Dies sollte genügend Sicherheit bieten.
Ich frage mich, welche Art von Anwendung Sie schreiben. Ein Virus oder ein Trojanisches Pferd? Wie auch immer ...
Verschlüsseln Sie jeden Eintrag einzeln, konvertieren Sie ihn in eine Zeichenfolge (z. B. Base64), und protokollieren Sie diese Zeichenfolge als "Nachricht".
Damit können Sie Teile der Datei lesbar halten und nur wichtige Teile verschlüsseln.
Beachten Sie, dass diese Münze eine andere Seite hat: Wenn Sie eine vollständig verschlüsselte Datei erstellen und den Benutzer danach fragen, kann sie nicht wissen, was Sie aus der Datei lernen werden. Daher sollten Sie so wenig wie möglich verschlüsseln (Passwörter, IP-Adressen, Kundendaten), damit die Rechtsabteilung überprüfen kann, welche Daten gerade verlassen werden.
Ein wesentlich besserer Ansatz wäre ein Obfuscator für die Protokolldatei. Das ersetzt bestimmte Muster einfach durch "XXX". Sie können immer noch sehen, was passiert ist und wann Sie ein bestimmtes Datenelement benötigen, können Sie danach fragen.
[EDIT] Diese Geschichte hat mehr Auswirkungen, als Sie auf den ersten Blick denken. Dies bedeutet effektiv, dass ein Benutzer nicht sehen kann, was in der Datei ist. "Benutzer" schließt nicht unbedingt "Cracker" ein. Ein Cracker wird sich auf verschlüsselte Dateien konzentrieren (da sie wahrscheinlich wichtiger sind). Das ist der Grund für das alte Sprichwort: Sobald jemand Zugriff auf die Maschine hat, gibt es keine Möglichkeit, ihn daran zu hindern. Oder um es anders auszudrücken: Nur weil du nicht weißt, wie es nicht heißt, auch jemand anderes nicht. Wenn du denkst, du hast nichts zu verbergen, hast du nicht an dich gedacht.
Außerdem gibt es das Problem der Haftung. Nehmen wir an, einige Daten sind im Internet geleert, nachdem Sie eine Kopie der Protokolle erhalten haben. Da der Benutzer keine Ahnung hat, was in den Protokolldateien steht, wie können Sie vor Gericht beweisen, dass Sie nicht das Leck waren? Chefs könnten um die Log-Dateien bitten, um ihre Bauern zu überwachen, und darum bitten, sie so zu kodieren, dass die Bauern es nicht bemerken und jammern können (oder verklagen, den Abschaum!).
Oder betrachten Sie es aus einem ganz anderen Blickwinkel: Wenn es keine Protokolldatei gäbe, könnte niemand sie missbrauchen. Wie wäre es, das Debugging nur im Notfall zu aktivieren? Ich habe log4j konfiguriert, um die letzten 200 Protokollnachrichten in einem Puffer zu behalten. Wenn ein Fehler protokolliert wird, deponiere ich die 200 Nachrichten in das Protokoll. Begründung: Mir ist es wirklich egal, was während des Tages passiert. Ich kümmere mich nur um Bugs. Mit JMX können Sie die Debug-Ebene einfach auf FEHLER setzen und sie zur Laufzeit aus der Ferne reduzieren, wenn Sie weitere Details benötigen.
Sehr alte Frage und ich bin mir sicher, dass die Tech-Welt große Fortschritte gemacht hat, aber FWIW Bruce Schneier und John Kelsey haben ein Papier geschrieben, wie man das macht: Ссылка
Der Kontext ist nicht nur Sicherheit, sondern verhindert auch die Beschädigung oder Änderung vorhandener Protokolldateidaten, wenn das System, auf dem sich die Protokoll- / Überwachungsdateien befinden, kompromittiert ist.
Für .Net siehe Microsoft Application Blöcke für Protokoll- und Verschlüsselungsfunktionen: Ссылка
Ich würde verschlüsselte Protokolleinträge an eine flache Textdatei anhängen, indem ich eine geeignete Abgrenzung zwischen den einzelnen Einträgen verwende, damit die Entschlüsselung funktioniert.
Ich habe genau das gleiche Bedürfnis wie du. Ein Typ, der 'MaybeWeCouldStealAVa' genannt wurde, schrieb eine gute Implementierung in: Wie man AES verschlüsselt anhängt Datei , die jedoch nicht gespült werden konnte - Sie müssten die Datei bei jedem Leeren einer Nachricht schließen und erneut öffnen, um nichts zu verlieren.
Also habe ich meine eigene Klasse dafür geschrieben:
%Vor%Hier ist ein Beispiel für die Verwendung:
%Vor%Tags und Links logging encryption