Algorithmes de génération de mots de passe mémorisables sur le plan phonétique

Contexte

Pendant que j’étais au gymnase, l’autre jour, je travaillais avec mon cadenas à combinaison et j’ai réalisé quelque chose qui me serait utile en tant que programmeur. À savoir, ma combinaison est composée de trois séries de chiffres distinctes qui sonnent de la même manière ou ont une autre relation qui les rend faciles à mémoriser. Par exemple, 5-15-25, 7-17-2, 6-24-5. Ces exemples semblent faciles à retenir.

Question

Comment pourrais-je implémenter quelque chose de similaire pour les mots de passe? Oui, ils devraient être difficiles à déchiffrer, mais ils devraient aussi être faciles à retenir pour l’utilisateur final. Les serrures à combinaison le font avec un mélange de nombres ayant des sons similaires et avec des nombres ayant des propriétés similaires (7-17-23: All Prime, 17 lancés directement après 7 et 23 est un autre premier et est (out) de cet ensemble), le «dur» à retenir).

Critères

  • Le mot de passe doit être facile à retenir. Dog!Wolf est facile à retenir, mais une fois qu’un attaquant sait que votre site Web offre cette combinaison, il est infiniment plus facile à vérifier.
  • Les mots ou les lettres doivent principalement suivre les mêmes sons (pour la plupart).
  • Au moins 8 lettres
  • N’utilisez pas !@#$%^&*();'{}_+?,./ Ces signes de ponctuation, bien que appropriés pour les mots de passe “durs”, n’ont pas de son “facile à retenir”.

Ressources

Cette question est indépendante de la langue, mais s’il existe une implémentation spécifique pour C #, je serais ravi de l’apprendre.

Mettre à jour

Quelques utilisateurs ont déclaré que «c’est une mauvaise sécurité de mot de passe». Ne supposez pas que c’est pour un site Web. Cela pourrait simplement être pour moi de créer une application qui génère des mots de passe selon ces règles. Voici un exemple.

Les lettres ACCLIMOP «coulent», et elles se trouvent être deux mots réguliers mis ensemble ( Acclimate et Mop ). De plus, lorsqu’un utilisateur dit ces lettres, ou les dit en tant que mot, c’est un mot réel pour elles. Facile à retenir, mais difficile à casser (attaque de dictionnaire, évidemment).

Cette question a un objective en deux parties:

  1. Construire des mots de passe à partir de lettres qui sonnent de manière similaire (en utilisant l’allitération) ou
  2. Construisez des mots de passe qui associent des mots communs de la même manière pour produire un troisième jeu de lettres qui ne figure pas dans un dictionnaire.

Vous voudrez peut-être regarder:

  • L’algorithme de génération de mot de passe prononçable utilisé par apg et expliqué dans FIPS-181
  • Koremutake

Assurez-vous tout d’abord que le mot de passe est long. Envisagez d’utiliser une “phrase de passe” au lieu d’un seul “mot de passe”. Briser les phrases comme “Les chiens et les loups se détestent”. est très difficile mais ils sont assez faciles à retenir.

Certains sites peuvent également vous donner des conseils utiles, tels que les mots de passe forts: comment les créer et les utiliser (liés depuis le vérificateur de mots de passe , qui est un outil utile en soi).

De plus, au lieu d’essayer de créer un mot de passe facile à mémoriser, dans certains cas, il est préférable d’éviter de vous souvenir du mot de passe en utilisant (et de former vos utilisateurs à utiliser) un utilitaire de gestion des mots de passe (voir Quel est votre stockage de mot de passe préféré)? tool? ) – en faisant cela, la seule partie qui rest est de créer un mot de passe difficile à craquer, ce qui est facile (toute phrase aléatoire suffisamment longue suffira).

Vous pouvez utiliser les chaînes de Markov pour générer des mots qui ressemblent à l’anglais (ou à toute autre langue que vous voulez), mais ce ne sont pas des mots réels.

La question de la facilité de mémorisation est vraiment subjective, donc je ne pense pas que vous puissiez écrire un algorithme comme celui-ci qui sera bon pour tout le monde.

