Authentification sécurisée en Kotlin : guide pour développeur

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi l'authentification "maison" est-elle risquée ?

\n\n

Imaginez : vous écrivez une application en Kotlin — que ce soit un client Android ou un backend avec Ktor/Spring Boot. Vous bricolez rapidement un formulaire de connexion, vous enregistrez le mot de passe dans SharedPreferences et vous vous réjouissez que tout fonctionne. Et une semaine plus tard, vous recevez un message : "Votre application a été piratée, des données ont fuité". Cela vous dit quelque chose ? Malheureusement, c'est un classique.

\n\n

L'authentification sécurisée en Kotlin ne se limite pas à "vérifier le mot de passe". C'est tout un écosystème : hachage, tokens, protection contre la falsification de requêtes, stockage sécurisé des secrets. Dans cet article, nous allons voir comment éviter les erreurs typiques et construire un système de connexion fiable. C'est parti !

\n\n

1. Hachage des mots de passe : bcrypt et ses amis

\n\n

Première règle de sécurité : ne stockez jamais les mots de passe en clair. Même si vous utilisez HTTPS, la base de données peut être compromise. Votre tâche est de ne stocker que le hachage.

\n\n

Pourquoi MD5 et SHA sont-ils mauvais ?

\n

Ces algorithmes sont rapides. Et les hachages rapides sont un rêve pour les pirates : ils peuvent essayer des milliards de combinaisons par seconde. Utilisez plutôt bcrypt, scrypt ou Argon2. Ils sont délibérément lents et résistants aux attaques par GPU.

\n\n

Exemple en Kotlin avec la bibliothèque jbcrypt :

\n\n
import org.mindrot.jbcrypt.BCrypt\n\nfun hashPassword(password: String): String {\n    val salt = BCrypt.gensalt(12) // facteur de coût 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

Important : le sel est généré automatiquement et intégré dans le hachage. Vous n'avez pas besoin de le stocker séparément.

\n\n

2. JWT : authentification légère et sécurisée

\n\n

JSON Web Token (JWT) est un standard pour transmettre des revendications (claims) entre les parties. En Kotlin, vous pouvez utiliser la bibliothèque java-jwt (Auth0) ou jsonwebtoken (jjwt).

\n\n

Génération d'un JWT en 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 heure\n        .signWith(key, SignatureAlgorithm.HS256)\n        .compact()\n}
\n\n

Validation du token

\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 // retourne l'userId\n    } catch (e: Exception) {\n        null // token invalide ou expiré\n    }\n}
\n\n

Conseil : ne stockez pas la clé secrète dans le code. Utilisez des variables d'environnement ou Vault.

\n\n

3. Stockage sécurisé des tokens sur Android

\n\n

Si vous écrivez une application mobile en Kotlin, le token d'accès ne doit pas être stocké dans SharedPreferences — c'est un fichier ouvert qui peut être lu par d'autres applications ou par un attaquant ayant un accès root.

\n\n

Utilisez EncryptedSharedPreferences (de AndroidX Security) ou 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

Book Recommendations