Archiv der Kategorie: Kryptographie

Diese Seite zeigt alle Beiträge an, die einen Bezug zum Themenbereich der Kryptographie haben.

HTTPs: Unverzichtbar in der heutigen Zeit

Sobald Passwörter zum Login für Webseiten verwendet werden, ist HTTPs unverzichtbar. Im Folgenden möchte ich aufzeigen, warum dem so ist! Ich beginne mit einer Übersicht der gängigsten Authentifizierungen für Web-Portale.

(1) Klartext Login

Die einfachste Variante: Der Login im Klartext.

Account anlegen

Der Benutzername und das Passwort werden im Klartext an den Server gesendet.

Plaintext Registration
Plaintext Registration

Anmeldung

Zur Anmeldung wird der Benutzername und das Passwort im Klartext an den Server gesendet.

Plaintext Login
Plaintext Login

Sicherheit

Die folgende Analyse wertet die Sicherheit des Verfahrens aus. Die Liste ist ein Auszug einiger wichtiger Sicherheitsparameter, jedoch nicht abschließend.

Klartextpasswort geschützt Nein
Replay-Angriff verhindert Nein. Wird das Passwort während der Anmeldung mitgeschnitten, kann dieses zum Login genutzt werden.
Login nach Kompromittierung der Datenbank verhindert Nein. Das in der Datenbank gespeicherte Passwort kann zum Login verwendet werden.
Man-in-the-Middle verhindert Nein. Es gibt keine Möglichkeit sicherzustellen, dass der Client direkt mit dem Server kommuniziert.

Fazit: Erhebliche Risiken; bietet über unverschlüsselte Kommunikationskanäle keinerlei Sicherheit.

HTTPs: Unverzichtbar in der heutigen Zeit weiterlesen

Sicherer Web-Login mit bCrypt und Javascript

User verwenden auf verschiedenen Webseiten häufig gleiche und meist auch schwache Passwörter. Die wenigsten Nutzer im Internet sind technisch so versiert, ausreichende sichere Passwörter generieren und nutzen zu können. Vielfach fehlt ein grundlegendes Basiswissen aus dem Bereich der IT-Sicherheit.

Dies ist aus mehreren Grunde problematisch, denn es kann nicht sichergestellt werden,

  • dass der Anbieter Passwörter angemessen schützt,
  • Passwörter durch den Anbieter nicht weitergegeben werden, oder
  • das Passwörter während der Übertragung an den Webserver nicht mitgeschnitten werden, hierbei ist auch https keine Garantie.

Um die Daten des Users bestmöglich zu schützen, sind an dieser Stelle in erster Linie die Anbieter und Entwickler in der Pflicht. Das Verhalten der Benutzer wird sich auf absehbare Zeit nicht ändern.

Clientseitige Implementierung

Eine Möglichkeit, dass Problem zu mindern, besteht darin, Passwörter zu keiner Zeit unverschlüsselt zu übertragen. Einwegfunktionen zur Sicherung von Passwörtern sollten bereits im Browser des Clients ausgeführt werden.

--> Das komplette Code-Beispiel findet sich auf Github!

Der heutigen Beitrag zeigt eine Beispielimplementierung auf Basis von javascript-bcrypt. Passwörter werden als salted bCrypt-Hash gespeichert.

Das Beispiel ist lediglich ein Ansatz und an vielen Stellen noch nicht ausgereift. Fehlerzustände werden z.B. teilweise noch nicht korrekt behandelt oder Brute-Force Angriffe noch nicht migriert. Das Skript stellt lediglich eine Arbeitsgrundlage zur Weiterentwicklung dar.

Passwort setzen/ ändern

Das Passwort wird mit bCrypt und einem zufälligen Salt verarbeitet und anschließend an den Webserver übertragen. Der Webserver speichert den Hash zusammen mit dem Benutzernamen. Der Anbieter hat zu keiner Zeit das Klartextpasswort erhalten.

Zusammenfassung:

  • Hash erstellen
  • Hash an Server übertragen

Passwort verifizieren

Auch bei der Verifikation darf das Passwort nicht im Klartext übermittelt werden. Hierbei ergibt sich jedoch die Schwierigkeit, dass der Salt für jeden Nutzer unterschiedlich ist und somit das Passwort nicht einfach erneut als Hash übertragen werden kann. Aus diesem Grund muss beim Login der Salt des Users an die Login-Form übertragen werden.

Zusammenfassung:

  • Username eingeben
  • Salt vom Server für Usernamen abholen
  • Passwort eingeben
  • Hash erstellen
  • Hash an Server übertragen, dort Abgleich

Sicherer Web-Login mit bCrypt und Javascript weiterlesen

PHP Anwendungen absichern

Nachdem ich vor knapp 3 Wochen zufällig festgestellt habe, dass über das PHP-Webinterface von einem der größten deutschen Web-Hoster nahezu alle Rechnungen, unter anderem inkl. Kunden-Adressen, gekürzten Bankverbindungen, Domains sowie IP-Adressen öffentlich abrufbar sind, habe ich mich entschieden, einen kurzen Beitrag über die Absicherung von Web-Anwendungen zu schreiben. Zur Ausnutzung der Lücke war keinerlei technisches Fachwissen erforderlich - das Skript zum Download der Rechnung hat einfach jede beliebige Rechnung ungeprüft ausgeben. In der URL musste nur die gewünschte Rechnungsnummer eingegeben werden. Aufgefallen ist es mir, nachdem ich bemerkt hatte, dass ich eine Rechnung von meinem Zweitaccount beim Anbieter herunterladen konnte, ohne dass ich dort noch angemeldet war.

