L'attaque Markov (probabiliste) — Fonctionnement exhaustif

Document de référence pour le projet Time2Crack
Destinataires : développeurs, chercheurs en sécurité, utilisateurs avancés

Table des matières

  • Vue d'ensemble
  • Contexte historique et académique
  • Fondements mathématiques : les chaînes de Markov
  • Architecture d'un cracktool Markov
  • Phase 1 — Entraînement sur corpus de mots de passe réels
  • Phase 2 — Génération ordonnée de candidats
  • Réduction de l'espace de recherche : la clé de l'efficacité
  • Variantes et implémentations notables
  • Comportement face à différents types de mots de passe
  • Intégration dans Time2Crack : modélisation et paramètres
  • Comparaison avec les autres attaques probabilistes
  • Limites de l'attaque Markov
  • Défenses efficaces
  • Références bibliographiques

  • 1. Vue d'ensemble

    L'attaque Markov est une méthode de cracking de mots de passe probabiliste et statistique qui génère des candidats en s'appuyant sur les fréquences observées de transition entre caractères dans des mots de passe humains réels. Au lieu de tester toutes les combinaisons possibles dans l'ordre alphabétique — comme le fait la force brute —, elle trie les candidats du plus probable au moins probable, concentrant l'effort de calcul là où les mots de passe humains se trouvent réellement.

    En termes simples : un attaquant qui dispose de suffisamment de GPU et d'un modèle Markov bien entraîné testera "letmein", "p@ssword" et "soleil2024" avant de tester "aaaaaa", "aaaaab" ou "xqzfkw" — car les humains créent des mots de passe qui ressemblent à des mots, pas à du bruit blanc. Efficacité mesurée : les recherches de Dürmuth et al. (2015) sur le corpus RockYou (14 millions de mots de passe) montrent qu'un modèle Markov d'ordre 5 réduit l'espace de recherche effectif à 0,6 % de l'espace brut pour les mots de passe de structure humaine typique — soit une réduction de 99,4 %.

    2. Contexte historique et académique

    2.1 Origines

    L'application des chaînes de Markov au cracking de mots de passe est antérieure aux publications académiques formelles. Les praticiens de la sécurité offensive utilisaient des modèles similaires dès les années 2000, mais la formalisation rigoureuse date principalement des années 2010.

    Chronologie des jalons : AnnéeÉvénement ------------------ 2005Nakashima & Oyama : première application formelle de modèles n-grammes aux mots de passe 2009Weir et al. (IEEE S&P) : PCFG — concurrent direct, positionne les probabilités structurelles 2012Ma et al. (USENIX Security) : étude comparative des modèles probabilistes sur 70M mots de passe 2013Durmuth : premières analyses OMEN sur plusieurs corpus 2015Dürmuth, Angelstorf, Horsch, Nürnberger, Rüegge : OMEN (ESORICS 2015) — référence académique majeure 2016Wheeler (zxcvbn) confirme l'efficacité des n-grammes dans l'estimation d'entropie réelle 2018OMEN+ : version améliorée avec smoothing et interpolation 2019–2022Travaux hybrides Markov + réseaux neuronaux (PassGAN, FuzzyPSM)

    2.2 Corpus de référence

    L'entraînement des modèles Markov repose sur des bases de données de mots de passe issus de fuites de données connues :

  • LinkedIn (2012) : 6,5 millions de hashes SHA-1 non salés (dont 4,4M crackés)
  • Adobe (2013) : 153 millions d'identifiants (hashes 3DES — crackés par analyse de fréquence)
  • Collection #1–5 (2019) : 2,7 milliards de paires identifiant/mot de passe
  • Have I Been Pwned (2024) : ~14 milliards de credentials uniques agrégés
  • Ces corpus révèlent la distribution statistique réelle des mots de passe humains, qui diffère radicalement d'une distribution uniforme.


    3. Fondements mathématiques : les chaînes de Markov

    3.1 Définition formelle

    Une chaîne de Markov d'ordre k sur un alphabet Σ modélise la probabilité de chaque caractère en fonction des k caractères précédents :

    P(cₙ | c₁c₂...cₙ₋₁) = P(cₙ | cₙ₋ₖ...cₙ₋₁)

    Pour les mots de passe, Σ comprend généralement les 95 caractères ASCII imprimables (26 minuscules + 26 majuscules + 10 chiffres + 33 symboles).

    Ordre 1 (bigramme) :
    P("password") = P("p") × P("a"|"p") × P("s"|"a") × P("s"|"s") × ...
    Ordre 5 (optimal selon Dürmuth 2015) :
    P("password") = P("p") × P("a"|"p") × P("s"|"pa") × P("s"|"pas")
                    × P("w"|"pass") × P("o"|"passw") × P("r"|"passwo")
                    × P("d"|"passwor")

    L'ordre 5 capture des contextes comme « après "passw", la suite la plus probable est "o" » — information inaccessible à un modèle d'ordre 1.

    3.2 La matrice de transition

    Pour un ordre 1 sur 95 caractères, la matrice de transition est de taille 95 × 95 = 9 025 entrées. Pour l'ordre 5, elle passe à 95⁵ × 95 = ~7,7 × 10¹⁰ entrées théoriques — mais la majorité des n-grammes d'ordre 5 n'apparaissent jamais dans les données réelles. Les implémentations utilisent des structures de données creuses (tries, hash maps) pour ne stocker que les n-grammes observés.

    3.3 Probabilité logarithmique et tri

    Pour éviter les sous-débordements flottants sur des mots de passe de 8+ caractères (probabilités de l'ordre de 10⁻²⁰), les outils travaillent en log-probabilités :

    log P("password") = log P("p") + log P("a"|"p") + log P("s"|"a") + ...

    Cette valeur constitue le score Markov du candidat. Les candidats sont générés par ordre décroissant de score, c'est-à-dire du plus probable au moins probable.

    3.4 Pourquoi l'ordre 5 ?

    Les recherches empiriques (Dürmuth 2015, confirmées par Ma et al. 2012) montrent que :

  • Ordre 1 : capte les fréquences de caractères individuels (e, a, o fréquents en minuscules), réduction ~50 %
  • Ordre 2 : capte les bigrammes communs (pa, ss, wo, rd), réduction ~75 %
  • Ordre 3 : capte les trigrammes (pas, ass, ssw), réduction ~90 %
  • Ordre 4 : diminishing returns commencent, réduction ~95 %
  • Ordre 5 : optimum empirique sur RockYou, réduction ~99,4 %
  • Ordre 6+ : overfitting, le modèle mémorise les mots de passe d'entraînement sans généraliser

  • 4. Architecture d'un cracktool Markov

    4.1 Composants principaux

    ┌─────────────────────────────────────────────────────────────┐
    │                    OUTIL DE CRACKING MARKOV                 │
    ├─────────────────┬───────────────────┬───────────────────────┤
    │  Phase          │  Composant        │  Rôle                 │
    ├─────────────────┼───────────────────┼───────────────────────┤
    │  Entraînement   │ Corpus Parser     │ Lit les mots de passe │
    │                 │ N-gram Counter    │ Compte les transitions│
    │                 │ Probability Table │ Normalise en probas   │
    │                 │ Model Serializer  │ Sauvegarde le modèle  │
    ├─────────────────┼───────────────────┼───────────────────────┤
    │  Génération     │ Candidate Gen     │ Énumère par score     │
    │                 │ Length Controller │ Filtre par longueur   │
    │                 │ Threshold Filter  │ Coupe les improbables │
    ├─────────────────┼───────────────────┼───────────────────────┤
    │  Attaque        │ Hash Engine       │ Compare aux cibles    │
    │                 │ GPU Interface     │ Hashcat backend       │
    └─────────────────┴───────────────────┴───────────────────────┘

    4.2 Intégration avec Hashcat

    L'implémentation la plus répandue en pratique est via le mode stdin de Hashcat (-a 0 avec un générateur externe) ou via des modules Python comme statsgen (du toolkit PACK) :

    # Exemple d'attaque Markov pratique
    python statsgen.py rockyou.txt --output markovmodel.stats
    python maskgen.py markovmodel.stats | hashcat -a 0 -m 1000 targethashes.txt

    Des outils dédiés comme OMEN (Open Markov Estimator of Next passwords) génèrent directement des listes de candidats triés.


    5. Phase 1 — Entraînement sur corpus de mots de passe réels

    5.1 Extraction des n-grammes

    Pour chaque mot de passe du corpus, on extrait tous les n-grammes (avec un marqueur de début ^ et de fin $) :

    Exemple avec "hello" (ordre 2) :

    ^h, he, el, ll, lo, o$

    Exemple avec "P@ss1!" (ordre 2) :

    ^P, P@, @s, ss, s1, 1!, !$

    5.2 Comptage et normalisation

    Pour chaque contexte (n-1 caractères précédents), on compte les occurrences de chaque caractère suivant, puis on normalise :

    Contexte "pa" → {s: 847, r: 12, t: 8, l: 3, ...}
    → P(s|pa) = 847/870 = 0.973
    → P(r|pa) = 12/870 = 0.014

    Ces distributions révèlent les habitudes linguistiques humaines : après "pa", les gens écrivent massivement "s" (password, pass, pablo...).

    5.3 Smoothing (lissage)

    Le problème des n-grammes non observés : si "xq" n'apparaît jamais dans le corpus, P(c|xq) = 0 pour tout c — ce qui bloque la génération. Les techniques de lissage les plus utilisées :

  • Add-one (Laplace) : ajouter 1 à tous les comptes
  • Good-Turing : redistribuer la probabilité des n-grammes vus une seule fois vers ceux jamais vus
  • Kneser-Ney : méthode de l'état de l'art, utilisée dans OMEN+
  • Le lissage permet aussi au modèle de générer des candidats hors du corpus d'entraînement — crucial pour couvrir des mots de passe légèrement inédits.

    5.4 Ce que le modèle apprend

    Après entraînement sur RockYou, un modèle Markov d'ordre 5 internalise des patterns comme :

  • Suffixes numériques : les chiffres apparaissent massivement en fin de mot de passe (→ "123", "2024", "1!")
  • Débuts courants : "pa", "my", "lo", "ch", "123", "abc" sont des débuts fréquents
  • Majuscule initiale : la majuscule en première position est beaucoup plus probable qu'en milieu de chaîne
  • Symboles rares en milieu : "@", "#", "!" apparaissent surtout en remplacement de lettres ou en suffixe
  • Répétitions humaines : "aa", "ll", "ee" sont plus fréquents que des doublons de consonnes rares

  • 6. Phase 2 — Génération ordonnée de candidats

    6.1 Le problème de l'énumération par score

    Générer les candidats par ordre décroissant de probabilité Markov est un problème non trivial. On ne peut pas simplement calculer les probabilités de tous les candidats possibles (94⁸ ≈ 6 × 10¹⁵ pour 8 chars) puis les trier.

    La solution : recherche heuristique avec priority queue (file de priorité). L'algorithme s'apparente à Dijkstra :

  • Initialiser la file avec les débuts les plus probables (^a, ^p, ^1...)
  • À chaque étape, dépiler le candidat partiel le plus probable
  • L'étendre avec chaque caractère possible, calculer le score du candidat étendu
  • Si longueur cible atteinte, émettre le candidat
  • Sinon, remettre en file
  • Cette approche garantit un tri approximativement décroissant sans mémoriser l'intégralité de l'espace.

    6.2 Seuil de coupure (threshold)

    Pour éviter de générer des milliards de candidats improbables, on définit un score minimal en dessous duquel un candidat partiel est éliminé (élagage). Concrètement :

    Si log P(candidatpartiel) < THRESHOLD → abandon de cette branche

    Le threshold est un paramètre critique : trop haut → on rate des mots de passe à la limite ; trop bas → on génère trop de candidats et on ralentit l'attaque.

    6.3 Gestion des longueurs

    Les modèles Markov sont entraînés et opèrent généralement par longueur fixée. Une attaque typique :

  • Longueur 6 : générer N candidats par ordre de probabilité décroissante
  • Longueur 7 : idem
  • Longueur 8 : idem (longueur la plus courante dans les corpus)
  • Longueurs 9-12 : couverture décroissante
  • La distribution des longueurs dans RockYou : 8 chars = 24 %, 7 chars = 21 %, 9 chars = 12 %, 6 chars = 10 %...


    7. Réduction de l'espace de recherche : la clé de l'efficacité

    7.1 Quantification empirique (Dürmuth 2015)

    Pour un mot de passe de 8 caractères avec l'alphabet complet (94 chars) :

    MéthodeEspace de rechercheFacteur de réduction --------------------------------------------------- Brute force94⁸ ≈ 6 × 10¹⁵1× (référence) Markov ordre 1~3 × 10¹⁵~2× Markov ordre 3~6 × 10¹³~100× Markov ordre 5~3,6 × 10¹⁰~166 000× Markov ordre 5 (humain typique)~4 × 10⁷~150 millions×

    La différence entre "espace réduit" et "espace humain typique" s'explique par le fait que les mots de passe humains réels se concentrent dans les top-k% les plus probables selon le modèle.

    7.2 Pourquoi les humains sont prévisibles

    Les facteurs de prévisibilité exploités par Markov :

    Contraintes linguistiques : les mots de passe dérivent de mots existants. "letmein", "sunshine", "iloveyou" suivent des règles phonotactiques de l'anglais — les transitions de lettres sont hautement probables. Contraintes cognitives : les humains mémorisent mal les séquences vraiment aléatoires. Un mot de passe aléatoire comme "xqzfw9@" est rarement choisi spontanément. Patterns culturels : années (1990-2024), prénoms communs, équipes sportives, personnages de films... Ces patterns créent des clusters de haute densité dans l'espace des mots de passe. Substituations prévisibles : a→@, e→3, i→1, o→0, s→5 sont des mutations si communes qu'elles font partie du modèle. Après "p", "a" et "@" ont des probabilités similaires. Position des chiffres et symboles : les chiffres en fin de mot de passe (passwd123) sont 10× plus fréquents que les chiffres en début. Les symboles en suffixe (passwd!) sont 5× plus fréquents qu'en position centrale.

    7.3 Le cas des patterns clavier

    Les séquences clavier (qwerty, asdf, zxcv, 1234, azerty...) sont particulièrement vulnérables. Pour ces patterns :

  • Les transitions de caractères suivent les contraintes de la topologie clavier
  • Depuis chaque touche, seulement 4-8 voisins immédiats sont pertinents
  • Un modèle Markov entraîné sur des corpus incluant ces patterns atteint une réduction de 99,7 % (vs 99,4 % pour les mots humains généraux)
  • Dans Time2Crack (version actuelle), cette distinction n'est plus un palier fixe. Le modèle Markov v2 intègre kbPat comme signal dans un estimateur de rang (markovExpectedGuesses) puis interpole continûment entre régime "human-like" et "random-like".


    8. Variantes et implémentations notables

    8.1 OMEN (Open Markov Estimator of Next passwords)

    Développé par : Dürmuth, Angelstorf, Horsch, Nürnberger, Rüegge (ESORICS 2015) Disponibilité : Open source (GitHub) Innovation principale : ordonnancement optimisé par score de niveau (enumeration par paliers de probabilité)

    OMEN utilise une discrétisation des probabilités en niveaux entiers pour accélérer la génération :

  • Chaque n-gramme reçoit un score entier (0 = très probable, 10 = improbable)
  • La somme des scores d'un mot de passe est son score global
  • Les mots de passe sont générés en ordre croissant de score global
  • Cette approche résout élégamment le problème de l'énumération ordonnée sans priority queue coûteuse.

    8.2 OMEN+

    Extension de OMEN avec :

  • Smoothing Kneser-Ney pour une meilleure généralisation
  • Interpolation multi-ordre : combine les prédictions d'ordre 3, 4 et 5
  • Adaptation du threshold basée sur la distribution empirique du corpus
  • Performance rapportée : +15 à +20 % de mots de passe crackés vs OMEN original à budget égal.

    8.3 Statsgen / PACK (Password Analysis and Cracking Kit)

    Développé par : Peter Kacherginsky (iphelix) Approche : plus légère que OMEN, génère des masks et des stats compatibles Hashcat Utilisation typique : analyse d'un ensemble de mots de passe crackés pour adapter les futurs attaques

    8.4 JohnTheRipper — mode Markov

    JohnTheRipper intègre un mode Markov natif (développé par Samuele Giovanni Tonon) :

    john --markov --min-length=6 --max-length=8 hashes.txt

    Paramètre --markov-threshold (0-400) : contrôle le seuil de coupure. 150 = paramètre standard recommandé.

    Le mode Markov de JtR utilise des statistiques précalculées stockées dans des fichiers .mkv (markov stats files) générés par calcstat.

    8.5 Modèles Markov hybrides

    Markov + règles : générer des candidats Markov, puis appliquer des règles de transformation Hashcat Markov + dictionnaire : utiliser les mots de passe Markov comme base pour des attaques hybrides Markov + PCFG : combiner l'ordre probabiliste Markov avec la contrainte structurelle PCFG

    Ces hybridations sont utilisées dans des configurations de cracking professionnelles pour maximiser la couverture à budget CPU/GPU fixé.

    8.6 Modèles de langage modernes (LLM/LSTM) — successeurs de Markov

    Les réseaux LSTM et Transformer peuvent être vus comme des généralisations des chaînes de Markov :

  • Markov d'ordre k = fenêtre de contexte fixe de k tokens
  • LSTM = fenêtre de contexte variable et non bornée (mémoire à long terme)
  • Transformer = attention globale sur toute la séquence
  • PassGAN (2017), FLA (2019), PassBERT (2022) surpassent les modèles Markov classiques de 20-30 % en taux de crack sur des corpus modernes.


    9. Comportement face à différents types de mots de passe

    9.1 Mots de passe issus de mots naturels

    Exemples : sunshine, letmein, dragon, iloveyou Vulnérabilité : extrême Mécanisme : le modèle assigne de très hautes probabilités aux séquences de l'anglais courant. Ces mots apparaissent dans le top 0,001 % des candidats générés. Temps : millisecondes sur MD5/SHA-1

    9.2 Mots avec substituations leetspeak

    Exemples : p@ssw0rd, L3tm3In, $unsh1ne Vulnérabilité : élevée Mécanisme : le modèle a appris que "@" suit souvent "p" (car "p@ss..." est très fréquent dans le corpus), que "0" suit souvent "w" (w0rd...), etc. Les substituations les plus communes sont intégrées dans les probabilités de transition. Temps : secondes à minutes

    9.3 Mots avec suffixe numérique

    Exemples : password123, sunshine2024, dragon1! Vulnérabilité : élevée Mécanisme : les suffixes numériques sont si fréquents que le modèle a une forte probabilité pour les transitions lettre→chiffre en fin de séquence. "123", "1", "2024", "12" sont les suffixes les plus probables. Temps : secondes à quelques minutes

    9.4 Prénoms et noms propres

    Exemples : Thomas92, AnneM@rie, NICOLAS Vulnérabilité : modérée à élevée Mécanisme : les prénoms courants (en anglais) sont bien représentés dans les corpus de référence. Les prénoms moins courants dans les corpus anglophones (prénoms français, polonais...) bénéficient moins du modèle. Temps : minutes à heures selon la popularité du prénom

    9.5 Mots de passe de structure aléatoire apparente mais mnémotechnique

    Exemples : Tr0ub4dor&3 (de l'article XKCD), Il0v3myC@t! Vulnérabilité : modérée Mécanisme : ces mots de passe ont une structure humaine (mot de base + substituions + suffixe), mais la base et les transformations spécifiques ne sont pas dans le top-k des candidats Markov. Le modèle finira par les atteindre, mais ils tombent dans les 10-30 % de l'espace. Temps : heures à jours selon longueur et algorithme de hachage

    9.6 Patterns clavier

    Exemples : qwerty, 1234567, azerty, qweasdzxc Vulnérabilité : extrême (pire encore que les mots naturels) Mécanisme : les transitions clavier sont tellement représentées dans les corpus que le modèle les classe parmi les premiers milliers de candidats — parfois les premiers dizaines. Temps : microsecondes à millisecondes

    9.7 Mots de passe véritablement aléatoires

    Exemples : xQz7@mK9, 4#pL$2nR, kRf9!Ws3 Vulnérabilité : faible à nulle Mécanisme : les transitions de caractères dans ces mots de passe ont de très faibles probabilités dans un modèle entraîné sur des mots de passe humains. Ils se retrouvent dans les derniers pourcentages de l'espace généré. Comportement : l'attaque Markov ne présente aucun avantage sur la force brute. Le réel "coût" de sécurité est l'entropie brute. Temps : comparable ou supérieur à la force brute

    9.8 Passphrases

    Exemples : horse-battery-staple-correct, monchienestlouisXIV Vulnérabilité : variable Mécanisme complexe :
  • Un modèle Markov peut capturer des transitions inter-mots dans une passphrase courte (2 mots) si ces combinaisons sont communes dans le corpus
  • Mais pour des passphrases longues (4+ mots), l'espace de candidats ordonné par Markov ne les atteindra qu'après avoir épuisé tous les mots de passe courts typiques
  • L'attaque combinator est généralement plus efficace que Markov sur les passphrases

  • 10. Intégration dans Time2Crack : modélisation et paramètres

    10.1 Logique générale de calcul (v2)

    Time2Crack modélise désormais Markov en rang attendu (rank-based) plutôt qu'avec des facteurs fixes de réduction.

    Pipeline de calcul :

  • tokenisation Unicode en segments L/D/S,
  • estimation d'un rang humain via squelette + forme + rangs de tokens,
  • modulation par signaux structurels (kbPat, seq, dt, rep, hybridVuln),
  • interpolation continue vers un régime "random-like" selon charset et longueur,
  • conversion en temps via budgetTime(rangestime, vitessehachage).
  • 10.2 Tokenisation Unicode et profil calibré par langue

    Le modèle Markov v2 utilise des classes Unicode (\p{L}, \p{N}, sinon symbole) et un profil calibré par langue (chargé depuis data/markov-calibration.json, avec fallback interne).

    Le profil contient :

  • skeletonRanks (L8D2, L8D2S1, ...),
  • shapeRanks (LD, LDS, ...),
  • tokenRanks par classe/longueur,
  • multiplicateurs linguistiques (shapeMultipliers),
  • multiplicateurs de signaux (signalMultipliers).
  • 10.3 Interpolation continue (fin des seuils abrupts)

    L'ancien modèle utilisait des paliers (0.003 / 0.006 / 0.25 / 0.9). Le modèle v2 remplace cette logique par une interpolation continue entre :

  • humanRank (zone structurelle probable),
  • randomRank (zone proche du brut, bornée).
  • Le poids "random" est une fonction continue de la longueur, du charset et de la force des signaux humains, ce qui évite les discontinuités artificielles.

    10.4 Score de confiance et d'applicabilité

    Le modèle de scoring de Time2Crack (fonction annotateScenarioApplicability()) attribue à Markov :

    Confiance de base : 0.75 (ligne 4800) Interprétation : l'attaque Markov est considérée comme modérément fiable — plus fiable que l'estimation neurale (0.7) ou PRINCE (0.7), moins que le dictionnaire (0.9) ou les rainbow tables (0.95). Score d'applicabilité (ligne 4873-4874) :
    case "markov":
      return context.looksHuman ? 0.76 : 0.34;
  • looksHuman = true → score 0.76 : l'attaque Markov est très applicable, le modèle va exploiter les régularités humaines
  • looksHuman = false → score 0.34 : applicable mais sans avantage majeur sur brute force
  • Evidence score (ligne 4829-4830) :
    case "markov":
      return Number(!!context.looksHuman) + Number(!!context.kbPat)
           + Number(!!context.seq)        + Number(!!context.rep);
    Chaque signal de "caractère humain" du mot de passe incrémente le score d'évidence de Markov.

    10.5 Ajustement HF

    Avec Markov v2, les signaux structurels sont déjà intégrés dans le rang estimé. L'ajustement HF est donc neutre pour Markov afin d'éviter le double comptage.

    10.6 Priorité dans le tiebreak

    Quand plusieurs attaques donnent des temps similaires (< 1ms de différence), Time2Crack choisit la plus pertinente selon une priorité sémantique :

    const tieBreakPriority = {
      // ...
      markov: 8,    // Statistical n-gram — broad coverage
      // ...
    };

    Markov est une attaque complément utile qui exploite les régularités statistiques. Elle prime sur la force brute pour les mots de passe avec structure humaine, mais cède le pas aux attaques dictionnaire et hybride qui sont plus directes.

    10.7 Cas ultra-weak

    Pour les mots de passe ultra-faibles (détectés par isWeakPassword()), Markov utilise un temps basé sur un rang minimal (weakGuessTime) plutôt qu'une constante fixe :

    if (weak) {
      rows.push({ ..., sec: weakGuessTime(a.rate), note: t("nWeakPassword"), cat: "markov" });
    }

    Raisonnement : un mot de passe ultra-faible (password, 123456, qwerty...) est dans le top-100 absolu de l'espace Markov — il sera testé en premier, la précision du calcul est sans intérêt.


    11. Comparaison avec les autres attaques probabilistes

    11.1 Markov vs PCFG

    DimensionMarkovPCFG ------------------------- Unité d'analyseTransitions de caractères individuelsStructures de segments (L/D/S) Information capturéeRégularités locales (n-gram)Régularités globales (grammaire) Force surMots naturels, patterns continusMots + chiffres, structures composites LimiteNe capte pas les structures globalesNe capte pas les transitions locales ComplémentaritéIdéal pour mots pursIdéal pour Password123 Exemple optimal"sunshine""Sunshine#93" Ordre dans Time2CrackMarkov = 8, PCFG = 6PCFG plus précis si structure détectée

    11.2 Markov vs Attaque par règles (Rule-based)

    DimensionMarkovRule-based ------------------------------- ApprocheGénération ab initio probabilisteTransformation d'un dictionnaire existant CouvertureTous les mots de passe probablesMutations des mots du dictionnaire Force surMots rares ou légèrement hors dictionnaireTransformations classiques de mots connus LimiteMoins efficace que dict+rules pour les mutations courantesDépend entièrement de la qualité du dictionnaire

    11.3 Markov vs Réseaux neuronaux (PassGAN, LSTM)

    DimensionMarkov (ordre 5)Réseau neuronal --------------------------------------------- ComplexitéO(k ×Σ) par prédictionO(n² × d) (Transformer) Données requises1-10M exemples suffisent10M-1B pour de bons résultats InterprétabilitéTotale (tables de probabilités)Boîte noire GénéralisationLimitée au contexte local kPotentiellement globale Taux de crackRéférence+20-30% sur mots de passe modernes Vitesse de générationTrès rapidePlus lent

    11.4 Positionnement global

    Dans un workflow de cracking professionnel, l'ordre typique est :

  • Dictionnaire (credlist) — mots de passe exacts connus
  • Credential stuffing — paires identifiant/mdp réutilisés
  • Password spraying — top-20 communs
  • Hybrid — dico + règles Hashcat
  • PCFG — si structure L+D détectée
  • Mask — si pattern positionnel détecté
  • Markov — couverture statistique générale
  • Neural — si budget disponible
  • Brute force — dernier recours
  • Markov est souvent la ligne de fond avant brute force : il couvre efficacement les mots de passe humains qui ont échappé aux attaques plus ciblées.


    12. Limites de l'attaque Markov

    12.1 Dépendance au corpus d'entraînement

    Le modèle est aussi bon que son corpus. Un corpus dominé par les mots de passe anglais (RockYou, LinkedIn) capture mal les régularités :

  • Des mots de passe en langues à haute densité morphologique (polonais, tchèque, finnois)
  • Des mots de passe basés sur des cultures non représentées (mandarin translittéré, arabe romanisé)
  • Des mots de passe issus de domaines spécialisés absents des fuites (argot médical, jargon technique rare)
  • Solution partielle : entraîner des modèles spécifiques par langue et domaine (approche nécessitant des corpus diversifiés).

    12.2 Indépendance inter-positions à grande distance

    Un modèle Markov d'ordre 5 ne voit pas au-delà de 5 caractères. Pour un mot de passe de 12 caractères, il ne peut pas corréler le 12ème caractère avec le 1er. Une passphrase comme "stargate2004!" a une structure globale ("mot + année + !") que Markov perçoit localement mais pas globalement — PCFG est meilleur ici.

    12.3 Insensibilité aux structures compositionnelles

    "HorseStapleBattery" (majuscule initiale + 3 mots concaténés) est difficile pour Markov car les transitions inter-mots (e→S, e→B) sont inattendues. L'attaque combinator ou PCFG est mieux adaptée.

    12.4 Inefficacité sur mots de passe aléatoires

    Un mot de passe généré par /dev/urandom avec 12+ caractères alphanumériques n'a aucune structure exploitable par Markov. Le temps d'attaque Markov converge vers la force brute.

    12.5 Sensibilité aux mises à jour de politique de mots de passe

    Si une organisation a imposé des règles strictes (longueur ≥ 16, obligatoirement 1 majuscule + 1 chiffre + 1 symbole), les mots de passe résultants peuvent avoir une distribution différente des corpus d'entraînement — réduisant l'efficacité du modèle.


    13. Défenses efficaces

    13.1 Ce qui neutralise complètement Markov

    Générateurs de mots de passe aléatoires : tout gestionnaire de mots de passe (Bitwarden, 1Password, KeePass) avec un générateur cryptographiquement sûr produit des séquences sans structure exploitable par Markov. Un mot de passe de 16 caractères aléatoires est hors de portée pratique quelle que soit l'attaque. Longueur suffisante avec aléatoire : même avec un charset réduit (a-z uniquement), 16 caractères aléatoires représentent 26^16 ≈ 4 × 10²² combinaisons — Markov ne réduit pas significativement un espace déjà aléatoire.

    13.2 Ce qui diminue fortement l'efficacité de Markov

    Passphrases longues de mots rares : 4+ mots peu fréquents séparés sont hors du top des candidats Markov, surtout si les mots viennent de langues différentes ou de vocabulaires spécialisés. Éviter les substituions leetspeak communes : les substituions a→@, e→3, etc. sont intégrées dans le modèle. En revanche, des transformations non standard (a→∂, e→ε) ne le sont pas. Éviter les patterns clavier et les mots naturels : la vulnérabilité maximale de Markov.

    13.3 Ce qui ne défend pas contre Markov

    Complexity requirements (majuscule + chiffre + symbole) : si ces éléments sont ajoutés à un mot naturel (P@ssw0rd!), le modèle capture ces patterns. La complexité imposée crée de la fausse sécurité perçue. Substitutions leetspeak basiques : entièrement capturées par le modèle (transitions "@"→"s", "3"→"y"...). Suffixes/préfixes numériques : les patterns "mot + 123" ou "mot + 2024" sont parmi les premiers testés.

    13.4 Recommandation finale

    La défense la plus efficace contre Markov (et toute attaque probabiliste) est d'éliminer toute structure humaine prévisible, ce qui revient à déléguer la création de mots de passe à un générateur aléatoire sécurisé.


    14. Références bibliographiques

    Académiques (peer-reviewed)

    Dürmuth, M., Angelstorf, F., Horsch, J., Nürnberger, S., & Rüegge, A. (2015). OMEN: Faster Password Guessing Using an Ordered Markov Enumerator. Engineering Secure Software and Systems (ESSoS 2015), LNCS 8978, pp. 119–132. → Référence principale pour la calibration probabiliste Markov utilisée dans Time2Crack (RockYou 14M, ordre 5) Ma, J., Yang, W., Luo, M., & Li, N. (2014). A Study of Probabilistic Password Models. IEEE Symposium on Security and Privacy (S&P 2014). → Comparaison empirique Markov, PCFG, n-grammes sur 70M mots de passe Weir, M., Aggarwal, S., de Medeiros, B., & Glodek, B. (2009). Password Cracking Using Probabilistic Context-Free Grammars. IEEE Symposium on Security and Privacy (S&P 2009). → Travail fondateur sur les méthodes probabilistes structurelles (concurrent de Markov) Wheeler, D. L. (2016). zxcvbn: Low-Budget Password Strength Estimation. 25th USENIX Security Symposium. → Confirme l'efficacité des n-grammes pour l'estimation réaliste de force des mots de passe Pasquini, D., Cianfriglia, M., Ateniese, G., & Bernaschi, M. (2021). Reducing Bias in Modeling Real-World Password Strength via Deep Learning and Dynamic Dictionaries. 30th USENIX Security Symposium. → Comparaison quantitative Markov vs deep learning sur corpus modernes Hitaj, B., Gasti, P., Ateniese, G., & Perez-Cruz, F. (2019). PassGAN: A Deep Learning Approach for Password Guessing. ACNS 2019. → Successeur neural de Markov, point de comparaison pour Time2Crack descNeural

    Implémentations open source

    OMEN : https://github.com/RUB-SysSec/OMEN JohnTheRipper (mode Markov) : https://www.openwall.com/john/doc/MARKOV.shtml PACK (statsgen/maskgen) : https://github.com/iphelix/pack Hashcat : https://hashcat.net/hashcat/ (backend GPU pour tous les outils cités)

    Sources de corpus

    RockYou (2009) : 14,3M mots de passe issus de la faille du réseau social RockYou Have I Been Pwned : https://haveibeenpwned.com — ~14 milliards de credentials agrégés (Troy Hunt) SecLists : https://github.com/danielmiessler/SecLists — dictionnaires et wordlists de référence

    Sources web citées dans l'application Time2Crack

    Springer (chapitre Markov/probabilistic cracking). https://link.springer.com/chapter/10.1007/978-3-319-24174-67 → Source liée dans descMarkov (app.js) pour la réduction effective de l'espace de recherche par priorisation statistique.
    Document généré pour le projet Time2Crack — dernière mise à jour : 2026-04-01 Basé sur l'implémentation dans app.js (Markov v2 rank-based) et les publications académiques citées