Et pourquoi utiliser des mots de passe courts sur des sites Web / applications informatiques au lieu de mots de passe? Ils sont faciles à retenir mais difficiles à casser.

Je suis surpris que personne n’ait mentionné l’algorithme Multics décrit à l’ adresse http://www.multicians.org/thvv/gpw.html , qui est similaire à l’algorithme FIPS mais basé sur des sortinggraphes plutôt que sur des digraphes. Il produit une sortie telle que

 ahmouryleg thasylecta tronicatic terstabble 

J’ai également porté le code sur python: http://pastebin.com/f6a10de7b

Après plusieurs années, j’ai décidé d’utiliser la première lettre des mots dans une phrase secrète. Il est impossible de craquer, polyvalent en termes de longueur et de ressortingctions comme “vous devez avoir un chiffre” et des erreurs difficiles à faire.

Cela fonctionne en créant une phrase. Un sujet très amusant et amusant est utile! “Les extraterrestres Stack Overflow ont atterri sans utiliser de roquettes ou de roues”. Prenez la première lettre, votre mot de passe est “soalwurow”

Vous pouvez taper ceci rapidement et avec précision car vous ne vous souvenez plus de lettre par lettre, vous ne faites que prononcer une phrase dans votre tête.

J’aime aussi avoir des mots alternés du côté gauche et du côté droit du clavier, cela vous donne une vitesse de frappe légèrement plus rapide et un rythme plus agréable. Remarquez dans mon exemple, vos mains alternent gauche-droite-gauche-droite.

J’ai utilisé à quelques resockets un algorithme suivant:

  1. Mettez toutes les voyelles minuscules (de az) dans un tableau
  2. Mettez toutes les consonnes minuscules (de az) dans un autre tableau Consonne
  3. Créez un troisième tableau Paires de deux lettres de manière à créer toutes les paires de lettres possibles entre les voyelles et les consonnes (“ab”, “ba”, “ac”, etc.)
  4. Choisissez au hasard 3-5 éléments de paires et concaténez-les ensemble sous forme de chaîne
  5. Choisissez au hasard true ou false
    1. Si la valeur est true , supprimez la dernière lettre du mot de passe
    2. Si false , ne faites rien
  6. Remplacez 2 à 4 caractères choisis au hasard dans Password avec son équivalent en majuscule
  7. Remplacez 2-4 caractères choisis au hasard dans Mot de passe par un entier choisi au hasard 0-9

Voilá – vous devez maintenant avoir un mot de passe d’une longueur comprise entre 5 et 10 caractères, avec des caractères alphanumériques minuscules et majuscules. Avoir des voyelles et des consonnes à tour de rôle les rend souvent semi-prononcées et donc plus faciles à mémoriser.

FWIW J’aime bien brouiller les syllabes de mots pour un mot de passe facile mais essentiellement aléatoire. Prenez “Bongo” par exemple comme un mot aléatoire. Échangez les syllabes que vous obtenez “Gobong”. Échangez les o pour des zéros en haut (ou une autre substitution commune) et vous obtenez une séquence de caractères essentiellement aléatoire avec un tracé qui vous aide à vous en souvenir.

Maintenant, comment choisir les syllabes par programmation? C’est une toute autre question!

Lorsque vous générez un mot de passe pour l’utilisateur et que vous l’envoyez par courrier électronique, la première chose à faire lors de la première connexion, c’est de le forcer à modifier son mot de passe. Les mots de passe créés par le système n’ont pas besoin d’être faciles à retenir car ils ne devraient être nécessaires qu’une fois.

Avoir des mots de passe difficiles à deviner, faciles à deviner, est un concept utile pour vos utilisateurs, mais le système ne devrait pas le faire d’une manière ou d’une autre. Supposons que vous envoyez un mot de passe au compte gmail de votre utilisateur et que l’utilisateur ne modifie pas le mot de passe après la connexion. Si le mot de passe du compte gmail est compromis, le mot de passe de votre système est compromis.

