Kryptografisches Hashing mit MessageDigest
Hashen Sie Passwörter mit SHA-256, fügen Sie zum Schutz vor Rainbow-Table-Angriffen ein Salt hinzu und vergleichen Sie Digests sicher.
Kryptografisches Hashing mit MessageDigest ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist kryptografisches Hashing?
Eine kryptografische Hashfunktion bildet Daten beliebiger Größe auf einen Hashwert fester Größe ab. Sie ist eine Einwegfunktion (nicht umkehrbar), deterministisch und kollisionsresistent. Sie wird für die Passwortspeicherung, Datenintegrität und digitale Signaturen verwendet.
MessageDigest-API
MessageDigest.getInstance("SHA-256") gibt einen SHA-256-Digestor zurück. Rufen Sie digest(bytes) auf, um den Hash zu berechnen und ein Byte-Array zu erhalten.
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest("password123".getBytes(StandardCharsets.UTF_8));
String hex = HexFormat.of().formatHex(hash);
System.out.println(hex); // 64-char hex stringGängige Algorithmen
Das JDK unterstützt: MD5 (gebrochen – niemals für Sicherheitszwecke verwenden), SHA-1 (aus Sicherheitsgründen veraltet), SHA-256 (Standard), SHA-512 (stärker), SHA3-256 (modern). Verwenden Sie für neuen Code immer SHA-256 oder SHA-512.
MessageDigest.getInstance("SHA-256"); // recommended
MessageDigest.getInstance("SHA-512"); // stronger
MessageDigest.getInstance("SHA3-256"); // SHA-3 family
// Never: MessageDigest.getInstance("MD5"); // cryptographically brokenHash in einen Hexadezimal-String umwandeln
Das Ergebnis als Byte-Array muss für die Speicherung oder den Vergleich in einen Hexadezimal-String umgewandelt werden. Verwenden Sie HexFormat (Java 17+) oder bei älteren Versionen String.format.
// Java 17+:
String hex = HexFormat.of().formatHex(hash);
// Older Java:
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
String hex = sb.toString();Der Salt: Rainbow-Tabellen unbrauchbar machen
Eine Rainbow-Tabelle ordnet gängige Passwörter ihren Hashes zu. Beim Salting wird jedem Passwort vor dem Hashing ein zufälliger Wert hinzugefügt, wodurch Rainbow-Tabellen unbrauchbar werden. Speichern Sie den Salt zusammen mit dem Hash.
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt);
byte[] hash = md.digest("password".getBytes(StandardCharsets.UTF_8));
// Store: Base64.encode(salt) + ":" + Base64.encode(hash)Passwort-Hashing – stattdessen BCrypt verwenden
SHA-256 mit einem Salt ist besser als reines SHA-256, aber immer noch schnell – ein Angreifer kann Milliarden von Versuchen pro Sekunde durchführen. Verwenden Sie eine langsame KDF: BCryptPasswordEncoder (Spring Security) oder PBKDF2 bzw. Argon2 für Passwörter.
// Spring Security — proper password hashing:
PasswordEncoder encoder = new BCryptPasswordEncoder(12); // cost factor 12
String hash = encoder.encode("password123");
boolean match = encoder.matches("password123", hash); // trueDateiintegrität überprüfen
Hashen Sie eine Datei, um Beschädigungen oder Manipulationen zu erkennen. Vergleichen Sie den berechneten Hash mit einer bekannten, vertrauenswürdigen Referenz.
MessageDigest md = MessageDigest.getInstance("SHA-256");
try (InputStream is = Files.newInputStream(Path.of("app.jar"))) {
byte[] buf = new byte[8192];
int n;
while ((n = is.read(buf)) > 0) md.update(buf, 0, n);
}
String hash = HexFormat.of().formatHex(md.digest());
System.out.println("SHA-256: " + hash);Hashes sicher vergleichen
Verwenden Sie MessageDigest.isEqual() für einen Vergleich mit konstanter Laufzeit, um Timing-Angriffe zu verhindern. Verwenden Sie niemals String.equals() zum Vergleichen von Hashes.
byte[] expected = computeHash(storedHash);
byte[] actual = computeHash(inputPassword);
boolean match = MessageDigest.isEqual(expected, actual); // constant-timeAufeinanderfolgende Updates
Rufen Sie md.update(bytes) mehrmals vor md.digest() auf, um Daten zu hashen, die in Blöcken eintreffen (Streaming).
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update("part1".getBytes());
md.update("part2".getBytes());
byte[] hash = md.digest(); // hash of "part1" + "part2"Hashes für die Speicherung kodieren
Speichern Sie binäre Hashes als Base64 (kürzer als Hexadezimal) oder als Hexadezimal-Strings. Base64 verwendet für SHA-256 43 Zeichen, Hexadezimal 64 Zeichen. Beide Varianten sind korrekt – bleiben Sie konsistent.
byte[] hash = md.digest(data);
String base64 = Base64.getEncoder().encodeToString(hash); // 44 chars (with padding)
String hex = HexFormat.of().formatHex(hash); // 64 charsDigestInputStream für Streaming
Verpacken Sie einen InputStream mit DigestInputStream, um den Hash während des Lesens zu berechnen – so muss nicht die gesamte Datei in den Speicher geladen werden.
MessageDigest md = MessageDigest.getInstance("SHA-256");
try (DigestInputStream dis = new DigestInputStream(Files.newInputStream(path), md)) {
dis.transferTo(OutputStream.nullOutputStream());
}
String hash = HexFormat.of().formatHex(md.digest());Kurzer Test
Warum wird SHA-256 mit Salt trotzdem nicht für die Passwortspeicherung empfohlen?
Zusammenfassung
Verwenden Sie MessageDigest.getInstance("SHA-256") für Prüfungen der Datenintegrität. Verwenden Sie immer einen Salt für Passwörter – aber für die Passwortspeicherung BCrypt oder Argon2 statt eines reinen SHA-Hashes. Verwenden Sie einen Vergleich mit konstanter Laufzeit (MessageDigest.isEqual), um Timing-Angriffe zu verhindern.
Häufig gestellte Fragen
Ist die Lektion „Kryptografisches Hashing mit MessageDigest“ kostenlos?
Ja — der vollständige Text von „Kryptografisches Hashing mit MessageDigest“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Kryptografisches Hashing mit MessageDigest“?
Hashen Sie Passwörter mit SHA-256, fügen Sie zum Schutz vor Rainbow-Table-Angriffen ein Salt hinzu und vergleichen Sie Digests sicher. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Kryptografisches Hashing mit MessageDigest“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Kryptografisches Hashing mit MessageDigest
- Symmetrische AES-Verschlüsselung
- HMAC-SHA256 für Nachrichtenintegrität
- JWT: Struktur, Erstellung und Überprüfung