Einleitung: Warum Ihr Passwort mehr als nur eine Zeichenkette ist
\n\nStellen 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\nWir 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\n1. Passwort-Hashing: Die erste Verteidigungslinie
\n\nDie 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\nPraxis: bcrypt in Aktion
\nFügen Sie die Abhängigkeit in Ihre pom.xml (Maven) ein:
<dependency>\n <groupId>org.springframework.security</groupId>\n <artifactId>spring-security-crypto</artifactId>\n <version>6.2.0</version>\n</dependency>\n\n\nJetzt hashen wir das Passwort bei der Registrierung:
\nimport 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\nWichtig: 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\n2. JWT (JSON Web Tokens): Leichte und sichere Sitzungen
\n\nNach 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\nJWT-Erstellung in Java
\nBinden Sie die Bibliothek io.jsonwebtoken:jjwt ein:
<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.3</version>\n</dependency>\n\n\nToken-Generierung:
\nimport 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\nTipp: 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