Privacy Handbuch

Dass Metadaten (z.B. Absender und Empfänger einer E-Mail) für die Überwachung eine Rolle spielen, ist seit den Veröffentlichungen von Snowden allgmemein bekannt. Leser des Privacy-Handbuches haben es evtl. vorher gewusst (siehe: Kommunikationsanalyse).

Kontaktformulare bieten eine Möglichkeit, diese Metadaten zu verschleiern. Wer ein Blog oder eine Webseite betreibt, kann recht einfach ein Kontaktformular zur Verfügung stellen. Es gibt Wordpress Plug-ins für Kontaktformulare, einfache PHP-Scripte oder fertige Perl-CGI Scripte. Man kann eine individuell passende Lösung wählen. Dabei sollte man auf folgendes achten:
  1. Das Kontaktformular sollte den Absender nicht zur Eingabe seiner E-Mail Adresse zwingen. Als work-around kann man im HTML-Code des Formulares das Feld für die Absender E-Mail Adresse als "hidden" deklarieren und einen Standardwert setzen.
  2. Das Script sollte die IP-Adresse des Absenders nicht in den Header der E-Mail einfügen. (Einige Scripte für Kontaktformulare wollen damit den Spam-Schutz verbessern.)
  3. Das Kontaktformular sollte immer via HTTPS (SSL-verschlüsselt) aufgerufen werden. Wenn die Webseite auch via plain HTTP erreichbar ist, sollten alle Links auf der Webseite zum Kontaktformular mit der vollständigen URL angegeben werden: <a href="https://www.server.tld/kontakt.html">Kontakt</a> Jeder gute Webhoster bietet inzwischen SSL-Verschlüsselung für einen kleinen Auf­preis für alle Kunden, Wordpress.com hat es standardmäßig für alle Kunden aktiviert.

Im folgenden werden einige Möglichkeiten vorgestellt, wie man ein Kontaktformular mit OpenPGP-Verschlüsselung aufmotzen könnte.

Hinweis: Bei allen Varianten handelt es sich um "server based crypto", die nicht die gleiche Sicherheit wie richtige Ende-zu-Ende Verschlüsselung gewährleisten kann.

1: Ganz einfach ohne Programmierung

Man kann einen guten E-Mail Provider nutzen, der TLS-Verschlüsselung für eingehende E-Mails erzwingen kann und ein verschlüsseltes Postfach bietet (bisher kenne ich nur Mailbox.org als einzigen Provider, der diese Anforderungen erfüllt).

Vom Browser des Absenders wird die Nachricht SSL-verschlüsselt zum Webserver über­tragen. Von dort wird sie über eine TLS-verschlüsselte Verbindung an Mailbox.org gesendet und auf dem Mailserver mit OpenPGP verschlüsselt.

Diese Variante schützt den Inhalt der Nachrichten gegen den allgemeinen Überwachungs­wahn und bei Beschlagnahmung von Daten. Sie schützt nicht gegen eine TKÜ nach §100 a/b StPO beim Hoster des Kontaktformulars oder beim E-Mail Provider, da der Inhalt als Plain-Text an diesen Stellen mitgelesen werden kann.

2: Mit Javascript im Browser des Absenders

Diese Variante erfordert HTML-Kenntnisse, um einige Anpassungen im HTML-Code des Kontaktformulars vorzunehmen und die Bibliothek OpenPGPjs einzubinden.
  1. Die aktuelle Version der Bibliothek "openpgp.min.js" findet man auf github.com im Projekt OpenPGPjs. Man kann den Code auschecken und die Javascript Bibliothek aus dem Verzeichnis "dist" auf den Websever kopieren.

    (Man könnte auch die Version der openpgp.min.js herunter laden, die wir für unser Kontaktformular verwenden, und auf den eigenen Webserver kopieren.)
  2. Das Javascript encrypt_message.js kann man von unserer Webseite herunter laden und auf den eigenen Webserver kopieren. Dieses Javascript Schnipselchen verschlüsselt das Textarea Feld mit der ID "message" mit dem OpenPGP-Schlüssel, der in dem DIV Container "pubkey" steht. Wenn das Textarea oder der DIV Container im Formular eine andere ID haben, sind die Zeilen 5 und 6 anzupassen: function encrypt_message() {
      if (!(window.crypto && window.crypto.getRandomValues)) {
        window.alert("Fehler: der Browser ist veraltet und wird nicht supported!");
      } else {

        var message = document.getElementById("message");
        var pgpkey = document.getElementById("pubkey");

        if(message.value == "") {
            window.alert("Kein Text gefunden, das Textfeld ist leer!");
        } else {
            # Verschlüsseln des Textes im Textarea
            var options = { data: message.value,
                 publicKeys: openpgp.key.readArmored(pgpkey.innerHTML).keys
             };
            openpgp.encrypt(options).then(function(ciphertext) {
                 message.value = ciphertext.data; });
            # Button für Verschlüsseln deaktivieren
            document.getElementById("encrypt").disabled = true;
        }
      }
    }
  3. Im HTML-Header der Webseite des Formulares sind beide Scripte zu laden: ...
    <script src="openpgp.min.js" async></script>
    <script src="encrypt_message.js" async></script>
    ...
  4. Im HTML-Code des Formulares enthält das Textfeld mit der ID "message" und zwei Buttons ("Verschlüsseln" und "Senden"). Der Button zum Absenden des Formulares ist beim Laden der Seite deaktiviert. Der Absender muss zuerst den Text verschlüsseln. Dabei wird der erste Button inaktiv und der Buton zum Versenden wird aktiviert. <FORM name="contact" method="post" action="https://server.tld/....">

    <textarea id="message" ...></textarea>

    <input type="button" onclick="encrypt_message();"
        value="Verschlüsseln" id="encrypt" />

    <button type="submit" id="send">Senden</button>

    </FORM>
    Außerdem ist der eigenen OpenPGP public Key als versteckter DIV-Container mit der ID "pubkey" irgendwo im HTML-Code der Webseite einzubauen. <div id="pubkey" hidden="true">
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    ....
    -----END PGP PUBLIC KEY BLOCK-----
    </div>
  5. Für Surfer, die Javascript standardmäßig deaktivieren kann man ein Hinweis einfügen, dass Javascript für die Funktion des Formulares nötig ist: <NOSCRIPT>
       Bitte aktivieren Sie Javascript für die Verschlüsselung der Nachricht!
    </NOSCRIPT>
Hinweise: Einige ältere Browser können keine krypto-tauglichen Zufallszahlen mit Javascript erzeugen. Das kann die Verschlüsselung deutlich schwächen. Deshalb ist es mit diesen Browsern nicht möglich, das Formular zu nutzen. Außerdem kann die Verschlüsselung auf dem Server durch unbemerkte Modifikationen am Javascript Code angegriffen werden. Trotzdem ist es besser, als keine Verschlüsselung zu verwenden.

3: Eine Variante für Nerds

Wer einen eigenen Server vollständig selbst kontrolliert und ein bisschen programmieren kann, kann gnupg bei der Verarbeitung der Formulardaten aufrufen. Ein Perl-CGI Script könnte dafür das Module GnuPG Interface nutzen. Wer einen eigenen Webserver sicher administrieren kann, der kann anhand der Anleitung und des Beispiels die OpenPGP-Verschlüsselung selbst einbinden und auch Dateianhänge verschlüsseln.