Notizen zu einem Vortrag über sichere Kommunikation im Internet

Ich habe mir am 07.11.2013 auf der Kryptoparty der Piratenpartei in Hannover einen Vortrag von Dirk Hillbrecht zum Thema Kryptographie angehört. Dabei ging es vor allem um die Verschlüsselung von E-Mails und Dateien mit Hilfe von OpenPGP. Während der Veranstaltung wurden Fragen beantwortet, die ich mir schon lange gestellt hatte. In diesem Artikel liste ich einige dieser Erkenntnisse auf. Wie man Schritt für Schritt seine E-Mails verschlüsseln kann, schreibe ich in einem separaten Artikel.

Einen Punkt den ich vorran stellen möchte: sicher verschlüsseln und signieren kann man nur mit Software, die auf dem eigenen Rechner läuft. Nur dann kann man einigermaßen sicher sein, dass nur einem selbst gewisse Informationen (Passwörter etc.) bekannt sind. Daher scheiden die Nutzung von Webmail-Oberflächen und die derzeit viel umworbene De-Mail von vornherein aus. Hier muss nämlich die Ver- und Entschlüsselung auf den Servern der Anbieter erfolgen.

Mir war zunächst der Unterschied zwischen „signieren“ und „verschlüsseln“ von E-Mails nicht bewusst. Irgendwie hatte sich in meinem Kopf festgesetzt: „entweder beides, oder nichts“. Tatsächlich kann man aber auch „nur verschlüsseln“ oder „nur signieren“.

E-Mails verschlüsseln

  1. Die Verschlüsselung dient dazu, den Inhalt der E-Mail vor dem Zugriff Dritter zu schützen.
  2. E-Mails werden mit dem öffentlichen Schlüssel des Empfängers verschlüsselt.
  3. Nur der Empfänger kann den Inhalt mit seinem privaten Schlüssel wieder entschlüsseln. (asymmetrische Verschlüsselung)

E-Mails signieren

  1. Eine Signatur verschlüsselt nicht den Inhalt einer Mail. Vielmehr stellt die Signatur sicher, dass der Inhalt der E-Mail vom Absender stammt und nach dem Absenden nicht verändert wurde. Der Empfänger kann den Inhalt der E-Mail auch dann lesen, wenn er die Signatur nicht überprüft hat – eventuell handelt es sich dann aber nicht um die Inhalte, die der Absender tatsächlich abgeschickt hat.
  2. Die Signatur wird mit aus dem privaten Schlüssel des Absenders und dem Inhalt der E-Mail errechnet.
  3. Der Empfänger kann die Richtigkit der Signatur mit Hilfe des öffentlichen Schlüssels des Absenders überprüfen.
  4. Man kann E-Mails zunächst signieren und im Anschluss verschlüsseln.

