In diesem Artikel soll gezeigt werden, wie Sie auf einfache Weise Dokumente transparent signieren und überprüfen können.
Der offensichtliche Vorteil dieses Ansatzes besteht darin, dass Sie beim erneuten Öffnen der Dokumente sicher sein können, dass sie in der Zwischenzeit nicht verändert wurden.
Dies ist besonders wichtig, wenn Sie 4D Write Pro Dokumente als Smart Templates mit 4D Code als externe Dateien auf der Festplatte speichern. Bevor Sie diesen Code ausführen, möchten Sie sicherstellen, dass die Datei nicht von außen verändert wurde.
Oder, im Falle von externen Dokumenten, um sicher zu sein, dass sie vom richtigen Absender stammen und auf ihrem digitalen Weg nicht verändert worden sind.
Das hier beschriebene Prinzip gilt für 4D Write Pro Dokumente, lässt sich aber mit ein paar kleinen Änderungen auch auf jede andere Art von Dokument anwenden.
Beispiel einer Datenbank
Verschlüsselung oder Signatur?
Wir werden uns hier auf die Authentifizierung eines Dokuments konzentrieren, d. h. wie man sicher sein kann, dass es zwischen dem Zeitpunkt, an dem es von seinem ursprünglichen Eigentümer (rechtlich/amtlich/etc.) registriert wurde, und dem Zeitpunkt, an dem es von seinem Empfänger gelesen wird (oder von seinem Eigentümer erneut gelesen wird!), nicht verändert worden ist. Wir sprechen hier nicht von Verschlüsselung, obwohl auch das möglich ist, aber das ist ein anderes Thema! (Wenn Sie an Kryptographie interessiert sind, lesen Sie bitte diesen BLOG)
Erstellen einer Signatur.
Die Erstellung einer Signatur ist recht einfach: Aus dem Originaldokument wird mit Hilfe eines „privaten“ Schlüssels eine Signatur auf der Grundlage des gesamten Dokuments (als BLOB) erstellt. Diese Signatur (und nur diese) wird im Dokument selbst gespeichert, normalerweise am Ende des Dokuments.
Erneutes Lesen der Signatur
Vor dem Öffnen des Dokuments wird die offizielle Signatur erneut gelesen. Aus dem gesamten Dokument wird ein neues BLOB erstellt (ohne den Endschlüssel, also theoretisch identisch mit dem Original), das diesmal mit einem öffentlichen Schlüssel verifiziert wird, der eng mit dem privaten Schlüssel verbunden ist, der zur Erstellung der Signatur verwendet wurde. Das Ergebnis dieser Überprüfung bestimmt, wie es weitergeht!
In diesem Stadium gibt es drei Möglichkeiten…
Wir sind davon ausgegangen, dass das Dokument signiert ist, aber das ist nicht unbedingt der Fall. Wenn das Dokument keine Signatur enthält, ist Vorsicht geboten, auch wenn es nicht unbedingt beschädigt ist.
Ob das Dokument geöffnet wird oder nicht, hängt vom Entwickler, vom Benutzer, von den Umständen, von der Umgebung ab… Kurz gesagt, Sie müssen entscheiden, was zu tun ist!
Die zweite Möglichkeit ist, dass die Signatur mit dem Inhalt übereinstimmt. Das ist eine gute Nachricht. Sie können sicher sein, dass es sich um das Dokument handelt, das Sie erstellt haben oder das Ihnen anvertraut/geschickt/etc. wurde, und vor allem, dass es seit seiner Erstellung nicht verändert worden ist. Das bedeutet, dass Sie es in aller Ruhe öffnen können, vorausgesetzt, Sie vertrauen dem Absender. Es steht Ihnen dann frei, sie zu ändern, zu speichern, erneut zu unterschreiben oder nicht, je nach ihrer künftigen Verwendung. Wenn Sie es ändern und dann an den Absender zurückschicken müssen, ist es ratsam, es selbst zu unterschreiben, damit der künftige Empfänger den gleichen Vorgang durchführen kann.
Die dritte Möglichkeit ist, dass das Dokument während der Übertragung verändert (oder sogar beschädigt) wurde. Das kleinste hinzugefügte oder entfernte Komma, die kleinste geänderte Formel usw. kann dazu führen, dass die Unterschrift nicht mehr stimmt!
Sie werden es sofort wissen, damit Sie die entsprechenden Maßnahmen ergreifen können.
Fangen wir an!
In diesem Beispiel werden wir eine oder mehrere Dateien signieren, die bereits im 4D Write Pro Format gespeichert sind, d.h. mit der Endung „4wp“. Da wir Dateien verwalten werden, verwenden wir die Klassen 4D.File und 4D.FileHandle. Und da wir Verschlüsselungs-, Signatur- und Verifizierungsschlüssel verwalten werden, verwenden wir auch 4D.CryptoKey (siehe den entsprechenden BLOG, falls Sie mit diesen Klassen noch nicht vertraut sind…).
SAFE Standard-Schlüssel erstellen
Zunächst erstellen wir ein Paar privater/öffentlicher Schlüssel und speichern sie ein für alle Mal als Entität in der Datenbank (dieses Schlüsselpaar wird später als Beispiel für die „Standardschlüssel“ verwendet).
$cryptoKey:=ds.CryptoKey.new()
$keyOptions:={type: "RSA"; size: 2048}
$key:=4D.CryptoKey.new($keyOptions)
$cryptoKey.privateKey:=$key.getPrivateKey()
$cryptoKey.publicKey:=$key.getPublicKey()
$cryptoKey.save()
SAFE Sign Dokument
Als nächstes müssen Sie am Ende einer Datei (4D.File) eine Signatur mit einem privaten Schlüssel hinzufügen.
Zusammengefasst müssen Sie Folgendes tun:
// create a new key based on private key
$keyOptions:={type: "PEM"; pem: $privateKey}
$key:=4D.CryptoKey.new($keyOptions)
//…
// create the signature with the .sign() function
$signOptions:={hash: "SHA512"; encodingEncrypted: "Base64URL"}
$signature:=$key.sign($documentAsBlob; $signOptions)
// append signature (as a BLOB) at the end of the document
TEXT TO BLOB($signature; $blobSignature; UTF8 text without length)
$fileHandle.offset:=$documentSize
$fileHandle.writeBlob($blobSignature)
SAFE Check Signatur
Bevor Sie das Dokument öffnen, müssen Sie seine Signatur überprüfen. Dies geschieht mit der folgenden Methode, der eine Datei (4D.File) und optional ein öffentlicher Schlüssel übergeben wird
// create a new key based on public key
$signOptions:={hash: "SHA512"; encodingEncrypted: "Base64URL"}
$type:={Type; "PEM"; pem; $publicKey}
$key:=4D.CryptoKey.new($type)
// read the real signature
//…
$fileHandle.offset:=$documentSize-$length
$blobSignature:=$fileHandle.readBlob($length)
$textSignature:=BLOB to text($blobSignature; UTF8 text without length)
// check the signature using the .verify() function
$check:=$key.verify($documentAsBlob; $signature; $signOptions)
If ($check.success)
$result:=1
Else
$result:=-1
End if
Dies funktioniert mit .4wp, aber was ist mit anderen Dokumenten?
Wenn 4D Write Pro ein .4wp Dokument lädt, wird das Ende des Dokuments automatisch erkannt, so dass Sie wissen, wo Sie aufhören müssen. Die am Ende der Datei hinzugefügte Signatur unterbricht das Dokument nicht. Mit anderen Worten: Egal, ob das Dokument signiert ist oder nicht, ob die Signatur korrekt ist oder nicht, das .4wp-Dokument wird problemlos geladen, so dass eine vorherige Überprüfung der Signatur nicht erforderlich ist.
Bei anderen Dokumenttypen ist es möglich (sogar wahrscheinlich), dass das Hinzufügen einer Signatur am Ende das Laden stört, so dass es notwendig sein kann, die Signatur – natürlich nach einer Überprüfung – zu entfernen.
SAFE Dokument unsignieren
Aus diesem Grund wurde diese andere Methode geschaffen, um den umgekehrten Vorgang durchzuführen.
Sie entfernt die Signatur aus einem Dokument, um den ursprünglichen Zustand wiederherzustellen, und wenn das Dokument nicht signiert ist, tut sie einfach nichts.
$fileHandle:=$file.open("write")
//… calculate signature length then…
$fileHandle.setSize($documentSize-$length)
Schlussfolgerung
Dieses einfache Beispiel zeigt, wie man ein Dokument signiert und die Signatur überprüft, bevor man es öffnet. Beim Austausch von Dokumenten zwischen zwei Standorten sind zwei Paare von öffentlichen/privaten Schlüsseln erforderlich, aber das Prinzip bleibt das gleiche. Der Ersteller des Dokuments signiert mit einem privaten Schlüssel, und der Leser verifiziert ihn mit dem öffentlichen Schlüssel des Erstellers.
Der öffentliche und der private Schlüssel sind ein wertvolles Gut, das sowohl die Unterzeichnung als auch die Authentifizierung ermöglicht, weshalb es ratsam ist, sie in der Datendatei selbst zu speichern!