Mots de passe dans une application Rails : appliquer la recommandation de la CNIL

En France, la politique de mots de passe d'un service en ligne a une référence : la recommandation de la CNIL adoptée en 2022. Elle ne fixe pas un nombre de caractères unique, mais un niveau de robustesse qui dépend des protections mises en place autour du formulaire de connexion. Voici comment la traduire dans une application Rails, avec Devise ou avec l'authentification générée par Rails 8.
Ce que dit la recommandation
La délibération n° 2022-100 du 21 juillet 2022 a remplacé la recommandation de 2017. La CNIL en présente l'essentiel sur sa page « Mots de passe : recommandations pour maîtriser sa sécurité ». Trois idées concernent directement le code d'une application.
Raisonner en entropie, pas en longueur. La CNIL mesure la robustesse d'une politique de mots de passe en bits d'entropie, c'est-à-dire en quantité de hasard. Pour un mot de passe utilisé seul, sans autre protection, elle fixe un minimum de 80 bits et donne trois exemples équivalents : au moins 12 caractères mêlant majuscules, minuscules, chiffres et caractères spéciaux choisis dans une liste d'au moins 37 ; au moins 14 caractères mêlant majuscules, minuscules et chiffres, sans caractère spécial obligatoire ; ou une phrase de passe d'au moins 7 mots.
Trois cas d'usage. Le tableau de la CNIL distingue le mot de passe seul (exemples : forum, blog), qui exige 80 bits ; le mot de passe accompagné d'un mécanisme de restriction d'accès au compte (exemples : site de commerce en ligne, compte d'entreprise, messagerie), qui en exige 50 ; et le mot de passe associé à un matériel détenu par la personne, comme une carte bancaire ou un téléphone, pour lequel 13 bits suffisent, avec blocage au bout de 3 tentatives échouées. Pour le cas intermédiaire, la CNIL cite comme mécanismes possibles une temporisation après plusieurs échecs, un nombre maximal de tentatives dans un délai donné, un « captcha », ou le blocage du compte après 10 échecs avec un mécanisme de déblocage adapté.
Ne jamais stocker en clair. Le mot de passe doit être transformé par une fonction cryptographique non réversible et sûre, avec un sel ou une clé ; la CNIL mentionne scrypt et Argon2, cités par l'ANSSI. Enfin, le renouvellement périodique obligatoire est abandonné pour les comptes ordinaires et ne reste requis que pour les comptes à privilèges, de type administrateur.
Choisir son cas avant d'écrire une validation
La plupart des applications Rails relèvent du deuxième cas : un compte personnel, protégé par une limitation des tentatives. C'est le plus confortable pour les utilisateurs, à condition que la limitation existe vraiment et qu'elle soit documentée. À titre d'ordre de grandeur, et selon la formule habituelle (longueur multipliée par le logarithme en base 2 de la taille de l'alphabet), 8 caractères pris parmi les 99 symboles de l'exemple à 12 caractères donnent environ 53 bits ; c'est notre calcul, pas un exemple de la CNIL, qui propose sur son site un outil pour vérifier une politique. Une application sans aucune limitation tombe dans le premier cas et doit viser les 80 bits.
Un piège classique : imposer des règles de composition (« au moins un chiffre et un symbole ») sans longueur suffisante. La CNIL rappelle que toute règle de construction réduit l'espace des choix possibles, et que les mots du dictionnaire légèrement déformés sont les premiers testés par les attaquants. Une longueur minimale élevée et l'acceptation des phrases de passe sont généralement plus efficaces que des contraintes de composition.
Avec Devise
Devise reste la gem d'authentification la plus répandue ; c'est aussi celle que l'on retrouve le plus dans les applications Rails du secteur public. Son fichier d'initialisation généré, config/initializers/devise.rb, contient les réglages à revoir. Les valeurs ci-dessous ont été vérifiées dans le modèle du générateur de Devise (version 5.0.4 sur RubyGems.org le 10 novembre 2026).
- Longueur :
config.password_length = 6..128par défaut. Six caractères sont très en dessous de tous les cas de la CNIL. Passez à12..128si vous exigez aussi la diversité des caractères, à14..128sinon. - Blocage : le module
:lockablen'est pas activé par défaut. Dans l'initialiseur,config.maximum_attemptsest proposé en commentaire avec la valeur 20. Pour suivre l'exemple de la CNIL, activez:lockablesur le modèle (avec les colonnes que prévoit la migration de Devise pour ce module), décommentezconfig.lock_strategy = :failed_attemptset réglezconfig.maximum_attempts = 10. Le déblocage (config.unlock_strategy: par courriel, après un délai, ou les deux) doit tenir compte du risque qu'un tiers bloque volontairement le compte de quelqu'un d'autre. - Hachage : Devise utilise bcrypt, avec
config.stretches = 12hors environnement de test. bcrypt est une fonction lente, non réversible et salée ; la CNIL ne la nomme pas, mais elle ne dresse pas non plus de liste fermée. - Messages :
config.paranoid = true(commenté par défaut) rend identiques les réponses aux demandes de confirmation ou de réinitialisation, que l'adresse existe ou non, ce qui évite de révéler qui possède un compte.
# config/initializers/devise.rb
config.password_length = 12..128
config.lock_strategy = :failed_attempts
config.unlock_strategy = :both
config.maximum_attempts = 10
config.unlock_in = 1.hour
config.paranoid = true
La validation de longueur de Devise ne contrôle pas la diversité des caractères. Si vous choisissez l'exemple à 12 caractères, ajoutez une validation sur le modèle ou une gem dédiée, et testez-la.
Avec l'authentification générée par Rails 8
Depuis Rails 8, bin/rails generate authentication crée un modèle User, des sessions et la réinitialisation du mot de passe. Nous avons relu les modèles de la version 8.1.4.1, la plus récente le 10 novembre 2026.
- Le modèle appelle
has_secure_password, qui hache avec bcrypt et refuse les mots de passe de plus de 72 octets, limite de bcrypt. Aucune longueur minimale n'est imposée : c'est à vous d'ajouter, par exemple,validates :password, length: { minimum: 14 }, allow_nil: true. - Le contrôleur de sessions limite la création de session à 10 requêtes en 3 minutes (
rate_limit to: 10, within: 3.minutes), et le contrôleur de réinitialisation fait de même. Par défaut, ce compteur est calculé par adresse IP, pas par compte : il freine un attaquant isolé, beaucoup moins une attaque répartie sur de nombreuses adresses. Pour revendiquer le cas « avec restriction d'accès », ajoutez un compteur d'échecs par compte (une colonne et quelques lignes dans le contrôleur) ou une temporisation progressive. - Les 72 octets s'entendent en UTF-8 : une lettre accentuée en occupe deux. Une phrase de passe de 7 mots en français reste en général bien en dessous, mais un message d'erreur clair vaut mieux qu'un refus incompris.
Comptes administrateurs et journaux
Pour les comptes à privilèges, la CNIL maintient le renouvellement et considère qu'une authentification plus robuste qu'un simple mot de passe sera souvent nécessaire. Dans une application Rails, cela veut dire au minimum un second facteur pour l'interface d'administration ; notre guide des gems d'authentification (en anglais) compare les options.
Enfin, un mot de passe ne doit jamais apparaître dans les journaux. Le fichier config/initializers/filter_parameter_logging.rb généré par Rails 8.1 filtre déjà les paramètres contenant passw, token, secret ou email ; vérifiez qu'il n'a pas été vidé et qu'aucun outil tiers (suivi d'erreurs, journalisation des requêtes) ne recopie les paramètres bruts. La question de la durée de conservation de ces journaux est traitée dans notre article sur le RGPD, la suppression douce et l'historique des versions.
En résumé
- Choisissez explicitement votre cas CNIL (80, 50 ou 13 bits) et écrivez-le dans la documentation du projet.
- Remontez la longueur minimale : 6 caractères avec Devise par défaut, aucune avec le générateur de Rails 8.
- Mettez en place une vraie limitation par compte si vous visez le cas à 50 bits.
- Conservez un hachage lent et salé, et ne forcez plus le renouvellement que pour les administrateurs.
Article mis à jour le 10 novembre 2026. Il présente des réglages techniques et ne remplace pas l'analyse de conformité que le responsable de traitement doit mener pour son service.
Guides pratiquesRGPD, suppression douce et historique
Une ligne « supprimée » avec deleted_at reste en base active, et PaperTrail garde une copie de l'enregistrement détruit. Comment purger pour de bon.
Guides pratiquesRails pour l'administration : DSFR et ProConnect
Les composants du Système de design de l'État et la connexion ProConnect en Rails : les gems, leurs versions, et qui a le droit de s'en servir.
DonnéesRails dans le secteur public : les chiffres
143 dépôts Ruby recensés par code.gouv.fr, 33 applications Rails analysées : 9 sur Rails 8.1, 21 sur une série antérieure à 8.0. Méthode et CSV.