Einen Wal, bitte!

Hurra, es gibt ein neues spannendes Projekt!

An der FernUniversität in Hagen wird im März kommenden Jahres gewählt. Unter anderem sollen die Studierenden über die Zusammensetzung des Studierendenparlaments abstimmen. Politische Wahlen sind das zentrale Mittel einer Demokratie mit dem eine Personengruppe ihren Willen äußern und Vertreter bestellen kann. Sie geben den Amtsinhabern erst ihr Legitimität. Und dennoch wird regelmäßig um eine vernünftige Wahlbeteiligung gerungen. Insbesondere bei den Wahlen zum Studierendenparlament oder den Fachschaftsräten einer Hochschule ist die Beteiligung in der Regel sehr übersichtlicher. Bei den letzten Wahlen an der FernUniversität in Hagen haben nur ~11% der Wahlberechtigten ihr Stimmrecht wahrgenommen.

Ein ausschlaggebender Grund ist wahrscheinlich die schwierige Bewertung der Kandidierenden. Studierende kennen die Namen auf den Listen in der Regel nicht, und haben wahrscheinlich zu viel zu tun, als dass sie den vielen Kandidadierenden hinterherforschen könnten. Verständlich! 2014 traten immerhin fast 150 Kandidierende für die begehrten Sitze im Studierendenparlament an.

Auf der Suche nach einer Lösung für dieses Problem möchte der AStA der FernUniversität in Hagen ein technisches Hilfsmittel entwickeln lassen, dass den Abgleich der individuellen Position mit denen der Kandidierenden ermöglicht. Sie wollen also einen eigenen Wahl-O-Mat… (Wir von der Küste aasen nicht so mit den Wörtern)

Logo von unserem DeinWal Projekt
Logo von unserem DeinWal Projekt

In dem Zuge ist der AStA an Tom und mich herangetreten, da wir mit DeinWal schon gezeigt haben, dass wir so etwas auf jeden Fall umsetzen können. Nicht nur an uns, sondern auch an Entwickler anderer Wahlentscheidungshilfen: Alle konnten sich mit einem Konzept und einem Angebot auf das Projekt bewerben. Nach einer Ausschreibungsphase wurden die Konzepte begutachtet, und scheinbar konnte ich mich durchsetzten. Und nun freue ich mich sehr, dass ich das spannende Projekt umsetzen darf! :)

Aus DeinWal habe ich schon gelernt, wie viel Auslegungssache Politik sein kann. Mein Horizont ist aber natürlich nur beschränkt und ich kann mich einiger Vorurteile leider nicht freisprechen (auch wenn ich mir das ungern eingestehe). Daher freue ich mich, dass ich für das Projekt eine kleine Crew motivieren konnte. Die Kernteam besteht aus 2 Mitarbeitern:

  • Sophie Flack ist eine Politikwissenschaftlerin, die sich nicht nur auf Parteienforschung spezialisiert hat, sondern auch eine außergewöhnlich internationale Perspektive mitbringt. Sophie hat beispielsweise in Deutschland, den Niederlanden, und Spanien studiert und zuletzt im chilenischen Generalkonsulat gearbeitet.
  • Martin Peters hat als DevOps Engineer und Software Entwickler ein beeindruckendes Gespür für Webanwendungen. Er arbeitet hauptberuflich für ein Unternehmen in der Maritimen Logistik und Tracking Industrie. Sein Fokus liegt auf der Entwicklung moderner Webanwendungen, Optimierung der Entwicklunsabläufe und Analyse von Stromdaten. Mit Martin habe ich in der Vergangenheit schon einige coole Projekte realisieren können.

Außerdem werden uns ein paar Helfer bei Bedarf unterstützen:

  • Für den Schutz eurer personenbezogenen Daten haben wir uns mit dem Datenschutzbedenkenträger Benjamin Winter kompetente Unterstützung in das Team geholt. Er hilft uns die Stolpersteine bei dem Thema zu finden und aus dem Weg zu räumen.
  • Der Mathematiker und Datenwissenschaftler Saptarshi Bej von der Universität Rostock passt auf, dass wir bei den Berechnungsvorschriften keine Fehler machen.
  • Zu guter Letzt steht uns Tom Theile auch für Diskussionen zur Verfügung. Aus privaten Gründen kann er leider nur am Rande dabei sein..