Il n’est donc pas utile de générer des mots de passe faciles à mémoriser pour vos utilisateurs s’ils doivent changer le mot de passe immédiatement. Et s’ils ne le changent pas immédiatement, vous avez d’autres problèmes.

Je préfère donner aux utilisateurs un mot de passe “dur”, les obligeant à le changer lors de la première utilisation, et leur donner des conseils sur la façon de construire une bonne phrase longue. Je voudrais également coupler ceci avec les exigences raisonnables de complexité de mot de passe (8 caractères, mélange de majuscules / minuscules et ponctuation ou chiffres). Ma raison à cela est que les gens sont beaucoup plus susceptibles de se souvenir de quelque chose qu’ils choisissent eux-mêmes et moins susceptibles de l’écrire quelque part s’ils peuvent s’en souvenir.

Une idée de la phrase secrète consiste à prendre une phrase et à écrire les premières lettres de chaque mot dans la phrase. Par exemple

 "A specter is haunting Europe - the specter of communism." 

Devient

 asihe-tsoc 

Si la phrase est ponctuée, comme!,?, Etc. Même chose pour les nombres, ou simplement remplacer les lettres, ou append des numéros pertinents à la fin. Par exemple, Karl Marx (qui a dit cette citation) est mort en 1883, alors pourquoi pas «asihe-tsoc83»?

Je suis sûr qu’une attaque par force brute créative pourrait capitaliser sur les propriétés statistiques d’un tel mot de passe, mais il rest encore des ordres de grandeur plus sécurisés qu’une attaque par dictionnaire.


Une autre bonne approche consiste simplement à inventer des mots ridicules, par exemple «Barangamop». Après l’avoir utilisé plusieurs fois, vous le remettrez en mémoire, mais il est difficile de forcer. Ajoutez des chiffres ou des signes de ponctuation pour plus de sécurité, par exemple ‘386Barangamop!’

Voici la partie 2 de votre idée prototypée dans un script shell. Il faut 4, 5 et 6 mots de la lettre (environ 50 000) du fichier de dictionnaire Unix sur votre ordinateur et concaténer ces mots sur le premier caractère.

 #! /bin/bash RANDOM=$$ WORDSFILE=./simple-words DICTFILE=/usr/share/dict/words grep -ve '[^az]' ${DICTFILE} | grep -Ee '^.{4,6}$' > ${WORDSFILE} N_WORDS=$(wc -l < ${WORDSFILE}) for i in $(seq 1 20); do password="" while [ ! "${#password}" -ge 8 ] || grep -qe"^${password}$" ${DICTFILE}; do while [ -z "${password}" ]; do password="$(sed -ne "$(( (150 * $RANDOM) % $N_WORDS + 1))p" ${WORDSFILE})" builtfrom="${password}" done word="$(sort -R ${WORDSFILE} | grep -m 1 -e "^..*${password:0:1}")" builtfrom="${word} ${builtfrom}" password="${word%${password:0:1}*}${password}" done echo "${password} (${builtfrom})" done 

