Domino 9 und frühere Versionen > ND9: Entwicklung

Verschlüsseltes Feld PublicEncryptionKeys im Backend aktualisieren

(1/3) > >>

Legolas:
Hallo Forum,

trotz langer Recherche bin ich nicht weitergekommen. Ich hoffe, Ihr könnt helfen.
Es geht um verschlüsselte Felder in einem Notes-Dokument.

Folgende Situation:
Eine Anwendung beinhaltet Dokumente in den das Body-Feld (und nur dieses) verschlüsselt abgelegt wurde (Text + Attachments).
Bisher wurden die zugriffsberechtigten User vom Ersteller des Dokuments manuell eingetragen (Autoren und Leserfeld).
Das hat auch soweit funktioniert.

Feld: PublicEncryptionKeys
Das Feld enthält alle User (Autoren und Leser) des Dokuments. Die Namen der einzelnen User und der aufgelösten Gruppen sind hierarchisch als Liste in diesem Feld hinterlegt. Zudem wird immer als Notanker der „SuperAdmin“ User in das Autoren- und PublicEncryptionKeys mit eingetragen.

Feld: $SealData existiert nach dem Speichern aus dem UI.
 
Ziel:
Die Anwendung soll soweit erweitert werden, dass die Berechtigungen im Backend via periodischem Agenten neu gerechnet werden können.
Wenn sich z.B. die Mitglieder einer Gruppe ändern.


Problem:
Löse ich im Backend z.B. eine geänderte Gruppe auf und trage die User in das Autoren-  und in das PublicEncryptionKeys Feld ein.

Wird vor dem Speichern der Befehl Call doc.encrypt() aufgerufen erhalte ich einen Fehler.
Wird ohne den Befehl Call doc.encrypt() gespeichert, erhalte ich keinen Fehler.

Bei der Prüfung der Felder sind dann die neuen User auch korrekt eingetragen.
Nur wenn ich mit dem neuen User (der über die Gruppe hinzukam) das Dokument öffne, bekomme ich die Fehlermeldung.
Ich benötige den Dekodierungsschlüssel zum Bearbeiten/Lesen des Feldes.

Der Agent wurde im Namen des „SuperAdmin“ gestartet und auch mit der Signatur des Server.
- Der Agent hat die Sicherheitsstufe 3 (Bechränkte Operationen mit vollst. Admin Rechten zulassen)
- Der Server ist zudem noch als Autor und im Feld PublicEncryptionKeys eingetragen.

Aus der Noteshilfe:

--- Zitat ---If the script is running on a server, it must have permission to use Encrypt. If the script is part of a scheduled agent running in the background on a server, and the EncryptionKeys property is set with one or more named keys, the server's ID must contain those keys, not the signer of the agent. The agent must also have a runtime security level of at least "Allow restricted operations".
--- Ende Zitat ---

Was ist hier mit der Zeile genau gemeint?
--- Zitat --- the server's ID must contain those keys
--- Ende Zitat ---


Beim Speichern prüfe ich unter anderem folgendes:

Was muss beim Speichern beachtet werden?

- Muss das $SealData  Feld gelöscht werden?
- Müssen evtl. ander Felder gelöscht werden?

Falls nein, sollte der folgende Code doch funktionieren:


--- Code: ---
Call doc.encrypt() 'Dokument/Felder verschlüsseln
Call doc.save(True, False)

--- Ende Code ---


Was mach ich falsch?
Kann mir jemand einen Tipp geben?

Grüße
Bernd



umi:

--- Zitat ---the server's ID must contain those keys

--- Ende Zitat ---

Damit die Verschlüsselung funktioniert, brauchen die Benutzer ja einen oder mehrere gemeinsame Schlüssel in ihrem ID File, mit welchem das Dokument bzw. die Felder verschlüsselt werden.
Jeder der diesen Schlüssel hat, kann prinzipiell das Dokument/Felder lesen/bearbeiten

Damit ein Server Agent das Dokument auch verschlüsselt speichern kann, benötigt der Server auch Zugriff auf den gemeinsamen Schlüssel. Ergo muss dieser Schlüssel in der Server.id sein.

Legolas:
Hallo Umi,

ich verwende aber das Feld PublicEncryptionKeys.
Nach meinem Verständnis wird in diesem Feld der öffentliche Schlüssel der User hinterlegt, die Zugriff auf das verschlüsselte Feld haben sollen.
Wenn ein User nun das Dokument öffnet, wird mit seinem privaten Schlüssel das Feld entschlüsselt.