Einige Begriffe

  • Enigmail ist eine Erweiterung für Thunderbird, mit deren Hilfe E-Mails verschlüsselt und signiert werden können (Enigmail Quickstart Guide). Enigmail führt die Verschlüsselung nicht selbst durch, sondern nutzt dazu GnuPGP. (Erweiterungen für andere Programme, z.B. Mircrosoft Outlook, findest Du in der Liste grafischer Benutzeroberflächen für GnuPG).
  • GnuPG (auch: GPG) ist eine Implementierung vom Verschlüsselungsstandard OpenPGP. GnuPG erstellt die Schlüssel anhand des OpenPGP-Standards, verwaltet die Schlüssel, verschlüsselt, entschlüsselt und signiert die E-Mails. (Anleitungen zu GnuPG)
  • Unter Gnome/Unity kann zu Erstellung und Verwaltung der Schlüssel das Programm Seahorse verwendet werden. Mit Seahorse können (wie zuvor mit dem GNOME Schlüsselbund) auch andere Passwörter (z.B. SFTP) auf dem System verwaltet werden.
  • Da Seahorse und Enigmail nur Frontends für GnuPG sind, sind Schlüssel, die mit Hilfe des einen Programmes erstellt wurden, auch im jeweils anderen Programm sichtbar.
  • Neben dem privaten Schlüssel und dem öffentlichen Schlüssel, gibt es ein Passwort (Passphrase) und einen Fingerprint.
    1. Das Passwort (Passphrase) dient dazu, den privaten Schlüssel vor einem Zugriff Dritter zu schützen. Das Passwort muss man immer dann eingeben, wenn man Zugriff auf seinen privaten Schlüssel haben möchte. Das ist der Fall beim Entschlüsseln von E-Mails, sowie für die Errechnung der Signierung einer E-Mail.
    2. Der Fingerprint dient dazu, einen öffentlichen Schlüssel auf seine Korrektheit zu überprüfen. Erhält man z.B. über einen Key-Server einen öffentlichen Schlüssel, so kann man mit dieser Checksumme testen, ob es sich um den richtigen Schlüssel handelt. Den Fingerprint kann man z.B. auf seine Visitenkarten drucken.
  • Der gpg-agent (UbuntuUsers Wiki) ist integraler Bestandteil von GnuPG. Er dient dazu, dass das Passwort für die privaten Schlüssel nicht jedes mal neu eingegeben werden muss.
  • Ein Widerrufszertifikat dient dazu, einen öffentlichen Schlüssel bereits vor Ablauf seiner Gültigkeit als ungültig zu erklären bzw. von den Schlüsselservern (Keyserver) zu entfernen. Das ist insbesondere dann wichtig, wenn:
    1. Andere Leute Zugriff auf den privaten Schlüssel bekommen haben.
    2. Man selbst keinen Zugriff mehr auf seinen privaten Schlüssel hat.

Einige Fragen

Kann man PGP verschlüsselte Nachrichten an mehrere Nutzer gleichzeitig schicken?
Ja. Dazu möchte ich aus dem Wikipedia-Artikel zu PGP zitieren:

Bei PGP wird aber nicht die ganze Nachricht asymmetrisch verschlüsselt, denn dies wäre viel zu rechenintensiv. Stattdessen wird die eigentliche Nachricht symmetrisch und nur der verwendete Schlüssel asymmetrisch verschlüsselt (Hybride Verschlüsselung). Dazu wird jedes Mal ein symmetrischer Schlüssel zufällig erzeugt.

Dieser symmetrische Schlüssel wird dann per RSA- oder Elgamal-Kryptosystem mit dem öffentlichen Schlüssel des Empfängers verschlüsselt und der Nachricht hinzugefügt. Dadurch ist es möglich, eine Nachricht für mehrere Empfänger gleichzeitig zu verschlüsseln. Eine für mehrere Empfänger verschlüsselte Nachricht ….

… enthält also zusätzlich eine Liste, in der für jeden Empfänger der Schlüssel enthalten ist. Dieser Schlüssel wird für jeden Empfänger mit seinem öffentlichen Schlüssel asymmetrisch verschlüsselt.

Kann ich meine gesendeten verschlüsselten Nachrichten im Postausgang noch lesen?
Wenn eine Nachricht mit dem öffentlichen Schlüssel der Empfängers verschlüsselt worden ist, kannst man sie im Prinzip nach dem senden nicht mehr anschauen. Allerdings kann man sich selbst auch als Empfänger der Nachricht eintragen lassen (siehe oben). Bei Enigmail gibt es dazu die Einstellung: „Zusätzlich mit eigenem Schlüssel verschlüsseln“:

Man kann E-Mails nicht nur mit dem öffentlichen Schlüssel des Empfängers, sondern auch mit dem eigenen Schlüssel verschlüsseln. Dadurch kann man die gesendeten und verschlüsselten Nachrichten im Postausgang wie gewohnt lesen.
Man kann E-Mails nicht nur mit dem öffentlichen Schlüssel des Empfängers, sondern auch mit dem eigenen Schlüssel verschlüsseln. Dadurch kann man die gesendeten und verschlüsselten Nachrichten im Postausgang wie gewohnt lesen.
Wie kann ich herausfinden, ob mein Schlüssel bereits auf einen Schlüsselserver hochgeladen wurde?
Dazu kannst Du einfach den Schlüsselserver nach deiner E-Mail-Adresse durchsuchen.

  1. Bei Enigmail geht das über: OpenPGP / Schlüssel verwalten und dann Schlüsselserver / Schlüssel suchen.
  2. Bei Seahorse kannst Du den/die Schlüsselserver durchsuchen, indem du auf Entfernt / Entfernte Schlüssel suchen klickst.
  3. Direkt im Internet kannst Du z.B. den MIT Schlüsselserver durchsuchen.
  4. Eine Liste grafischer Benutzeroberflächen für GnuPG findest Du auf der GnuPG Homepage.

