Why TLS is crappy by Design

Jeder der das Internet benutzt, der nutzt auch TLS, besser bekannt unter dem alten Namen SSL. TLS sorgt dafür, dass eine HTTP Verbindung zwischen dem Client und einem Server verschlüsselt ist. Alle Daten die ich an die Website übermittel und vice versa können nicht von Dritten mitgelesen werden. Insbesondere nach den Enthüllungen von Edward Snowden sollte jeder Betreiber einer Website TLS standardmäßig zur Verfügung stellen.

TLS selbst gilt als (weitgehend) sicher. Daran möchte ich auch nichts rütteln.Was jedoch einerseits ein Sicherheits Feature ist, ist gleichzeitig auch ein großes Problem. Wenn zwischen Client und Server erstmal eine Verbindung aufgebaut wurde, dann werden sämtliche Inhalte verschlüsselt übertragen. Sobald eine TLS Verbindung einmal aufgebaut ist, dann ist es unmöglich zu unterscheiden, für welche Domain das eingehende TLS Paket ist. Wenn man auf einem Server unter der gleichen IP Adresse mehrere Domains betreibt, z.B. foo.example.com und bar.example.com, und beide (Sub-)Domains verschiedene Zertifikate mit unterschiedlichen Schlüsseln zur Verschlüsselung der Verbindung verwenden, dann kann der Server später nicht unterscheiden, ob ein eingehendes verschlüsseltes Paket für foo.example.com oder für bar.example.com bestimmt ist.

Grundsätzlich ist dieses Verhalten gut, da ein Angreifer nicht sehen kann, welche URIs der Client abrufen möchte. Es führt aber auch zu gewaltigen Problemen:

Wenn man eine Reihe von Servern betreibt, auf denen eine Webapplication in mehreren Instanzen läuft und Kunden über my-instance.awesome-company.com zugreifen, dann ist es wünschenswert einen Loadbalancer zu betreiben, der alle Anfragen an *.awesome-company.com entgegen nimmt und jede Anfrage an den Server weiter reicht, auf dem die angeforderte Instanz betrieben wird (eine Aufteilung der Kunden auf isolierte Instanzen ist aus Datenschutz Gründen wünschenswert oder sogar erforderlich). Durch HTTPS wird das leider unmöglich: Aus einem verschlüsselten Paket kann man später nicht mehr feststellen, an welche Instanz dieses weitergeleitet werden muss.

Bisher ist die einzige Möglichkeit das Problem zu umgehen der Einsatz eines TLS Reverse Proxies. Hier baut der Client eine verschlüsselte Verbindung zum Loadbalancer auf. Dieser entschlüsselt die Nachricht und kann dann anhand des HTTP Headers erkennen, für welche Instanz das Paket gedacht ist. Der Loadbalancer schickt dass Paket dann über eine neue Verbindung entweder im Klartext oder über eine neue TLS Verbindung an den Instanz Server weiter. Umgekehrt schickt der Instanz Server seine Antwort an den Reverse Proxy, der diese dann an den Client weitergibt. Dieses Model hat zwei nennenswerte Probleme: Zum einen bietet die TLS Verbindung hier keine echte Ende-zu-Ende Verschlüsselung. Daten können auf dem Load Balancer entschlüsselt und ggf. manipuliert oder von Dritten gelesen werden. Zum anderen müssen die Daten vom Loadbalancer zum Instanz Server neu verschlüsselt werden. Das kostet zusätzliche Ressourcen und damit zusätzliches Geld. Es kommt daher nicht selten vor, dass die Verbindung vom Loadbalancer zu den Background Servern nicht verschlüsselt ist.

Eine mögliche Lösung wäre die Erweiterung von TLS. Dazu in einem späteren Post mehr.

Programmieren in der Schule

Heute ist es in der Schule üblich im Informatikunterricht in der Oberstufe den Schülern eine Programmiersprache beizubringen. Ich selbst durfte Delphi lernen, an anderen Schulen wird Java oder Python gelehrt. Aber welche Programmiersprache ist am besten dafür geeignet in der Schule gelehrt zu werden?

Delphi

Die Programmiersprache Delphi basiert im Ursprung auf Pascal, einer in den frühen Siebzigern entwickelte Programmiersprache. Pascal wurde zu seiner Zeit extra mit dem Fokus entwickelt eine Lehrsprache zu sein: Pascal war einfach zu erlernen.
Das heutige Delphi (auch Object Pascal) erweitert das prozedurale Pascal um Objektorientierung und andere Features.
Auch Delphi ist für einen Anfänger leicht zu erlernen. Der große Nachteil: Delphi ist auf Windows beschränkt. Mit Kylix gibt es zwar auch die Möglichkeit Delphi unter Linux zu verwenden, allerdings nicht nativ sondern nur über eine Virtuelle Maschine.
Die Bedeutung von Delphi außerhalb des Lehrumfeldes ist eher gering (derzeit Platz 15 im Tiobe Index mit Tendenz nach unten) und das moderne Delphi konzentriert sich auf das .NET Framework von Microsoft und ist damit wieder nur unter Windows Betriebssystemen sinnvoll einsetzbar.
Insgesamt halte ich Delphi auf Grund dieser Einschränkungen nicht mehr für eine zeitgemäße Programmiersprache zur Lehre in Schulen.

