Toolypet
Back to Blog
Security

Hash-Algorithmen im Vergleich: MD5, SHA, Bcrypt - Wann welchen verwenden?

Vergleich der Eigenschaften und Verwendungszwecke verschiedener Hash-Algorithmen mit Auswahlhilfe für jede Situation.

Toolypet Team6 min read
Hash-Algorithmen im Vergleich: MD5, SHA, Bcrypt - Wann welchen verwenden?

Was ist eine Hash-Funktion?

Eine Hash-Funktion ist eine mathematische Funktion, die Daten beliebiger Größe in einen Wert fester Größe umwandelt. Dieser umgewandelte Wert wird Hash, Digest oder Prüfsumme genannt. Hash-Funktionen sind eine Kernkomponente der modernen Computersicherheit und werden in verschiedenen Bereichen von der Passwortspeicherung bis zur Blockchain eingesetzt.

Um Hash-Funktionen zu verstehen, nehmen wir einen Vergleich: Eine Hash-Funktion ist wie ein Fleischwolf, der Fleisch zu Hackfleisch verarbeitet. Bei gleicher Eingabe kommt immer das gleiche Ergebnis heraus, aber aus dem Hackfleisch die ursprüngliche Form des Fleisches wiederherzustellen ist unmöglich. Das ist die Kerneigenschaft von Hash-Funktionen.

Wesentliche Eigenschaften von Hash-Funktionen

Eine sichere kryptographische Hash-Funktion muss vier wesentliche Eigenschaften besitzen.

1. Deterministisch

Gleiche Eingabe erzeugt immer gleiche Ausgabe. Ohne diese Eigenschaft könnten Hashes nicht zur Datenverifizierung verwendet werden.

// Immer gleiches Ergebnis
MD5("Hello") === "8b1a9953c4611296a827abf8c47804d7"  // true
MD5("Hello") === "8b1a9953c4611296a827abf8c47804d7"  // true (immer)

2. Einwegfunktion (One-way)

Aus dem Hash-Wert die Originaldaten zurückzurechnen muss rechnerisch unmöglich sein. Dank dieser Eigenschaft können Hashes sicher zur Passwortspeicherung verwendet werden. Selbst bei einem Datenbanklek kann aus dem Hash-Wert das ursprüngliche Passwort nicht ermittelt werden.

3. Kollisionsresistenz

Wenn zwei unterschiedliche Eingaben den gleichen Hash-Wert erzeugen, nennt man das eine Kollision. Eine gute Hash-Funktion macht es extrem schwer, Kollisionen zu finden. Der Grund, warum MD5 und SHA-1 nicht mehr für Sicherheitszwecke empfohlen werden, ist genau, dass Kollisionen gefunden wurden.

4. Lawineneffekt (Avalanche Effect)

Wenn die Eingabe auch nur um 1 Bit geändert wird, muss sich die Ausgabe komplett ändern. Diese Eigenschaft verhindert, dass aus ähnlichen Eingaben Muster in den Hash-Werten abgeleitet werden können.

MD5("Hello") = "8b1a9953c4611296a827abf8c47804d7"
MD5("hello") = "5d41402abc4b2a76b9719d911017c592"
// Ein Großbuchstabe Unterschied, aber komplett anderes Ergebnis

Tiefgehende Analyse der wichtigsten Hash-Algorithmen

MD5: Warum nicht mehr für Sicherheit verwenden?

MD5 ist eine 128-Bit Hash-Funktion, die 1991 von Ronald Rivest entwickelt wurde. Sie war einst die am weitesten verbreitete, sollte aber heute nicht mehr für Sicherheitszwecke verwendet werden.

Eingabe: "Hello World"
Ausgabe: b10a8db164e0754105b7a99be72e3fe5
Länge: 128 Bit (32 Hex-Zeichen)

Der Niedergang von MD5: 2004 fand das Forschungsteam um Wang Xiaoyun aus China Kollisionen in MD5. 2008 wurden MD5-Kollisionen sogar genutzt, um gefälschte SSL-Zertifikate zu erstellen. Heute können Kollisionen in MD5 auf normalen Computern in Sekunden erzeugt werden.

Wann MD5 noch verwendet werden darf:

  • Datei-Download-Integritätsprüfung (nicht Sicherheit, sondern Fehlererkennung)
  • Cache-Schlüssel-Generierung
  • Nicht-sicherheitsrelevante Prüfsummen

SHA-1: Googles SHAttered-Angriff

SHA-1 ist eine 160-Bit Hash-Funktion, die von der NSA entwickelt und von NIST standardisiert wurde. Sie galt als sicherer als MD5, aber 2017 demonstrierten Google und CWI Amsterdam mit dem "SHAttered"-Angriff eine Kollision.

Bei diesem Angriff erzeugten die Forscher zwei PDF-Dateien mit gleichem SHA-1-Hash aber unterschiedlichem Inhalt. Der Angriff erforderte 6.500 CPU-Jahre und 110 GPU-Jahre Rechenzeit. Obwohl enorme Ressourcen nötig waren, endete in dem Moment, als eine Kollision praktisch möglich wurde, das Vertrauen in SHA-1.

Aktueller Status: Die meisten Browser und Zertifizierungsstellen lehnen SHA-1-Zertifikate ab.

SHA-256 (SHA-2): Der aktuelle Standard

Die SHA-2-Familie ist der Nachfolger von SHA-1 und umfasst verschiedene Varianten wie SHA-224, SHA-256, SHA-384 und SHA-512. SHA-256 ist am weitesten verbreitet.

Eingabe: "Hello World"
Ausgabe: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
Länge: 256 Bit (64 Hex-Zeichen)

