Sichere Authentifizierung in Kotlin: Ein Leitfaden für Entwickler

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 eine "selbstgestrickte" Authentifizierung ein Risiko darstellt?

\n\n

Stellen Sie sich vor: Sie schreiben eine Anwendung in Kotlin – sei es ein Android-Client oder ein Backend mit Ktor/Spring Boot. Sie werfen schnell ein Login-Formular zusammen, speichern das Passwort in SharedPreferences und freuen sich, dass alles funktioniert. Und eine Woche später erhalten Sie die Nachricht: "Ihre Anwendung wurde gehackt, Daten sind durchgesickert." Kommt Ihnen das bekannt vor? Leider ist das ein Klassiker.

\n\n

Sichere Authentifizierung in Kotlin ist nicht einfach nur "Passwort prüfen". Es ist ein ganzes Ökosystem: Hashing, Tokens, Schutz vor Request-Fälschung, sichere Speicherung von Geheimnissen. In diesem Artikel schauen wir uns an, wie Sie typische Fehler vermeiden und ein zuverlässiges Anmeldesystem aufbauen. Los geht's!

\n\n

1. Passwort-Hashing: bcrypt und seine Freunde

\n\n

Die erste Sicherheitsregel: Speichern Sie Passwörter niemals im Klartext. Selbst wenn Sie HTTPS verwenden, kann die Datenbank kompromittiert werden. Ihre Aufgabe ist es, nur den Hash zu speichern.

\n\n

Warum sind MD5 und SHA böse?

\n

Diese Algorithmen sind schnell. Und schnelle Hashes sind der Traum eines Angreifers: Er kann Milliarden von Kombinationen pro Sekunde durchprobieren. Verwenden Sie stattdessen bcrypt, scrypt oder Argon2. Sie sind bewusst langsam und resistent gegen GPU-Angriffe.

\n\n

Beispiel in Kotlin mit der Bibliothek jbcrypt:

\n\n
import org.mindrot.jbcrypt.BCrypt\n\nfun hashPassword(password: String): String {\n    val salt = BCrypt.gensalt(12) // cost factor 12 – optimal\n    return BCrypt.hashpw(password, salt)\n}\n\nfun checkPassword(password: String, hashed: String): Boolean {\n    return BCrypt.checkpw(password, hashed)\n}
\n\n

Wichtig: Das Salt wird automatisch generiert und in den Hash eingebettet. Sie müssen es nicht separat speichern.

\n\n

2. JWT: Leichte und sichere Authentifizierung

\n\n

JSON Web Token (JWT) ist ein Standard für die Übertragung von Behauptungen (Claims) zwischen Parteien. In Kotlin können Sie die Bibliothek java-jwt (Auth0) oder jsonwebtoken (jjwt) verwenden.

\n\n

JWT-Generierung in Kotlin

\n\n
import io.jsonwebtoken.Jwts\nimport io.jsonwebtoken.SignatureAlgorithm\nimport io.jsonwebtoken.security.Keys\nimport java.util.Date\n\nfun generateToken(userId: String, secretKey: String): String {\n    val key = Keys.hmacShaKeyFor(secretKey.toByteArray())\n    return Jwts.builder()\n        .setSubject(userId)\n        .setIssuedAt(Date())\n        .setExpiration(Date(System.currentTimeMillis() + 3600_000)) // 1 Stunde\n        .signWith(key, SignatureAlgorithm.HS256)\n        .compact()\n}
\n\n

Token-Überprüfung

\n\n
fun validateToken(token: String, secretKey: String): String? {\n    return try {\n        val key = Keys.hmacShaKeyFor(secretKey.toByteArray())\n        val claims = Jwts.parserBuilder()\n            .setSigningKey(key)\n            .build()\n            .parseClaimsJws(token)\n            .body\n        claims.subject // gibt userId zurück\n    } catch (e: Exception) {\n        null // Token ungültig oder abgelaufen\n    }\n}
\n\n

Tipp: Speichern Sie den geheimen Schlüssel nicht im Code. Verwenden Sie Umgebungsvariablen oder Vault.

\n\n

3. Sichere Token-Speicherung auf Android

\n\n

Wenn Sie eine mobile Anwendung in Kotlin schreiben, darf das Zugriffstoken nicht in SharedPreferences gespeichert werden – dies ist eine offene Datei, die von anderen Apps oder einem Angreifer mit Root-Zugriff gelesen werden kann.

\n\n

Verwenden Sie EncryptedSharedPreferences (aus AndroidX Security) oder Keystore:

\n\n
import androidx.security.crypto.EncryptedSharedPreferences\nimport androidx.security.crypto.MasterKey\n\nfun saveToken(context: Context, token: String) {\n    val masterKey = MasterKey.Builder(context)\n        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)\n        .build()\n\n    val sharedPreferences = EncryptedSharedPreferences.create(\n        context,\n        "secure_prefs",\n        masterKey,\n                

Blogs

Buchempfehlungen