Im Gegensatz zum geheimen Schlüssel, der den Usern mitgeteilt und in der User-ID gespeichert werden muss und im Feld SecretEncryptionKeys abgelegt wird.
So wie ich dich verstehe, bezieht sich deine Anmerkung auf das SecretEncryptionKeys Feld.

Oder verstehe ich dich falsch?

Grüße
Bernd


m3:
Aus https://www.ibm.com/support/knowledgecenter/en/SSVRGU_8.5.3/com.ibm.designer.domino.main.doc/H_DOCUMENT_AND_FIELD_ENCRYPTION_OVERVIEW.html
You can encrypt documents with keys in several ways:

* ...
* Using the SecretEncryptionKeys field. The SecretEncryptionKeys field can contain either the name of a key, which is automatically used to encrypt documents, or the field can be blank, allowing users to assign the encryption key. To encrypt a field with a secret key using either method, users must have it stored in their ID file.
Aber:
Public key encryption in non-mailed documents

--- Zitat ---Basically, if you ONLY have a PublicEncryptionKeys field set, then the backend .encrypt method doesn't recognize it. However, if you have ANY valid SecretEncryptionKeys value, then the PublicEncryptionKeys is also recognized and used.

This provides a workaround in situations where you're encrypting is done centrally -- say if a server ID is encrypting material targetted for users. You simply have to put a shared encryption key on that ID that you don't give to anyone else. Then you can do the following...

doc.encryptionKeys = "[your shared key]"
doc.publicEncryptionKeys = "[target user list]"
Call doc.encrypt
Call doc.removeItem("sharedEncryptionKeys")
Call doc.save (whatever)
--- Ende Zitat ---
http://www-10.lotus.com/ldd/nd6forum.nsf/DateAllFlatweb/29c9f3df1a27f27e85256f50002282dc?OpenDocument

Legolas:
Hallo m3,

ich komme leider nicht weiter.

Ich bin mir nicht sicher ob ich das hier korrekt verstehe.

1) Muss für diesen Workaround jeder User den SecretKey besitzen?
Falls ja, was für einen Mehrwert hat dann noch der publicEncryptionKey?
Dann ist die Funktion aber nicht praktikabel, da alle User mit dem SecretEncryptionKey ausgestattet werden müssten.

Falls nein, weiterlesen:

In einem Dokument gibt es ein RT-Feld welches verschlüsselt werden soll (Feldmarkierung wird in rot angezeigt).
Ich habe ein Dokument erstellt mit einer Gruppe von 2 Usern und mein eigenen Namen.
Die drei Namen habe ich (Abbriviated) in das Feld doc.publicEncryptionKeys als Array geschrieben und das Dokument gespeichert.
Zudem habe ich in das Feld: doc.encryptionKeys den Namen des SecretKeys geschrieben. Dieser Key ist auch in meiner ID hinterlegt.

Dokument dann gespeichert und geschlossen.

Nun erweitere ich im DD die Gruppe auf drei User.
Im Anschluss starte ich den Backendagenten (mit runonserver) der mir die Gruppe auflöst in die einzelnen Namen und diese wieder in das Feld doc.publicEncryptionKeys schreibt.
Allerdings wird der Dominoserver beim Befehl doc.encrypt dann immer die Fehlermeldung:


--- Code: ---Notes error: You don't have any of the specified encryption keys (4000) in line: 34
--- Ende Code ---

Diese Fehlermeldung sagt mir ja, dass ich den benötigen SecretKey nicht besitzen würde.
Der SecretKey ist aber in meiner ID hinterlegt.

Nun habe ich versucht, den Agenten in meinem Namen und im Namen des Server laufen zu lassen. Beides mal mit der gleichen Fehlermeldung.

Was mach ich falsch?


Noch ein Verständnisproblem:
Im Code der als Workaround dienen soll, wird das Feld „sharedEncryptionKeys“ gelöscht. Muss das nicht das Feld „SecredEncryptionKey“ sein?


--- Code: ---doc.encryptionKeys = "[your shared key]"
doc.publicEncryptionKeys = "[target user list]"
Call doc.encrypt
Call doc.removeItem("sharedEncryptionKeys")
Call doc.save (whatever)
--- Ende Code ---


Grüße
Bernd



Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln