GnuPG- bzw. PGP-Verschlüsselung im Kontaktformular verwenden?

von Oliver Richter (Kommentare: 0)

Inspiriert durch den Artikel unter https://www.privacy-handbuch.de/handbuch_32v.htm (vielen Dank an die Autoren dort) habe ich mir mal die JavaScript-Implementierung von OpenPGP (siehe http://openpgpjs.org) angesehen und eine kleine JavaScript-Klasse für das Standard-Contao-Kontaktformular geschrieben. Diese erweitert, sofern technisch möglich (je nach Browser und Einstellungen), das Kontaktformular so, dass die Daten im Nachrichten-Eingabefeld vor dem Versenden mit einem öffentlichen GnuPG-Schlüssel für eine E-Mailadresse verschlüsselt werden (siehe Bild 1).
Sollten die technischen Voraussetzungen nicht erfüllt sein, wird das Standard-Kontaktformular angezeigt (siehe Bild 2) und keine Verschlüsselung angewendet.

Die Nachteile dieser Umsetzung sind schon im Ausgangsartikel (siehe oben) ausreichend beschrieben. Hier zu nennen ist vor allem, die (zur Zeit - Juni 2015) nicht vollständige Browserunterstützung (z.B. Internet Explorer) und die Notwendigkeit einer entsprechenden Browsereinstellung (aktiviertes Javascript, erlaubte Cookies, etc.). Denn andernfalls wird die Verschlüsselung gar nicht erst durchgeführt. Zudem bin ich mir nicht sicher, ob tatsächlich auch in allen Geräten/Browsern qualitativ ausreichend gute Zufallszahlen in annehmbarer Zeit zur sicheren Verschlüsselung erzeugt werden können. Und natürlich ersetzt das alles auch nicht den Einsatz von sicheren SSL/TLS-Verbindungen für Web und Mail für die gesamte Kommunikation zwischen Webseite und Besucher. Aber ich denke, in Zeiten, wo der unverschlüsselte E-Mailversand leider eher normal ist und sensible Daten wie Zugangsdaten oder persönliche Daten viel zu oft unverschlüsselt kommuniziert werden, lohnt es sich, wenigstens partiell eine verschlüsselte Kommunikation zu ermöglichen.

Hier noch mal die Zusammenfassung:

Vorteile

  • Sofern, technisch gesehen, die Verschlüsselung ordentlich erfolgen kann, wird die Nachricht bereits auf dem Gerät des Besuchers verschlüsselt und kann erst wieder auf dem Gerät des Empfängers entschlüsselt werden.
  • Es kann hier auf das bewährte PGP/GnuPG-Verschlüsselungsverfahren zurück gegriffen werden.
  • Der Besucher des Kontaktformulars muss sich erst mal nicht mit Verschlüsselung oder dem Verfahren auseinander setzen, sondern schreibt, wie gewohnt, seine Nachricht über das Kontaktformular der Webseite.
  • Viele aktuelle Browser (inkl. Smartphones) unterstützen bereits die Implementierung von http://openpgpjs.org.

Nachteile

  • Die Verschlüsselung kann nicht immer erfolgen, sondern benötigt bestimmte technische Voraussetzungen. Unter Umständen wird gar nicht verschlüsselt und Sicherheit suggeriert.
  • In der aktuellen Umsetzung werden sämtliche Meta-Daten (insbesondere die E-Mailadresse) unverschlüsselt übertragen.
  • Fraglich ist (mir persönlich), ob die Generierung der Zufallszahlen im Browser zur Verschlüsselung ausreichend hochwertig und nicht vielleicht nachvollziehbar ist.
  • Der Nachrichten-Teil des Formulars muss in jedem Fall vor dem Versenden an den Server verschlüsselt werden und kann dann erst mal nicht wieder entschlüsselt werden. Bei Verwendung eines Captchas und/oder einem E-Mailadressfeld, wenn also weitere Eingaben im Formular ausgewertet werden und wie beim Captcha erst auf dem Server verarbeitet/geprüft werden können, liegt der Inhalt des Nachrichtenfeldes, z.B. bei einer fehlerhaften Eingabe im Captcha-Feld, stets nur noch verschlüsselt vor. Der Besucher des Kontaktformulars kann die Daten dann also nicht mehr ändern, zumindest nicht in meiner aktuellen (20.06.2015) Umsetzung, da die Daten, meiner Auffassung nach, nirgendwo im Browser zwischengespeichert werden sollten.
  • Der gesamte so wichtige Workflow für die Signierung, sowie das Überprüfen des Vertrauens bzw. der Glaubwürdigkeit des Schlüssels wird hier nicht ermöglicht und somit ein wichtiger Aspekt der Public-Key-Verschlüsselung umgangen.

Installation

  1. Contao-Kontaktformular mit E-Mailadresse (Feldname mail), ggf. Captcha-Feld und Nachrichten-Feld (Feldname message) und dem Absenden-Feld anlegen. Im Nachrichtenfeld sollten alle Sonderzeichen erlaubt sein (das ist leider oft eine Fehlerquelle).
    Dem Formular in den Einstellungen als ID und CSS-Klasse (beides) secform vergeben, als Datenformat E-Mail wählen und als Empfänger-Adresse die E-Mailadresse des zugehörigen hier verwendeten öffentlichen GnuPG-Schlüssels angeben. Es muss also bereits ein Schlüsselpaar vorhanden sein für die verwendete E-Mailadresse. Das Formular-Markup sollte minimal etwa folgende Grundstruktur aufweisen (auf den <pre>-Tag wird im Punkt 2 eingegangen):
<form ... id="secform" class="secform">

 <label for="TEXTAREA-ID">Ihre Nachricht</label>
 <textarea name="message" class="message" id="TEXTAREA-ID"></textarea>

 <label for="EMAILINPUT-ID">Ihre E-Mailadresse</label> 
 <input name="email" type="email" id="EMAILINPUT-ID">

 <input type="submit" />

 <pre id="secformkey" class="hidden">GNUPG-KEY</pre>

</form>
  1. Im Formular ein Element vom Typ HTML einfügen mit dem öffentlichen GnuPG-Schlüssel als Inhalt. Dort bitte nur die Schlüssel-Zeichenkette ohne zusätzliche Zeichen direkt zwischen den Tags <pre> und </pre> platzieren. Der <pre>-Tag muss die ID secformkey erhalten. Das Ganze könnte beispielsweise so aussehen (optional setzen Sie noch die CSS-Klasse invisible für den <pre>-Tag, um die Anzeige des Schlüssels zu verstecken): 
<pre id="secformkey" class="hidden">
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (MingW32)

mQGNBFPbSx0BDAChAL2tGYPp2Mmy2ehQEdPn0SetoOaZWE4oYFYNDA6VRVwV4GoY
8V/y/br5XVW/x1+o4C96jqE2MaGt8Olg/MlTLHmdsBzu/a2eDlxVrQb0wrOJa8AJ
ULIC3U82s7Ayp64eRMEchw54MZoqSD9eLi93jueMacm4dP64jJqeu8M3wEfTnjHz
6+apqlhvTSBKUKBCrGJgk5FXjgPDlNtUwIJUfQWgV3hMY0iejiNsFB9zzZkmJ/Sm
Bs2mq1yYVtQj6NBn6NfYE/2dr2TIDiGPqiZo2+eYBLQtc2oO32O71o7U7JyAaxzp
O2zlCJk5C6Dix7yzHALAUaV2xd1vn9ocPS/z+UXOMN7aYAL3aznd8Zj+zQUTBR81
2cZl23wLJIrOUvXhut+2G03u18x4J5eQ5LijYR49JJ5y4IjJzsA5eLZKr14Dxa3d
JEftHYGuEqMvIQB/Z8P5UTqCf6sQi9Gu6QEy4rHMxRtt+5ogFGL9TofQzsEXGRJY
2wd8W3GnYGX/f4kAEQEAAbQtT2xpdmVyIFJpY2h0ZXIgPGluZm9AZ3J1ZW5maXNj
aC13ZWJkZXNpZ24uZGU+iQG5BBMBAgAjBQJT20sdAhsvBwsJCAcDAgEGFQgCCQoL
BBYCAwECHgECF4AACgkQ+QcgXOVJBKHNqwv+LhvDUBLICcHygBFruxowwmpa2hZl
pjETkchy59nVc0Bq3yICDkiwnr20BnWMxpGgL+poJKR6sAKiMZi/mfVW5Fs660j9
6a59YbFQJlHDhlJvZhnWlMEClfo6QDwYaNGAs4MXwY6dyRfaJ+AXzvzDFpALcMun
rSMBLdGECyK6OyQM7wHBHODvxj1mnOvgv8KEmMy41EqmcOI5cqhj5HBk31MNi4TY
JPPPfLq8iA0sjhD7Q0Z2dAhNQsz2vpjyJXEOD/tTmtZSxu5MuLSJFrMD/STbCVBV
M2lYSx0pDLhS0Ux/bcQs8/eu+vAOaxnhemnELb27O+zRM1Lmamh+Qeo0tTNmTzay
K6nOqPptOJJU/bsmPK9Nr00XM9f7zeXRo3hPU2jIdHT74qXJ53zXjs1l3UgFghxc
Kho8cNr8GuUbcgT0cvEBqkJiScVUYUKIiRn60j4Sc2MkL6l5gz32XowpnyEiqYMf
26Y6PEAgZGpH8uvR+l5QBebxLbSvUxcz5djf
=iDoo
-----END PGP PUBLIC KEY BLOCK-----
</pre>
  1. Für die Kontaktformular-Seite und die Weiterleitungsseite dieses Kontaktformulars (also die Seite, die nach dem erfolgreichen Senden des Formulars aufgerufen wird) bitte das JQuery-Framework im Theme einbinden, sowie die Dateien "openpgp.min.js", "jquery.cookie.js" und "jquery.secform.js" und anschließend (als letztes) den folgenden JavaScriptCode zum Initialisieren der Funktionalitäten (sollten Sie nicht Contao verwenden, binden Sie bitte diese 3 Dateien und das folgende Script auf den Seiten ein):
jQuery(document).ready(function () 
	{
		var encryptedForm1 = new encryptedForm.init({
			// define your options here:  
            
            // formID: 'form#secform', 
            // keyContainer: "#secformkey"
            // and so on...
		});
	});

Welche Optionen Sie verwenden können, können Sie in meiner Dokumentation zum Skript auf GitHub nachlesen.

  1. Passen Sie zuletzt (das ist also optional) die CSS entsprechend an. Sofern die technischen Voraussetzungen für die Verwendung der Verschlüsselung im Browser erfüllt zu sein scheinen, wird dem Formular die CSS-Klasse secform-on zugewiesen. Sie können also z.B. über den Selector form.secform-on das Formular und seine Unterelemente entsprechend anpassen (siehe meine Beispielgrafiken ganz oben) und den Schlüssel und ggf. weitere Hinweise zur Verschlüsselung ein- oder ausblenden. Verwenden Sie beispielsweise: 
/* Hier Standard-Styles für das Formular definieren */
form.secform { }

/* Styles für den Fall, dass Verschlüsselungsoption verfügbar ist definieren */
form.secform-on { }

/* Ein- und Ausblenden des Keys und der Hinweismeldungen */ 
form.secform .hidden { display: none }
form.secform-on .hidden { display: block }

/* Styles fuer das bereits verschluesselte Textarea hier definieren: */ 
form.secform-on textarea[name='message'].encrypted { background: #f8fff3; }

Die vollständige und auch aktuelle Version der JavaScript-Klasse jquery.secform.js und eine minimalistische Dokumentation finden Sie auf GitHub. 

Ich freue mich über Hinweise und Kritiken. 

Lizenz

Creative Commons Lizenzvertrag
Dieses Werk bzw. Inhalt (jquery.secform.js) steht unter einer Creative Commons Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0 Deutschland Lizenz .

Bitte beachten Sie auch die Rechte der Entwickler bzw. die Lizenzen der Dokumente jquery.cookie.js und openpgp.min.js, deren Inhaber ich nicht bin. Vielen Dank an die Entwickler dort!

Zurück

Einen Kommentar schreiben

Bachten Sie: Für die Zuordnung Ihrer Nachricht werden die hier anzugebenden Daten Name, E-Mailadresse, Ihr Kommentar gespeichert. Sofern Sie den Wunsch der E-Mail-Benachrichtigung angegeben haben, wird aufgrund technischer Notwendigkeit auch dieser Wert gespeichert. Durch Absenden des Formulars erklären Sie sich damit einverstanden. Alternativ kontaktieren Sie mich bitte über meine E-Mailadresse oder Telefon.
Detaillierte und weitere Hinweise, insb. zum Widerrufsrecht finden Sie in der Datenschutzerklärung.

Sie befinden Sich in der Detailansicht eines Blog-Eintrags.

Um alle Blog-Einträge zu sehen, wechseln Sie bitte zur Nachrichten-Übersicht

Wie kann ich Ihnen helfen?

Sie erreichen mich über mein Kontaktformular