Da das Konzept von DeinWal ein bisschen anders (und ganz besonders) ist, haben wir uns entschieden die neue Plattform anders zu nennen. Wir haben schon ein paar lustige Ideen im Rennen, eine endgültige Entscheidung steht jedoch noch aus. Ein bisschen Wal wird bestimmt dabei sein, mehr wird jetzt aber noch nicht verraten! :)

Die Verträge sind jedenfalls alle Sack und Tüten, und wir sind hoch motiviert ein Werkzeug zu entwickeln, das den Studierenden der FernUniversität in Hagen bei der Entscheidung der kommenden Wahl unterstützen wird. Wir möchten insbesondere auch zeigen, dass diese “technischen Hilfsmittel” datenschutzfreundlich und barrierefrei umgesetzt werden können, dabei aber keineswegs langweilig sein müssen. Ich bin gespannt, wie viel Innovation wir einbauen können, ohne dass das Tool an Fokus und Klarheit verliert!

Also, Wa(h)l Ahoi!

Über komplexe Passwörter

Passwörter sichern den eigenen Account ab
Passwörter sichern den eigenen Account ab

Viele Anwendungen und Dienste laufen heutzutage nicht mehr lokal auf dem Rechner sondern remote irgendwo im Internet. Für die Benutzung der Tools muss man sich in der Regel mit Benutzernamen und Password authentifizieren. Um den eigenen Account zu schützen sollte das Passwort natürlich möglichst komplex sein. Es gibt verschiedene Möglichkeiten ein Passwort komplex zu gestalten. Man kann beispielsweise Zeichen aus möglichst vielen verschiedenen Zeichenklassen wählen: kleine Buchstaben, große Buchstaben, Ziffern, Sonderzeichen. Oder man nutzt ein extrem langes Passwort, zum Beispiel einen Satz wie meine kuh frisst sonntags am liebsten gummibärchen mit schokososse. Wenn der Satz vielleicht noch einen Rechtschreibfehler enthält wird das Passwort nochmal sicherer und wenn er etwas Peinliches verrät kann man sich den Satz auch gut merken :)

Ich behaupte, dass der Passwort-Satz oben wesentlich sicherer ist als das Passwort a0%Al;k/m (und verschiedene Passwort -Analysetools geben mir da Recht). Umso ärgerlicher ist es, wenn die Dienste im Internet nervige Anforderungen an ein Passwort haben und es bspw. aus kleine Buchstaben, große Buchstaben, Ziffern bestehen und mindestens 8 und maximal 20 Zeichen lang sein muss. Ich kann absolut nicht nachvollziehen, warum einige Anbieter die Passwortlänge nach oben begrenzen!? Mein sicherer Passwort-Satz würde hier jedenfalls abgelehnt, das eher unsichere Passwort aber akzeptiert werden.

Die Entropie eines Passworts

Dieser Beitrag entstand als ich gerade für ein Projekt eine Passwort-Authentifizierung implementieren sollte. Statt aber verschiedene Zeichenklassen und eine Mindestlänge zu fordern habe ich mich entschieden eine Mindestkomplexität zu verlangen. Die Komplexität messe ich dabei bezogen auf die theoretische Entropie des Passwords: Enthält das Passwort Zeichen aus vielen Zeichenklassen ist die Entropie pro Zeichen wesentlich höher, als wenn das Passwort nur aus Zahlen besteht.

Die Entropie H\Eta (griechischer Buchstabe Eta) berechne ich als H=Llog2N\Eta = L\log_2 N, wobei LL der Länge des Passworts und NN der Größe des Alphabets entspricht. Ein langes Passwort hat also eine größere Entropie als ein Kurzes; ein Passwort, das aus Zeichen unterschiedlicher Klassen besteht, hat eine größere Entropie als ein Passwort, das nur Zahlen enthält. Nach dieser Methode haben die folgenden Passwörter eine ähnliche Komplexität:

  • a0%Al;k/m (59.2647 bit Entropie)
  • 123456789012345678 (59.7947 bit Entropie)

Damit kann die Servicebetreiber:in eine Mindestentropie für gewählte Passwörter verlangen und Nutzer:innen können freier über die Wahl des Passworts entscheiden. Meine technische Umsetzung habe ich unten an diesen Artikel angehängt.