Problem 1: Keine Authentifizierung

Oftmals finde ich Anwendungen, die zwar einen Login haben, dieser jedoch nur den Zweck hat, auf einen geschützten Bereich weiterzuleiten. Beim Öffnen einer Seite in einem geschützten Bereich wird nicht erneut geprüft, ob der User authentifiziert ist. Dabei lässt sich dies unglaublich leicht realisieren:

<?php
session_start();
 
if (isset($_SESSION['username'])) {
   --> Passt
} else {
   --> Zur Anmeldung weiterleiten
}
?>

Geschützter Content sollte niemals (!) ohne Authentifizierung ausgeführt werden.

Problem 2: Keine Autorisierung

Neben der Authentifizierung sollte stets geprüft werden, ob der User auch autorisiert ist, die gewünschte Aktion auszuführen. Im Beispiel einer Rechnungsabfrage über SQL darf niemals die Anfrage ungeprüft über SQL ausgeführt werden. Die SQL Anfrage sollte soweit eingeschränkt sein, dass ein User nur auf Daten zugreifen kann, die für ihn bestimmt sind.

Problem 3: Unverschlüsselte Übertragung

Ein geschützter Bereich bringt wenig, wenn die Anmeldung im Klartext durchgeführt wird. Es kann nur in den seltensten Fällen sichergestellt werden, dass die Daten unterwegs nicht ausgelesen werden können. Einen HTTP Request mit Wireshark auszulesen, bedarf keines großen Könnens. Die Thematik wird umso schwerwiegender, wenn im Unternehmen Single-Sign-On (SSO) bzw. LDAP verwendet wird.

PHP Anwendungen absichern weiterlesen

Cisco OSPF IPv6 Verschlüsselung/ Authentifizierung

Aktuell arbeite ich am Thema der Absicherung von OSPFv3, speziell im Rahmen von IPv6. Die Topologie die ich heute zur Demonstration verwenden werde ist recht einfach:

OSPFv3-Topologie

Eine größere Topologie ist zur Demonstration nicht notwendig, dass Beispiel lässt sich beliebig skalieren. Die Möglichkeiten der Absicherung von OSPF haben sich im Zuge von IPv6 verändert, OSPFv3 verwendet keine eigene Lösung mehr zur Absicherung, sondern übergibt die Aufgaben der Sicherstellung von Integrität, Vertraulichkeit und Authentizität an die übergeordnete Protokollschicht - IPv6.

Relevant sind hierbei die IPv6 Extension Header vom Typ 50 und 51: Der Authentication Header (AH) sowie der Encapsulating Security Payload (ESP) Header.

In diesem Beitrag werde ich sowohl die "klassische" Variante zum Schutz von OSPF über IPv6 nach RFC 4552 erläutern, als auch die alternative IPSec unabhängige Variante, mit dem OSPFv3 Authentication Trailer nach RFC 7166. Beginnen werde ich mit der erst genannten Variante.

Cisco OSPF IPv6 Verschlüsselung/ Authentifizierung weiterlesen

Rijndael (AES): Sichere Block- und Schlüsselgrößen

Nachdem mir die Frage gestellt wurde, warum ich im BLOG in einigen Beiträgen bestimmte Cipher empfohlen habe, möchte ich in diesem Beitrag auf die Bedeutung

  • der Blockgröße und
  • der Schlüssellänge

unter Berücksichtigung der bisher bekannt gewordenen Angriffsmöglichkeiten am Beispiel von Rijndael näher eingehen.

1 - Was ist die Blockgröße?

Die Blockgröße ist die Anzahl der Bytes, die, durch den Rijndael- Algorithmus, während eines Durchgangs verarbeitet werden können. Der Klartext wird hierbei durch einen Betriebsmodus wie CBC oder GCM in n Bit große Blöcke aufgeteilt und ggf. mit Hilfe von Padding- Verfahren aufgefüllt.

Blocksize bei CBC
Diese Darstellung verdeutlicht die Blocksize des Verschlüsselungsmode Cipher Block Chaining Mode (CBC) [1]

Der Rijndael- Algorithmus unterstützt verschiedene Blockgrößen (128, 160, 192, 224, und 256 Bits), im AES- Standard wird jedoch nur die 128-bit Blockgröße spezifiziert.

1.1 - Je größer die Blockgröße, desto besser?

Kommt drauf an. Für die Sicherheit einiger Betriebsmodi ist es erforderlich, dass keine zwei Cipher-Text Blöcke mit demselben Inhalt generiert werden.

Leicht verdeutlicht werden kann dies mit Hilfe des Code-Book Angriffs:

sei hierbei ein Klartextblock, der vorherige Cipher-Text Block und der Block Cipher.

Rijndael (AES): Sichere Block- und Schlüsselgrößen weiterlesen