Hallo Alexander
... Ich habe die Verschlüsselung nun im QueryClose des Dokuments eingebaut
Dies brauchst du normalerweise nicht, wenn du keine Backend-Saves machst und das Dokument NUR über UI-Save gespeichert wird (allerdings muss das Feld in der Maske existieren)
Das Dokument sollte dann zu keiner Zeit unverschlüsselt sein. Wenn doch, hast du was falsch gemacht. Und QueryClose wird ja auch nicht immer zuverlässig ausgeführt (Clientabsturz), ausserdem würde das Dok bis zum Schließen immer noch unverschlüsselt in der DB liegen.
Das ist ja echt eine riesige Schei .... Wenn ich mir überlege, an wie vielen Stellen ich in der Anwendung im BackEnd auf die Dokumente zugreife, stellt das ein echtes Problem mit der automatischen Entschlüsselung dar.
Du sagst es...
Ich habe mir nun gedacht, dass ich einfach einen periodischen Server Agenten baue, der alle 5 Minuten die Verschlüsselungen wieder gerade zieht, das geht ja aber auch nicht, da dieser ja im Besitz der persönlichen Schlüssel sein muss. Also bleibt offensichtlich nichts anderes übrig, als tatsächlich alle Routinen noch einmal durchzuschauen und die Verschlüsselung zu checken und sofern erforderlich neu zu setzen. Sehr ärgerlich!!!
Und ehrlich gesagt.... unsicher. Wer garantiert dir, dass während der 5 min keiner das Dokument abgreift. Außerdem wird das Dokument dann zusätzlich mit
der ID des Servers verschlüsselt und kann auch von diesem wieder entschlüsselt werden. (Bzw. von einem Admin, der Zugriff auf den Server hat)
Und es ist ja gerade der Sinn der Verschlüsselung, dass ich im Notessystem Dokumente ablegen kann, auf welche Admins usw. keinen Zugriff haben und sich diesen auch nicht verschaffen können. (OK er könnte ein ID-File wiederherstellen, aber auch das kann man mit einem Mehraugenprinzip absichern)
Wir protokollieren in unseren Anwendungen dies sogar als Sicherheitsrisiko, wenn der Server auf verschlüsselte Dokumente zugreifen kann.
Gibt's vielleicht noch einen anderen Weg ursprünglich verschlüsselte Dokumente auch weiter verschlüsselt zu halten, nachdem per Skript darauf zugegriffen wurde?
Mit Standard-Lotusscript => Nein. Ich habe mal versucht, mit Hilfe der C-API die Felder auszulesen und in ein NotesDokument-Object zu kopieren, so dass man mit Lotusscript weiterarbeiten könnte, das hat mehr schlecht als recht funktioniert.
Wir hatten das Glück, dass bei unserem Framework alle SAVE-Aufrufe über eine zentrale Stelle laufen, an der wir relativ einfach sicher stellen können, dass verschlüsselte Dokumente verschlüsselt bleiben
Den Sonderfall, dass man nicht alle Schlüssel hat, haben wir dann so abgedeckt, dass wir die Werte mit @SetDocField schreiben.
Über das $Seal-Feld lässt sich schnell erkennen ob das Dokument verschlüsselt ist (vorhanden = verschlüsselt).
Das ist eine sehr gute Idee, haben wir ähnlich gemacht, Wenn Keys gesetzt sind und kein $Seal vorhanden ist, dann stimmt da was nicht.
Auf @isAvailable($Seal) kann man leider nicht in der Ansicht zugreifen, da dies kein Summary Flag hat....
Inzwischen weiß ich aber, dass man das Vorhandensein eines Items (egal ob summary oder nicht) mit @ToLowerCase(@DocFields)="$seal" überprüfen kann.
Die Select-Formel
SELECT (PublicEncryptionKeys != "" | SecretEncryptionKeys !="") & !( @ToLowerCase(@DocFields)="$seal" )
müsste dir sofort alle falsch verschlüsselten Dokumente anzeigen.
Noch ein Hinweis: Der Inhalt der Felder "PublicEncryptionKeys" und "SecretEncryptionKeys" ist nur zum Zeitpunkt der Verschlüsselung relevant und kann nachträglich beliebig geändert werden (wenn da z.B. drin steht, dass das Dok mit dem und dem Schlüssel verschlüsselt wurde, muss das nicht unbedingt stimmen)
Warum nutzt du das Feld SecretEncryptionKeys? Wäre nicht PublicEncryptionKeys besser geeignet? Ich habe das immer so verstanden, bitte korrigiert mich wenn ich falsch liege:
Willst du einfach mit der ID des Users verschlüsseln benutzt du PublicEncryptionKeys und trägst dort den Usernamen ein.
Hast du einen extra Verschlüsselungsschlüssel selbst erstellt, verteilst du diesen an die Personen die ihn benötigen (z.B. ein Schlüssel für die Personalabteilung um Gehaltsfelder einsehen zu können). Diesen Schlüsselnamen trägst du in SecretEncryptionKeys ein. Dieser Schlüssel muss immer in die Benutzer-ID importiert werden.
SecretEncryptionKeys ist meist schon die flexiblere Lösung. Die Mitarbeiter der Personalabteilung ändern sich. Dann muss nur der Schlüssel weitergegeben werden. Andernfalls müsste man die Dokumente alle neu verschlüsseln.
Aber auch bei PublicEncryptionKeys läuft man Gefahr, dass man das Dok zwar ent- aber nicht mehr verschlüsseln kann. Und zwar dann, wenn einer der darin gelisteten Mitarbeiter ausgeschieden ist und der öffentliche Schlüssel nicht mehr im Adressbuch exisitiert.
Die Notes-Verschlüsselung halte ich zwar für sehr sicher, man muss aber höllisch aufpassen, dass man sie durch falsch programmierten Anwendungscode nicht untergräbt.
(Weil man die schei... automatische Entschlüsselung nicht abschalten kann)
Gruß
Roland