Generelle Passwort-Tips

Zum Schluss habe ich noch ein paar generelle Tips zu Passwörtern.

Benutzt verschiedene Passwörter!

Das ist glaub ich die wichtigste Regel. Passwörter gehen wirklich sehr oft verloren: Ein Hacker bricht bei einem Anbieter ein oder ein unzufriedener Administrator teilt sie die Datenbank in irgendwelchen Foren. Wenn man man überall das gleiche Passwort hat ein Angreifer dann natürlich Zugriff auf alle Accounts. Wird beispielsweise Twitter gehackt, kommen die Hacker mit den Logindaten auch an euer Facebook-Profil etc.

Es ist natürlich schwer sich für jeden Dienst ein anderes Passwort zu merken, insbesondere wenn sie auch noch kompliziert sein sollen. Daher gibt es zwei Tricks:

  • Wählt ein Passwort mit einer Regel. Beispielsweise a_0%Al;k/m, wobei ihr den Unterstrich immer mit dem ersten und letzten Buchstaben des Dienstes ersetzt, für den ihr das Passwort einsetzen wollt. Für Twitter ergäbe sich als atr0%Al;k/m als Passwort. Dieses Passwort funktioniert dann nicht bei Facebook, wo das Passwort afk0%Al;k/m lautet.
  • Nutzt einen Passwort-Manager! Die sind echt gut. Wer dem Passwort-Safe nicht so recht trauen will kann sich zusätzlich ein Prä- oder Suffix zu den Passwörtern merken. Dann wird im Passwort-Manager nur ein Teil des Passworts gespeichert (der aber schön komplex und lang sein kann) und man muss bei der Anmeldung noch ein paar weiter Zeichen eingeben. Das heißt, selbst wenn die Passwortdatenbank in falsche Hände Gerät kann ein Angreifer damit nichts anfangen: Keines der Passwörter funktioniert ohne das zusätzliche Wissen! :)

Benutzt mehrere Faktoren

Viele Dienste bieten heutzutage eine Zwei-Faktor-Authentifizierung an. In der Regel muss man zu einem Passwort dann noch einen weiteren Code ein geben,

  • den man per SMS zu geschickt bekommt,
  • den eine App ausrechnet, oder
  • der von einem Hardware-Token generiert wird.

Diese Art der Authentifizierung ist wesentlich sicherer als ein reines Passwort.

Umsetzung des Entropie-Checks

Vielleicht hilft meine Implementierung jemandem weiter?

Clientseitig im Angular-Frontend:

import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';

/**
 * A validator that checks if a string contains enough entropy.
 * It accept a validation error object to return if it encounters an error,
 * and the minimum number of bits required
 */
export function entropyValidator(error: ValidationErrors, minBits: number = 80): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } => {
    if (!control.value) {
      // if control is empty return no error
      return null;
    }

    let alphabetSize = 0;
    if (/\d/.test(control.value)) alphabetSize += 10;
    if (/[a-z]/.test(control.value)) alphabetSize += 26;
    if (/[A-Z]/.test(control.value)) alphabetSize += 26;
    if (/[^0-9a-zA-Z]/.test(control.value)) alphabetSize += 34;

    // if true, return no error (no error), else return error passed in the second parameter
    return control.value.length * Math.log2(alphabetSize) > minBits ? null : error;
  };
}

Serverseitig in der PostgreSQL Datenbank:

create or replace function XXX.assert_valid_password
(
  new_password text
) returns void as
$$
declare
  alphabet_size  integer := 0;
  min_bits integer := 80;
begin

    -- contains lower case letter
    if (select new_password ~ '[a-z]') then
        alphabet_size = alphabet_size + 26;
    end if;

    -- contains upper case letter
    if (select new_password ~ '[A-Z]') then
        alphabet_size = alphabet_size + 26;
    end if;

    -- contains digit
    if (select new_password ~ '[0-9]') then
        alphabet_size = alphabet_size + 10;
    end if;

    -- contains special char
    if (select new_password ~ '[^A-Za-z0-9]') then
        alphabet_size = alphabet_size + 34;
    end if;

    -- estimate entropy
    if length(new_password) * log (2, alphabet_size) < min_bits then
        raise exception 'Password is too weak' using errcode = 'WEAKP';
    end if;
    