Comme la plupart des générateurs de mots de passe, je sortingche en les diffusant par séries de vingt. Ceci est souvent défendu en termes de "sécurité" (quelqu'un qui regarde par-dessus votre épaule), mais en réalité c'est juste un hack pour laisser l'utilisateur juste choisir le mot de passe le plus convivial.

J'ai trouvé les mots de 4 à 6 lettres du fichier de dictionnaire contenant toujours des mots obscurs.

Une meilleure source de mots serait un document écrit. J'ai copié tous les mots de cette page et les ai collés dans un document texte, puis j'ai exécuté les commandes suivantes pour obtenir les mots anglais.

 perl -pe 's/[^az]+/\n/gi' ./624425.txt | tr AZ az | sort -u > ./words ispell -l ./words | grep -Fvf - ./words > ./simple-words 

Ensuite, j'ai utilisé ces quelques 500 mots très simples de cette page pour générer les mots de passe suivants avec le script shell - le script indique entre parenthèses les mots constituant un mot de passe.

 backgroundied (background died) soundecrazy (sounding decided crazy) aboupper (about upper) commusers (community users) reprogrammer (replacing programmer) alliterafter (alliteration after) actualetter (actual letter) statisticrhythm (statistical crazy rhythm) othereplacing (other replacing) enjumbling (enjoying jumbling) feedbacombination (feedback combination) rinstead (right instead) unbelievabut (unbelievably but) createdogso (created dogs so) apphours (applications phrase hours) chainsoftwas (chains software was) compupper (computer upper) withomepage (without homepage) welcomputer (welcome computer) choosome (choose some) 

Certains résultats sont des gagnants.

Le prototype montre que cela peut probablement être fait, mais l'intelligence dont vous avez besoin concernant l'allitération ou les informations sur les syllabes nécessite une meilleure source de données que de simples mots. Vous auriez besoin d'informations de prononciation. Aussi, j'ai montré que vous vouliez probablement une firebase database contenant de bons mots simples à choisir, et pas tous les mots, pour mieux répondre à vos exigences de mot de passe mémorable.

Générer un mot de passe unique la première fois et à chaque fois - quelque chose dont vous avez besoin pour le Web - nécessite à la fois une meilleure source de données et une plus grande sophistication. Utiliser un meilleur langage de programmation que Bash avec des fichiers texte et utiliser une firebase database pourrait faire fonctionner ceci instantanément. En utilisant un système de firebase database, vous pouvez utiliser l’algorithme SOUNDEX, ou certains autres.

Idée soignée. Bonne chance.

Je suis complètement avec rjh. L’avantage d’utiliser simplement les lettres de début d’une phrase secrète est qu’elle semble aléatoire, ce qui rend difficile de se rappeler si vous ne connaissez pas la phrase derrière, au cas où Eve regarde par-dessus votre épaule lorsque vous tapez le mot de passe.
OTOH, si elle vous voit taper environ 8 caractères, dont «s» deux fois, puis «o» et «r», elle peut le deviner correctement la première fois.
Forcer l’utilisation d’au moins un chiffre n’aide pas vraiment; vous savez simplement que ce sera “pa55word” ou “passw0rd”.

Les paroles de chansons sont une source inépuisable de phrases de passe.

 "But I should have known this right from the start" 

devient “bishktrfts”. 10 lettres, même seulement les minuscules vous donnent 10 ^ 15 combinaisons, ce qui est beaucoup , surtout qu’il n’y a pas de raccourci pour le casser. (À 1 million de combinaisons par seconde, il faut 30 ans pour tester les 10 ^ 15 combinaisons.)
En supplément (dans le cas où Eve sait que vous êtes un fan de la police), vous pouvez échanger, par exemple, les 2ème et 3ème lettres, ou prendre la deuxième lettre du troisième mot. Des possibilités infinies.

Les mots de passe générés par le système sont une mauvaise idée pour autre chose que des comptes de service internes ou des réinitialisations temporaires (etc.).

Vous devez toujours utiliser vos propres “phrases de passe” faciles à mémoriser, mais quasiment impossibles à deviner ou à utiliser. Par exemple, le mot de passe de mon ancien compte universitaire était.

Here to study again!

C’est 20 caractères en majuscule et minuscule avec ponctuation. C’est un mot de passe incroyablement fort et il n’y a pas de logiciel qui pourrait générer un code plus sûr, plus facile à mémoriser pour moi.

Regardez l’ outil gpw . Le paquet est également disponible dans les repositorys Debian / Ubuntu.

Une façon de générer des mots de passe qui ressemblent à des mots serait d’utiliser une chaîne de Markov. Une chaîne de markov à n degrés est essentiellement un grand ensemble de n-uplets qui apparaissent dans votre corpus d’entrée, ainsi que leur fréquence. Par exemple, “aardvark”, avec une chaîne de markov au 2ème degré, générerait les tuples (a, a, 1), (a, r, 2), (r, d, 1), (d, v, 1) , (v, a, 1), (r, k, 1). En option, vous pouvez également inclure des jetons de mot de début et de mot final «virtuels».

Afin de créer une chaîne de Markov utile pour vos besoins, vous devez alimenter un large corpus de données en anglais – de nombreuses données sont disponibles, y compris, par exemple, le projet Gutenburg – pour générer un ensemble d’enregistrements comme indiqué ci-dessus. Pour générer des mots en langage naturel ou des phrases qui suivent au moins principalement des règles de grammaire ou de composition, une chaîne de markov du 3ème degré est généralement suffisante.

Ensuite, pour générer un mot de passe, vous choisissez un tuple «de départ» aléatoire de l’ensemble, pondéré par sa fréquence et vous produisez la première lettre. Ensuite, sélectionnez au hasard (encore une fois pondérée par la fréquence) un «prochain» tuple, c’est-à-dire qui commence par les mêmes lettres que votre actuel se termine, et n’a qu’une lettre différente. En utilisant l’exemple ci-dessus, supposons que je commence à (a, a, 1) et que je produise «a». Mon seul choix suivant est (a, r, 2), alors je produis un autre “a”. Maintenant, je peux choisir entre (r, d, 1) ou (r, k, 1), alors j’en choisis un au hasard en fonction de leur fréquence d’occurrence. Supposons que je sélectionne (r, k, 1) – je produis ‘r’. Ce processus se poursuit jusqu’à ce que vous atteigniez un marqueur de fin de mot ou que vous décidiez de vous arrêter indépendamment (puisque la plupart des chaînes de Markov forment un graphe cyclique, vous ne pouvez jamais finir de générer si vous n’appliquez pas de limitation de longueur artificielle).

Au niveau des mots (par exemple, chaque élément du tuple est un mot), cette technique est utilisée par certains «robots de conversation» pour générer des phrases insensées apparentes. Il est également utilisé par les spammeurs pour essayer d’éviter les filtres anti-spam. Au niveau de la lettre, comme indiqué ci-dessus, il peut être utilisé pour générer des mots sans sens, dans ce cas pour les mots de passe.

Un inconvénient: si votre corpus en entrée ne contient rien d’autre que des lettres, vos phrases de sortie ne le seront pas non plus, de sorte qu’elles ne répondent pas à la plupart des exigences de mot de passe «sécurisées». Vous voudrez peut-être appliquer un post-traitement pour remplacer certains caractères par des chiffres ou des symboles.

edit: Après avoir répondu, je me suis rendu compte que ce n’est absolument pas mémorable. En laissant la réponse quand même b / c je trouve ça intéressant. /modifier

Vieux fil, je sais … mais ça vaut le coup.

1) Je construirais probablement le plus grand dictionnaire possible. Disposez-les en seaux par une partie du discours.