SHA-256 und Bitcoin: Bitcoin verwendet SHA-256 als Kern. Miner führen Billionen von Hash-Berechnungen durch, um einen Nonce-Wert zu finden, bei dem der SHA-256-Hash des Block-Headers bestimmte Bedingungen erfüllt (viele führende Nullen). Die Unvorhersehbarkeit von SHA-256 macht diesen Prozess fair.

Verwendung:

  • Digitale Signaturen (mit RSA, ECDSA)
  • SSL/TLS-Zertifikate
  • Blockchain
  • Dateiintegritätsprüfung

SHA-3: Keccaks neuer Ansatz

SHA-3 ist die neueste Hash-Funktion, die 2015 von NIST standardisiert wurde. Sie verwendet eine völlig andere Struktur (Schwammstruktur) als SHA-2, sodass SHA-3 nicht betroffen wäre, falls Schwachstellen in SHA-2 gefunden würden.

Die Design-Philosophie von SHA-3 war "anders machen". Während SHA-2 die Merkle-Damgård-Struktur verwendet, basiert SHA-3s Keccak-Algorithmus auf einer Schwammfunktion. Dies ist eine Art Versicherung: SHA-2 ist noch sicher, aber eine Alternative für zukünftige Angriffe ist vorbereitet.

Bcrypt: Spezieller Hash für Passwörter

Bcrypt wurde im Gegensatz zu Allzweck-Hashes absichtlich langsam entwickelt. Bei Passwort-Hashing ist "langsam" ein Vorteil. Es verhindert, dass Angreifer Milliarden von Passwörtern pro Sekunde ausprobieren können.

// Work Factor (Cost Factor) 12
bcrypt.hash("password", 12)

// Beispielausgabe
$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/X4.VVzfQl0Pfy6.nO

Bcrypt Hash-Struktur:

  • $2b$ - Algorithmus-Version
  • 12$ - Work Factor (2^12 = 4.096 Iterationen)
  • Nächste 22 Zeichen - Salt (Base64-kodiert)
  • Rest - Eigentlicher Hash-Wert

Bei Erhöhung des Work Factors um 1 verdoppelt sich die Berechnungszeit. Aktuell empfohlen: 10-12.

Argon2: Der neueste Passwort-Hash

Argon2 ist der Gewinner des Password Hashing Competition 2015. Er wurde speicherintensiv konzipiert und ist daher resistent gegen GPU-Parallelangriffe.

Parameter:
- Memory: Wie viel RAM verwendet wird
- Time: Wie lange berechnet wird
- Parallelism: Wie viele Threads verwendet werden

Argon2id wird für allgemeine Zwecke empfohlen. Für neue Projekte Argon2 verwenden, bei Legacy-Kompatibilität Bcrypt.

Praxis-Anwendungsguide

Passwortspeicherung: Salt und Pepper

Salt: Für jedes Passwort wird ein einzigartiger Zufallswert hinzugefügt. Gleiche Passwörter erzeugen unterschiedliche Hashes, was Rainbow-Table-Angriffe wirkungslos macht.

// Salt-Verwendung
password: "password123"
salt: "x7Gh9kL2" (zufällig generiert)
hash: bcrypt("password123" + "x7Gh9kL2")

Pepper: Während Salt zusammen mit dem Hash in der Datenbank gespeichert wird, wird Pepper separat verwaltet (Umgebungsvariablen, Hardware-Sicherheitsmodule usw.). Selbst bei einem Datenbanklek kann das Passwort ohne Pepper nicht verifiziert werden.

Dateiintegritätsprüfung

Bei der Software-Distribution kann eine SHA-256-Prüfsumme mitgeliefert werden, um zu bestätigen, dass die heruntergeladene Datei nicht manipuliert wurde.

# Datei-Hash erzeugen
sha256sum ubuntu-22.04.iso
# a1b2c3d4e5f6... ubuntu-22.04.iso

# Verifizierung
echo "a1b2c3d4e5f6... ubuntu-22.04.iso" | sha256sum --check

Algorithmus-Auswahl nach Verwendungszweck

VerwendungszweckEmpfohlener AlgorithmusNicht empfohlen
PasswortspeicherungArgon2id, Bcrypt, PBKDF2MD5, SHA-Familie (zu schnell)
DateiintegritätSHA-256, SHA-512MD5 (Kollisionen möglich)
Digitale SignaturenSHA-256 + RSA/ECDSASHA-1 (Kollisionsangriffe)
API-TokensHMAC-SHA256-
Cache-SchlüsselMD5, SHA-1 (schnell)-

Code-Beispiele

Node.js

const crypto = require('crypto');
const bcrypt = require('bcrypt');

// SHA-256
const sha256 = crypto.createHash('sha256')
  .update('Hello World')
  .digest('hex');

// Bcrypt
const hash = await bcrypt.hash('password', 12);
const isValid = await bcrypt.compare('password', hash);

Python

import hashlib
import bcrypt

# SHA-256
sha256 = hashlib.sha256(b'Hello World').hexdigest()

# Bcrypt
hashed = bcrypt.hashpw(b'password', bcrypt.gensalt(12))
is_valid = bcrypt.checkpw(b'password', hashed)

Toolypet Hash Tools

Mit den Hash-Tools von Toolypet können Sie verschiedene Hashes schnell erstellen und verifizieren:

  • MD5/SHA Generator: Sofortige Hash-Berechnung für Text oder Dateien
  • Bcrypt Tool: Passwort-Hash-Erstellung und -Verifizierung
  • Hash-Vergleich: Sicherer Vergleich zweier Hash-Werte (Timing-Attack-sicher)

Erledigen Sie Ihre Hash-Arbeiten für Entwicklung und Tests bequem mit Toolypet.

HashMD5SHABcryptCryptography