Sichere Internet-Verbindung mit HTTPS und SSH

  • Bei HTTPS wird zunächst sichergestellt, dass die Gegenseite auch tatsächlich diejenige ist, für die sie sich ausgibt (also z.B. die Bank, und kein „Man in the middle„). Das wird mit Hilfe von Zertifikaten und einer Zertifikatskette sichergestellt, die von Zertifizierungsstellen (CA; certification authority) bereitgestellt werden. So lange die privaten Schlüssel der Zertifizierungsstellen nicht in falsche Hände gelangt sind, ist das eine sichere Angelegenheit
  • Im Anschluss werden die Schlüssel für die Verschlüsselung mit Hilfe des Diffie-Hellman-Schlüsselaustausches ausgetauscht. Die Besonderheit dieses Verfahrens ist, dass die eigentlichen Schlüssel nicht über das Internet versendet werden. Im Anschluss werden alle Daten nur noch verschlüsselt versendet.
  • Auch wenn man ein unsicheres Netzwerk verwendet (z.B. am Flughafen oder in einem Café), sind diese HTTPS-Verbindungen sicher.
  • Bei SSH-Verbindungen (z.B. wenn man sich im Terminal auf einen Server einloggt, oder eine SFTP-Verbindung aufbaut), muss man zunächst die Schlüssel über eine sichere Verbindung ausgetauscht haben. Den Fingerprint für die Authentifizierung kann man sich vom Admin geben lassen. Bei jedem Aufbau einer SSH-Verbindung wird anhand des Fingerprints überpüft, ob die gewünschte Gegenstelle (direkt) erreicht wurde. Im Anschluss können alle Daten verschlüsselt ausgetauscht werden.

Daten verschlüsseln mit TrueCrypt

In den letzten Minuten des Vortrags wurde noch das Programm TrueCrypt als gute Möglichkeit zur Verschlüsselung von Dateien vorgestellt.

  • TrueCrypt ist für viele Plattformen verfügbar. Das Programm heißt unter Linux RealCrypt.
  • Man legt sogenannte Volumes an, deren Größe man vorher festlegen muss.
  • Mit Hilfe von TrueCrypt können verschlüsselte Archiv-Dateien erstellt (und im Anschluss verbreitet) werden. Bei eCryptFS soll das scheinbar nicht so gut möglich sein. Damit habe ich mich allerdings noch nicht beschäftigt.
  • Die Dateien können mit einem einfachen Passwort wieder entschlüsselt werden.
  • Scheinbar hat Julian Paul Assange diese Methode verwendet, um die amerikanischen Botschaftsdepeschen zu verschlüsseln und zu vebreiten. Er hat gedroht, dass im Falle seines vorzeitigen Ablebens das Passwort an die Öffentlichkeit geraten würde. In dem Falle würden die verschlüsselten Dateien (die auf vielen Server in der ganzen Welt abgelegt worden waren) für alle einsehbar werden. In seiner Biographie hat Assange allerdings Hinweise auf das Passwort gegeben. Das wurde dann erraten und dadurch wurden alle Botschaftsdepeschen einsehbar – auch solche die nicht veröffentlicht werden sollten.

Drucker installieren, der an den USB-Port einer FRITZ!Box angeschlossen ist