Python

Die dynamische Programmiersprache Python hat in den letzten Jahren große Verbreitung erfahren. Python hat keine statischen Variablen, für den Programmieranfänger sicherlich eine Erleichterung. Andererseits kommt man schnell in die Versuchung Variablen unterschiedlicher Typen durcheinander zu werfen.
Python unterstützt sowohl die prozedurale als auch die objektorientierte Programmierung, sogar funktionale Programmierung wird unterstützt.
Auf Grund der Syntax wird der Schüler von Anfang an dazu gezwungen saubere Einrückungen im Code zu machen und nicht wie Kraut und Rüben zu programmieren. Python bietet dazu eine große Anzahl an Bibliotheken für sehr viele Bereiche.
Der Python Interpreter gibt dem Programmierer detailierte Informationen für das Debugging. Besonders für Programmieranfänger ist das Wünschenswert.
Zugute kommt noch, dass Python Plattformunabhängig und freie Software ist.

PHP

PHP, Sünde oder Segen? Die Sprache PHP ist eine besonders im Bereich der Webentwicklung weit verbreitet. Auch PHP ist ähnlich wie Python dynamisch typisiert. PHP ist freie Software und unter allen Plattformen verfügbar und sehr einfach einzurichten.
Auch in PHP bleibt es dem Programmierer überlassen, ob er einen strukturierten oder objektorientierten Ansatz wählt.
Ein besonders großer Vorteil für Anfänger: PHP verzeiht dem Programmierer sehr viel. Man kann einige Fehler machen und dennoch tut das Programm am Ende wie es soll. Aber genau hier liegt auch das Problem: Man wird als Anfänger nur mit sehr viel Disziplin lernen sauber zu programmieren. Genau das macht es für den Anfänger wieder ungeeignet.

Java

Die Sprache Java ist besonders im Business Bereich und bei der App Entwicklung unter Android sehr weit verbreitet (Tiobe Index Platz 1). Ein großer Vorteil von Java ist die Plattformunabhängigkeit. Nicht nur die Entwicklungswerkzeuge sind für alle Plattformen kostenlos verfügbar, sondern ein Java Programm ist (zumindest in der Theorie) ohne Anpassung auf allen Plattformen für die es eine JVM gibt lauffähig.
Auch für Java gibt es eine ganze Reihe von Bibliotheken und Modulen für eine Vielzahl von Aufgaben.
Der Nachteil von Java als Lehrsprache ist die hohe Lernschwelle für Einsteiger. Java ist vollständig objektorientiert. Mit ein wenig Klempnerei ist es zwar auch möglich mehr oder minder strukturiert zu programmieren, aber Java ist klar für objektorientierte Programmierung designt. Für den Einsteiger mit keinerlei Programmiererfahrung ist das nicht der richtige Ansatz.

C++

 Die Eierlegende Wollmilchsau. C++ ist ebenfalls weit verbreitet (Tiobe Index Platz 4). Viele andere Programmiersprachen (darunter Java, C#, D, …) sind syntaktisch an C++ angelehnt. Kann man einmal C++ programmieren, so fällt es einem relativ einfach andere Sprachen die an C++ angelehnt sind zu lernen.
C++ ermöglicht es dem Programmierer sehr frei zu entscheiden, welches Programmiermodell er nutzt. Ein strukturierter Ansatz ist genauso möglich wie ein objektorienterter.
Für C++ gibt es eine große Reihe an Bibliotheken und der C++ Compiler g++ ist für alle Plattformen als freie Software erhältlich.
Aber auch C++ bietet für den Anfänger eine sehr große Hürde. Anders als die oben genannten Sprachen muss man sich in C++ per Hand um die Speicherverwaltung kümmern. Das ist besonders für Anfänger schwierig.
Hat man jedoch einmal verstanden wie C++ funktioniert, so wird man auch mit anderen Programmiersprachen oftmals ohne große Probleme zurechtkommen. Gleichzeitig lernt viel darüber wie ein Computer intern arbeitet.

Schlussfolgerung

Die perfekte Programmiersprache um sie in der Schule zu lehren gibt es nicht. Ein Kompromiss wäre die Differenzierung zwischen Anfängern und Fortgeschrittenen.

In der neunten und zehnten Klasse sollte für alle Schüler verpflichtend der Informatikunterricht stattfinden. In diesen beiden Jahren werden die Grundlagen der Programmierung mit der Sprache Python gelehrt. So ist die Einstiegshürde für alle Schüler möglichst niedrig gehalten.

In der Oberstufe können Schüler das Fach Informatik freiwillig weiterführen. Neben theoretischen und allgemeinen Aspekten der Informatik sollte hier in Q1 eine Vertiefung der bisherigen Programmierkenntnisse stattfinden. Als Sprachen stünden hier Java oder C++ zu Auswahl. Auch wenn mein persönlicher Favorit C++ ist würde ich dazu tendieren Java zu lehren. C++ in einem Halbjahr zu lehren würde nicht funktionieren, dafür ist die Sprache einfach zu komplex.