Sichere Authentifizierung in Java: Wie Sie die Sicherheitsprüfung nicht verpassen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Ihr Passwort mehr als nur eine Zeichenkette ist

\n\n

Stellen Sie sich vor: Sie haben eine tolle Java-Anwendung für eine Online-Bibliothek geschrieben. Benutzer registrieren sich, speichern Lesezeichen, schreiben Rezensionen. Und plötzlich – ein Datenbankleck. Alle Passwörter im Klartext. Eine Katastrophe? Und wie! Im Jahr 2024 kommt es alle 39 Sekunden zu Datenlecks, und 81% davon stehen im Zusammenhang mit schwacher Authentifizierung. Wenn Sie in Java programmieren und nicht wollen, dass Ihr Projekt in den Cyber-Nachrichten landet, ist dieser Artikel genau das Richtige für Sie.

\n\n

Wir behandeln die sichere Authentifizierung in Java-Anwendungen von A bis Z: vom Passwort-Hashing über JWT bis zum CSRF-Schutz. Keine langweilige Theorie, nur funktionierender Code und echte Praktiken. Los geht's!

\n\n

1. Passwort-Hashing: Die erste Verteidigungslinie

\n\n

Die erste Sicherheitsregel: Speichern Sie Passwörter niemals im Klartext. Selbst wenn Ihre Datenbank der Heilige Gral ist, ist die Verschlüsselung von Passwörtern das absolute Minimum. In Java werden dafür Algorithmen wie bcrypt, scrypt oder Argon2 verwendet. Warum nicht MD5 oder SHA? Weil sie zu schnell sind – ein Angreifer könnte das Passwort in Sekunden knacken.

\n\n

Praxis: bcrypt in Aktion

\n

Fügen Sie die Abhängigkeit in Ihre pom.xml (Maven) ein:

\n
<dependency>\n    <groupId>org.springframework.security</groupId>\n    <artifactId>spring-security-crypto</artifactId>\n    <version>6.2.0</version>\n</dependency>\n
\n\n

Jetzt hashen wir das Passwort bei der Registrierung:

\n
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\n\npublic class PasswordService {\n    private final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();\n\n    public String hashPassword(String rawPassword) {\n        return encoder.encode(rawPassword); // generiert automatisch Salt\n    }\n\n    public boolean checkPassword(String rawPassword, String storedHash) {\n        return encoder.matches(rawPassword, storedHash);\n    }\n}\n
\n\n

Wichtig: bcrypt fügt automatisch ein zufälliges Salt hinzu, sodass selbst identische Passwörter unterschiedlich aussehen. Der Standard-Cost-Faktor ist 10, aber für kritische Systeme kann er auf 12-14 erhöht werden.

\n\n

2. JWT (JSON Web Tokens): Leichte und sichere Sitzungen

\n\n

Nach der Registrierung muss der Benutzer seine Identität irgendwie nachweisen. Cookies? Möglich, aber JWT ist der moderne Standard für REST-APIs. Das Token enthält Informationen über den Benutzer und ist mit einem geheimen Schlüssel signiert. Keine Sitzungen auf dem Server – alles im Token.

\n\n

JWT-Erstellung in Java

\n

Binden Sie die Bibliothek io.jsonwebtoken:jjwt ein:

\n
<dependency>\n    <groupId>io.jsonwebtoken</groupId>\n    <artifactId>jjwt-api</artifactId>\n    <version>0.12.3</version>\n</dependency>\n
\n\n

Token-Generierung:

\n
import io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.security.Keys;\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\npublic class JwtUtil {\n    private final SecretKey key = Keys.hmacShaKeyFor("geheimer_schlüssel_mindestens_256_bit_lang".getBytes());\n\n    public String generateToken(String username) {\n        return Jwts.builder()\n                .subject(username)\n                .issuedAt(new Date())\n                .expiration(new Date(System.currentTimeMillis() + 3600000)) // 1 Stunde\n                .signWith(key)\n                .compact();\n    }\n\n    public String extractUsername(String token) {\n        return Jwts.parser()\n                .verifyWith(key)\n                .build()\n                .parseSignedClaims(token)\n                .getPayload()\n                .getSubject();\n    }\n}\n
\n\n

Tipp: Speichern Sie den geheimen Schlüssel niemals im Code! Verwenden Sie Umgebungsvariablen oder Vault. Und legen Sie niemals vertrauliche Daten (Passwörter, Kartennummern) in das JWT – das Token kann ohne Signatur dekodiert werden.

\n\n

3. CSRF-Schutz:

Blogs

Buchempfehlungen