Meinen Drucker (Brother HL-5270DN) habe ich direkt an den USB-Anschluss meines WLAN-Routers (AVM FRITZ!Box Fon WLAN 7270) angeschlossen. Zum einen musste ich dadurch keine Kabel verlegen, zum anderen kann ich den Drucker von jedem Rechner im Netzwerk aus verwenden. Wie man den Drucker unter Ubuntu Linux 13.10 installiert, zeige ich in der folgenden Anleitung.

  1. Zunächst wählt man in den Systemeinstellungen den Bereich „Drucker“ aus.
    Der Bereich "Drucker" in den Systemeinstellungen von Ubuntu.
    Der Bereich „Drucker“ in den Systemeinstellungen von Ubuntu.
  2. Nachdem man auf „Hinzufügen“ geklickt hat, kann man den Drucker im Netzwerk suchen. Als Host gibt man dabei fritz.box (oder alternativ die IP-Adresse 192.168.178.1) ein. Falls man eine zweite FRITZ!Box betreiben sollte, können Hostname und IP-Adresse anders sein.
    Suche des Druckers im Netzwerk.
    Suche des Druckers im Netzwerk.
  3. Im Anschluss sollte der Drucker gefunden werden (hier als „JetDirect (fritz.box)“).
    Drucker wurde im Netzwerk gefunden, und wird als "JetDirect (fritz.box)" angezeigt.
    Drucker wurde im Netzwerk gefunden, und wird als „JetDirect (fritz.box)“ angezeigt.

    Wird der Drucker nicht gefunden, sollte man zunächst in den Verbindungsinformationen der eigenen FRITZ!Box nachsehen, ob der Drucker korrekt angeschlossen ist.

    In den Verbindungsinformationen auf der Startseite der FRITZ!Box sollte der Drucker als USB-Gerät aufgeführt sein.
    In den Verbindungsinformationen auf der Startseite der FRITZ!Box sollte der Drucker als USB-Gerät aufgeführt sein.

    Anstatt den Drucker zu suchen, kann man auch direkt die Adresse des Druckers (socket://fritz.box:9100) eingeben.

    Die direkte Eingabe der Drucker-Adresse kann die Suche im Netzwerk ersetzen.
    Die direkte Eingabe der Drucker-Adresse kann die Suche im Netzwerk ersetzen.
  4. Nun muss man nur noch die richtiger Drucker-Treiber auswählen.
    Auswahl der Drucker-Treiber.
    Auswahl der Drucker-Treiber.
  5. Im Anschluss steht einem der Drucker zur Verfügung.
    Einstellungen des neu installierten Druckers.
    Einstellungen des neu installierten Druckers.
  6. Nun muss nur noch überprüft werden, ob alle Einstellungen korrekt sind. In meinem Falle musste ich noch den doppelseitigen Druck (DoplexNoTumble: drehen an der langen Seite) sowie den Toner-Sparmodus aktivieren.
    Druckeroptionen für den Drucker "Brother HL-5270DN".
    Druckeroptionen für den Drucker „Brother HL-5270DN“.

Vervollständigung für eigene LaTeX-Befehle in TeXstudio realisieren

Für einige Aufgaben kann man sich in LaTeX eigene Befehle definieren. So habe ich mir z.B. Befehle für die Referenzierung von Bildern, Tabellen, etc. innerhalb meines Dokumentes definiert. Im Gegensatz zum TeX-eigenen Befehl \ref, wird einem in TeXstudio für den eigenen Befehl standardmäßig keine Liste der vorhandenen Labels angezeigt. In diesem Artikel beschreibe ich, wie man diese erweiterte Code-Vervollständigung für eigene Befehle in TeXstudio aktivieren kann.

Beim tippen des LaTeX-Befehls \ref stellt TeXstudio standardmäßig eine Liste  der vorhandenen labels zur Verfügung (hier: Fig:test). In wenigen Schritten kann man diese Liste auch beim tippen von eigenen Befehlen anzeigen lassen.
Beim tippen des LaTeX-Befehls \ref stellt TeXstudio standardmäßig eine Liste der vorhandenen labels zur Verfügung (hier: Fig:test). In wenigen Schritten kann man diese Liste auch beim tippen von eigenen Befehlen anzeigen lassen.
  1. Ich nutze z.B. für Referenzen auf Bilder einen eigenen Befehl (\fig). Dieser Befehl schreibt mir bei der Referenzierung nicht nur die Nummer, sondern auch gleich ein „Fig. “ vor diese Nummer (siehe auch LaTeX: Labels and Cross-referencing). Dazu verwende ich in der Präambel folgende Zeilen:

    \newcommand{\tab}[1]{{\sc Table~\ref{#1}}}
    \newcommand{\eq}[1]{{\sc Equation~\ref{#1}}}
    \newcommand{\fig}[1]{{\sc Figure~\ref{#1}}}	% z.B. für Fig. 2
    \newcommand{\figE}[2]{{\sc Figure~\ref{#1}#2}}	% z.B. für Fig. 2A
     
    \newcommand{\chap}[1]{{\sc Chapter~\ref{#1}}}
    \newcommand{\sect}[1]{{\sc Section~\ref{#1}}}
    \newcommand{\subsect}[1]{{\sc Subsection~\ref{#1}}}
    \newcommand{\lst}[1]{{\sc Listing~\ref{#1}}}
    \newcommand{\itm}[1]{{\sc Item~\ref{#1}}}
  2. Um nun beim tippen des Befehls \fig oder \tab ebenfalls eine Liste der labels angezeigt zu bekommen, kann man Befehle in sogenannten CWL-Dateien anlegen. Eine sehr gute Beschreibung des CWL-Formates findet man in der TeXstudio-Dokumentation (lokal).

    Ich habe mir eine Datei sven.cwl mit folgendem Inhalt angelegt:

    # Kommentarzeile
    \tab{key}#r
    \eq{key}#r
    \fig{key}#r
    \figE{key}{teil}#r
    
    \tab{key}#r
    \chap{key}#r
    \sect{key}#r
    \subsect{key}#r
    \lst{key}#r
    \itm{key}#r
    
  3. Im Anschluss habe ich die Datei in mein lokales Konfigurationsverzeichnis für TeXstudio kopiert. Unter Ubuntu Linux ist das standardmäßig: /home/username/.config/textstudio (bzw. ~/.config/textstudio)
  4. Die CWL-Datei habe ich dann in den Einstellungen von TeXstudio aktiviert:
    Die eigenen CWL-Dateien müssen noch in den Einstellungen von TeXstudio aktiviert werden.
    Die eigenen CWL-Dateien müssen noch in den Einstellungen von TeXstudio aktiviert werden.
  5. Im Anschluss wird auch für eigene Befehle (hier: \fig, \figE, \eq und \tab) eine Liste von verfügbaren labels angezeigt.

    Mit Hilfe von CWL-Dateien kann auch für eigene Befehle z.B. eine Liste bekannter labels in der Autovervollständigung angezeigt werden.
    Mit Hilfe von CWL-Dateien kann auch für eigene Befehle z.B. eine Liste bekannter labels in der Autovervollständigung angezeigt werden.

JavaScript-Datei im Theme-Editor sichtbar machen

Wer JavaScript-Dateien in seinem WordPress-Blog verwenden möchte, der möchte diese Dateien eventuell auch über den eingebauten Theme-Editor bearbeiten. Das Problem ist allerdings, dass der Theme-Editor solche Dateien nicht auflistet die in Unterverzeichnissen liegen oder deren Dateinamen nicht auf .css oder .php enden. In diesem Artikel zeige ich eine Möglichkeit, dieses Problem in drei Schritten zu umgehen.

  1. Verschiebe die Datei aus dem Unterverzeichnis direkt in das Wurzelverzeichnis deines Themes oder Child-Themes.
  2. Ändere die Endung der Datei auf .php.
  3. Schreibe zu Beginn der Datei folgenden PHP-Befehl:
    <?php
    header("Content-type: text/javascript; charset=UTF-8");
    ?>

    Mit diesem Befehl sendet PHP an den Browser, dass es sich um eine JavaScript-Datei handelt. Wenn vom Server keine (oder falsche) Informationen über den Inhalt der Datei gesendet würden, dann würde insbesondere Firefox diese Datei ignorieren. Solltest Du beim Erstellen der JavaScript-Datei einen anderen Zeichensatz als UTF-8 verwendet haben, musst Du die Angabe das charset entsprechend ändern.

JavaScript und jQuery in einem WordPress-Blog verwenden

Wie man JavaScript in einem WordPress-Blog einbindet, erschließt sich dem Anfängen nicht ohne weiteres. Insbesondere dann, wenn man die Bibliothek jQuery für seine Skripte verwenden möchte. In diesem Artikel werde ich zunächst zeigen, wie man JavaScript direkt in den Quelltext einfügt. Im zweiten Teil zeige ich, wie man JavaScript-Dateien in einen WordPress-Blog einbaut.

Direkter Einbau in den Quelltext

Es wird oftmals davon abgeraten, Skripte direkt in den Quelltext einzubauen. Dennoch werde ich diese Methode kurz vorstellen, um einen Fallstrick beim Einbau von jQuery in WordPress-Blogs zu zeigen.

Das folgende JavaScript kann direkt in den Quelltext einen Artikels oder einer Seite kopiert werden. Beim neu laden der Seite wird dann ein Fenster mit der Nachricht „JavaScript funktioniert!“ angezeigt.

<script>
alert('JavaScript funktioniert!');
</script>

In WordPress-Blogs wird jQuery im No Conflict Mode gestartet (siehe auch Blog von Matthew Ruddy). Daher funktioniert das $-Zeichen als Alias für jQuery() nicht mehr. An den entsprechenden Stellen muss man jQuery() verwenden.

Im folgenden Beispiel wird beim Klicken auf den Text jedes Mal das Wort „neu“ vor den eigentlichen Text gestellt:

<p id="meinTest">Klicke auf diesen Text.</p>
<script>
  jQuery("#meinTest").click(function(){
    jQuery(this).before("neu ");
  });
</script>

Um das Dollarzeichen wieder als Alias für jQuery() in den eigenen Skripten verwenden zu können, muss man beim registrieren seiner Funktionen (mittels jQuery(document).ready) der ersten Funktion das Dollarzeichen als Parameter mitliefern.

<p id="meinTest">Klick auf diesen Text</p>
<script>
jQuery(document).ready(function($) {
  $("#meinTest").click(function(){
    $(this).before("neu ");
  });
})
</script>

Einbinden von Skript-Dateien

Wenn man eigene JavaScript-Dateien einbauen möchte, sollte man die von WordPress zur Verfügung gestellten Funktionen nutzen. Mit ihnen kann man relativ leicht seine Skripte hinzuladen und aktivieren. Zudem stellt man sicher, dass alle benötigten Skript-Dateien (z.B. jQuery) rechtzeitig und in der richtigen Reihenfolge geladen werden.

  1. Zunächst erstellt man sich eine JavaScript-Datei (z.B. meinScript.js) mit der gewünschten Funktion. Durch das folgende Skript werden die H1-Überschriften versteckt, sobald man auf sie klickt.
    jQuery(document).ready(function($) {
      $("h1").click(function(){
        $(this).hide();
      });
    });

    Die Datei meinScript.js habe ich in den Ordner js/ meines eigenen Child-Themes gelegt (siehe auch StackOverflow).

  2. Im Anschluss kann man die Datei zu WordPress hinzufügen, indem man folgenden Quelltext in seine functions.php-Datei schreibt:
    function mein_script_laden() {
    wp_enqueue_script(
      // Name des Scripts (benötigt man z.B. zum Entfernen, etc.)
        'handlerMeinesScripts',
      // Ort der Script-Datei
        get_stylesheet_directory_uri() . '/js/meinScript.js',
      // Liste der Scripts, welche von der Script-Datei benötigt werden.
      // In diesem Falle das von Wordpress geladene jqeury
        array('jquery')
    );
    }
     
    add_action( 'wp_enqueue_scripts', 'mein_script_laden' );

    Da ich ein Child-Theme verwende, habe ich zur Ermittlung des Theme-Pfades die Funktion get_stylesheet_directory_uri() verwendet. Erstellt man ein komplett eigenes Theme, sollte man die Funktion get_template_directory_uri() verwenden.

  3. In Deinem Blog kannst Du auch andere Versionen von jQuery einbinden. Siehe hierzu: Die netzialisten.de und den Blog von Wlad Leirich.
  4. Du kannst auch die JavaScript-Datei im Theme-Editor sichtbar machen. Danach hast Du die Möglichkeit, die JavaScript-Datei direkt aus WordPress heraus zu editieren.