2) Ensuite, construisez une grammaire qui peut faire plusieurs types de phrases. Le “type” de phrase est déterminé par des permutations de parties du discours.

3) Aléatoire (ou aussi aléatoire que possible), choisissez un type de phrase. Ce qui est retourné est un modèle avec des espaces réservés pour des parties du discours (nvn serait nom-verbe-nom)

3) Choisissez des mots au hasard dans chaque partie du groupe de discours pour remplacer les espaces réservés. Remplissez-les. (L’exemple ci-dessus pourrait devenir quelque chose comme car-ate-bicycle.)

4) balayer au hasard chaque caractère en décidant si vous souhaitez ou non le remplacer par un caractère (ou un jeu de caractères) au son similaire, ou un sosie similaire. C’est l’étape la plus difficile du problème.

5) mot de passe résultant serait quelque chose comme kaR @ tebyCICle

6) rire de résultats humoristiques comme ci-dessus qui ressemblent à “vélo de karaté”

J’aimerais vraiment voir quelqu’un implémenter des mots de passe avec des caractères de contrôle tels que ” +N ” ou même des combos comme ” A+C ” en même temps. À mon humble avis, convertir cela en un équivalent binary rendrait les exigences de mot de passe beaucoup plus faciles à retenir, à taper plus rapidement et à craquer (BEAUCOUP plus de combinaisons à vérifier).