end;
$$
  language plpgsql volatile;

Dateien schnell und elegant über das lokale Netzwerk teilen

Dateien via Docker mit Geräten im lokalen Netz teilen
Dateien via Docker mit Geräten im lokalen Netz teilen

Sicher kennt ihr das: Man sitzt mit dem Laptop bei Freund:in und/oder Kunden:in und möchte schnell mal ein paar Bilder oder einen Installer teilen. Bei kleinen Dateien mag eine E-Mail gerechtfertigt sein, aber schon bei wenigen MB dauert das gut und gern mal ewig, wenn der Mailserver nicht schon aus Prinzip bei größeren Dateien zickt. Diejenigen, die verstehen wo die Mail überall lang muss, können sicher nachvollziehen, dass das eine äußerst unelegante Lösung ist.

Alternativ bietet sich ein USB-Stick an. Aber wer hat schon immer einen Stick dabei? Und dann ist der auch noch so formatiert, dass er auf dem Zielsystem eventuell gar nicht gelesen werden kann…
Diese Lösungen sind eher so… neunziger… ;-)

Eleganter ist es einen Webserver am eigenen Rechner zu starten, der die Dateien über das lokale Netzwerk ausliefert!

Für so einen Pippifax einen ganzen Webserver installieren und konfigurieren? Wie viel schneller soll das Betriebssystem denn noch altern??

Ja, genau! Aber nicht nativ auf dem Laptop, sondern virtualisiert im Container. Heutzutage hat wahrscheinlich jeder gute IT-ler sowieso Docker oder ähnliches auf dem Laptop, und ein Image von einem Webserver ist in der Regel auch schon heruntergeladen (ansonsten lädt Docker das auch relativ fix bei der ersten Benutzung nach).
Damit lässt sich dann jedenfalls sehr schnell und einfach jede Datei teilen. Ich benutze beispielsweise gern den Nginx Webserver (das geht aber natürlich auch mit dem httpd von Apache, lighttpd oder anderen). Wenn ich die Datei /path/to/file.zip teilen will, mach’ ich das einfach so:

docker run --rm -v /path/to/file.zip:/usr/share/nginx/html/file.zip -p 80:80 nginx

Thada..! Jetzt kann file.zip vom Laptop als http://IP_DES_LAPTOPS/file.zip heruntergeladen werden. Falls der Laptop im Netzwerk einen Namen bekommen hat geht es natürlich noch komfortabler.

Das funktioniert wirklich erstaunlich schnell und zuverlässig in fast jedem Netzwerk. Wesentlich schneller jedenfalls , als wenn man es zu seinem Mailserver schickt, der das dann zum nächsten Mailserver weiterleitet, etc…
Einzige Voraussetzung ist, dass sich die Rechner im Netzwerk sehen können (einige wenige Netze haben das aus Sicherheitsgründen ausgeschaltet). Es werden auch ausschließlich Dateien geteilt, die in den Container gemountet werden. Alle anderen Dateien auf dem Laptop sieht der Webserver gar nicht!

Am Ende dann nicht vergessen den Container wieder zu stoppen, damit man nicht versehentlich im nächsten Netzwerk weiter “teilt” und/oder teilende Webserver akkumuliert ;-)
Dank des --rm ist danach alles wieder sauber aufgeräumt. Das System bleibt jung!

Mehr Alternativen

  • Wenn beide Personen das gleiche Chat-System benutzen, kann man Dateien auch schnell per Matrix oder Threema oder so übertragen.
  • Wer eine Cloud hat (Nextcloud, Dropbox, Onedrive, Google Drive, Mega, etc), kann Dateien natürlich auch darüber komfortabel teilen. Es gibt auch eine Reihe von Anbietern im Netz, bei denen man Dateien ohne Anmeldung hochladen und teilen kann.

Diese Ansätze bedeuten jedoch, dass die Dateien die lokale Infrastruktur verlassen müssen. Das ist hinsichtlich Sicherheit und Privatsphäre eher nicht so schön und dauert tendenziell länger.
Die Lösung mit dem lokalen Webserver im Docker-Container wäre sicher zu bevorzugen.