Qu'est-ce qu'un bon one-liner pour générer un mot de passe facilement mémorisable, comme l'agrafe de batterie de cheval correcte de xkcd ou une graine Bitcoin?
EDIT 1 :
Ce n'est pas la même chose que générer une chaîne aléatoire car les chaînes aléatoires ne sont pas du tout mémorisables. Comparer avec le xkcd obligatoire ...
Tout d'abord, installez un dictionnaire d'une langue que vous connaissez en utilisant:
Sudo apt-get install <language-package>
Pour voir tous les packages disponibles:
apt-cache search wordlist | grep ^w
Remarque: toutes les instructions d'installation supposent que vous utilisez un système d'exploitation basé sur Debian.
Après avoir installé le dictionnaire, exécutez:
WORDS=5; LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${WORDS} | paste -sd "-"
Qui sortira ex:
blasphemous-commandos-vasts-suitability-arbor
Pour le décomposer:
WORDS=5;
- choisissez le nombre de mots que vous voulez dans votre mot de passe.LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words
- choisissez uniquement les mots contenant des caractères alphabétiques en minuscules (il exclut les mots avec '
en eux ou des personnages funky comme dans éclair
). LC_ALL=C
s'assure que [a-z]
dans l'expression régulière ne correspondra pas aux symboles de type lettre autres que les lettres minuscules sans signes diacritiques.shuf --random-source=/dev/urandom -n ${WORDS}
- choisissez autant [~ # ~] mots [~ # ~] que vous l'avez demandé. --random-source=/dev/urandom
garantit que shuf
installe son générateur aléatoire de manière sécurisée; sans lui, shuf
par défaut est une graine sécurisée, mais peut retomber sur une graine non sécurisée sur certains systèmes tels que certaines couches d'émulation Unix sous Windows.paste -sd "-"
- joindre tous les mots en utilisant -
(n'hésitez pas à changer le symbole pour autre chose).Alternativement, vous pouvez l'encapsuler dans une fonction:
#!/bin/bash
function memorable_password() {
words="${1:-5}"
sep="${2:--}"
LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${words} | paste -sd "$sep"
}
ou
#!/bin/sh
memorable_password() {
words="$1"
if [ -z "${words}" ]; then
words=5
fi
sep="$2"
if [ -z "${sep}" ]; then
sep="-"
fi
LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${words} | paste -sd "$sep"
}
Les deux peuvent être appelés comme tels:
memorable_password 7 _
memorable_password 4
memorable_password
De retour:
skipped_cavity_entertainments_gangway_seaports_spread_communique
evaporated-clashes-bold-presuming
excelling-thoughtless-pardonable-promulgated-forbearing
Pour un mot de passe ringard et amusant, mais pas très sécurisé, qui ne nécessite pas d'installation de dictionnaire, vous pouvez utiliser (gracieuseté de @jpa):
WORDS=5; man git | \
tr ' ' '\n' | \
egrep '^[a-z]{4,}$' | \
sort | uniq | \
shuf --random-source=/dev/urandom -n ${WORDS} | \
paste -sd "-"
Je ne fais pas cela avec des utilitaires standard qui ne sont pas conçus pour une utilisation cryptographique. Il n'y a aucune raison de croire qu'ils utilisent un csPRNG ou qu'ils l'ensemencent correctement, et quelqu'un qui connaît votre méthode sera en mesure de reproduire vos mots de passe. De même, comportez-vous des utilitaires polyvalents si vous ne savez pas comment les utiliser correctement.
pwqgen
de passwdqc
.
Vous avez besoin d'un dictionnaire de liste de mots, puisque vous mentionnez le bitcoin, vous voulez probablement celui-ci:
https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
Si votre langue maternelle n'est pas l'anglais, des listes de mots pour d'autres langues sont disponibles dans le même référentiel.
Étant donné ce fichier english.txt, vous pouvez faire une sélection aléatoire avec shuf
:
$ shuf -n 4 english.txt
anchor
neck
trumpet
response
Notez que vous aurez besoin de bien plus que 4 mots pour une phrase de passe vraiment sécurisée. 4 mots sont pour un service en ligne où le nombre de tentatives qu'un attaquant pourrait faire est très limité. Je pense que la recommandation Bitcoin est de 16 mots, je ne sais pas.
Dans cet exemple également, chaque mot ne peut apparaître qu'une seule fois. Si vous souhaitez autoriser les mots répétés, ajoutez le --repeat
option:
$ shuf -n 4 -r english.txt
Cela permettrait à chaque mot d'apparaître plus d'une fois.
Si vous voulez la sortie sur une seule ligne, vous pouvez simplement ajouter xargs echo
:
$ shuf -n 4 english.txt | xargs echo
math easily cube daughter
Ou si vous préférez la substitution de commande:
$ echo $(shuf -n 4 -r english.txt)
photo milk roast ozone
Sur un sidenote, je ne trouve pas ce style de mot de passe facile à mémoriser.
Eh bien, en fait, j'ai eu beaucoup de chance avec math easily cube daughter
puisque cela se produit simplement pour vous faire penser à une histoire où votre fille peut facilement faire des mathématiques avec des cubes ou autre chose. C'est quelque chose auquel les humains peuvent s'identifier, tout comme le cheval dans l'exemple de XKCD.
Mais que diable est un anchor neck trumpet response
? Je ne suis pas un auteur de bande dessinée avec une créativité à revendre pour trouver un mnémonique pour ça. Il sera donc oublié en un rien de temps.
Même si vous vous souvenez des mots, il est difficile de se souvenir de leur ordre correct. Était-ce math easily cube daughter
ou daugher easily math cube
ou autre chose?
Et le mot de passe est censé être aléatoire, vous n'êtes pas autorisé à le choisir et à le modifier.
Quant aux graines de bitcoin, vous n'êtes pas vraiment censé vous en souvenir. C'est juste un moyen de pouvoir l'écrire facilement. N'importe qui peut écrire 16 mots sur une feuille de papier et les relire correctement; avec des lettres aléatoires, il est beaucoup plus probable de faire des erreurs.
Si vous avez des inquiétudes concernant le caractère aléatoire de shuf
, ajoutez le --random-source=/dev/urandom
paramètre à toutes les commandes shuf
.
Voir aussi https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html#Random-sources
J'ai ceci:
xkcd_password () {
command grep "^[[:alpha:]]\{5,8\}$" "${1-/usr/share/dict/words}" | sort --random-source=/dev/urandom -R | head -4
}
Essaye ça,
shuf --random-source=/dev/urandom -n5 /usr/share/dict/words | sed 's/[^[:alnum:]]//g' | paste -sd_
Sortie :
Quayles_knockwursts_scrotums_Barrie_hauler
Explication :
shuf --random-source=/dev/urandom -n5 /usr/share/dict/words
Obtenez 5 mots aléatoires du fichier dictsed 's/[^[:alnum:]]//g'
Supprimer les caractères non alphanumériquespaste -sd_
, joignez les mots avec un trait de soulignement (_
)Vous pouvez utiliser n'importe quel fichier de liste de mots sur Internet au lieu de /usr/share/dict/words
.
Installez la liste de mots si vous ne l'avez pas. Il peut se trouver dans votre référentiel de distributions, par exemple https://packages.debian.org/sid/wordlist :
Sudo apt install wamerican
Comme suggéré par @R .. mais pour les machines RHEL/CentOS (disponible dans le repo EPEL):
pwgen
Notez cet extrait de la page de manuel de pwgen (soulignement le mien):
Le programme pwgen génère des mots de passe qui sont conçus pour être facilement mémorisés par les humains, tout en étant aussi sécurisés que possible. Les mots de passe mémorisables par l'homme ne seront jamais aussi sûrs que des mots de passe complètement aléatoires.
Si vous souhaitez qu'il soit encore plus facile à mémoriser, vous pouvez également utiliser l'approche de hachage de mot de passe (rappelez-vous une phrase de passe unique pour générer de nombreuses autres phrases de passe à partir de). Au lieu de mémoriser des centaines de phrases secrètes, il vous suffit de mémoriser la méthode pour les générer.
En utilisant shuf
avec openssl
pour fournir ne source aléatoire prédéfinie , vous pouvez recréer des phrases secrètes si nécessaire. Veuillez noter que la sécurité de cette approche dépend uniquement de la force de votre phrase secrète, alors faites en sorte qu'elle compte.
Dans l'exemple suivant, la graine aléatoire dépend de
user@site
, wallet#number
, peu importe)Modifiez l'un de ces éléments et vous obtenez un résultat différent.
get_seeded_random() {
seed=$(printf "%s:" "$@")
openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \
< /dev/zero 2>/dev/null
}
get_random_words() {
dictionary=$1
number=$2
passphrase=$3
purpose=$4
dictionary_hash=$(sha1sum < "$dictionary")
shuf -n "$number" \
--random-source=<(get_seeded_random
"$passphrase" "$purpose" "$dictionary_hash" "$number") \
"$dictionary" \
| xargs echo
}
Donc, si ma phrase secrète était WienerSchnitzel
(pas un bon choix pour des raisons évidentes), et si j'utilisais des mots de passe de style XKCD partout:
$ get_random_words english.txt 4 WienerSchnitzel wallet:1
robust lottery ugly stone
$ get_random_words english.txt 4 WienerSchnitzel wallet:2
vapor comfort various bitter
$ get_random_words english.txt 4 WienerSchnitzel [email protected]
any actor tobacco tattoo
Et vous pouvez l'exécuter plusieurs fois, donne toujours le même résultat:
$ get_random_words english.txt 4 WienerSchnitzel wallet:1
robust lottery ugly stone
$ get_random_words english.txt 4 WienerSchnitzel wallet:1
robust lottery ugly stone
Mais demander un mot de plus est un résultat complètement différent (comme ce serait le cas avec un dictionnaire différent, etc.):
$ get_random_words english.txt 5 WienerSchnitzel wallet:1
crash category extra hollow cloud
L'inconvénient de cette approche est que, si quelqu'un sait que vous utilisez cette méthode, il peut essayer de forcer brutalement votre phrase secrète, puis de générer toutes vos autres phrases secrètes.
Dans cet exemple, il ne faut pas longtemps pour deviner WienerSchnitzel. Pour améliorer cela, vous devez appliquer un hachage coûteux (mais répétable) à la phrase de passe elle-même.
# poor man's expensive hash replacement
seed=$( (echo "$seed" ; head -c 1G /dev/zero) | sha1sum)
Et utilisez simplement une phrase de passe beaucoup, beaucoup meilleure en premier lieu.
Vous pouvez également coder en dur un mot de passe à haute entropie vraiment aléatoire, mais cela annule complètement l'aspect "facilement mémorisable" des choses.
De plus, cette implémentation dépend de shuf
en sélectionnant toujours les mots de la même manière, ce qui peut ne pas être le cas pour les futures versions à long terme.
Pour être complet:
git clone [email protected]:victor-engmark/xkcd-passphrase-generator.git
cd xkcd-passphrase-generator
./generate.sh
En un mot:
random.sample(open("/usr/share/dict/words").readlines(), 4)
Produit par exemple:
['controverts\n', "Queensland's\n", 'plaids\n', 'aback\n']
Le code complet serait un peu plus long, comme,
import random; print("".join(random.sample(open("/usr/share/dict/words").readlines(), 4)))
Weyden
Geronimo's
Jidda
enumerate
À la hausse, vous obtenez parfois des perles comme celle-ci:
polyamory
replicates
unmarried
diseases
À la baisse, vous pourriez obtenir des mots difficiles à épeler ou même à taper:
fezzes
Lumière's
tercentenary's
Liliuokalani
Et bien sûr, si vous deviez choisir une sortie parmi les nombreuses options, vous réduisez considérablement l'espace de recherche, vous devez donc vous en tenir au premier ensemble de mots (c'est-à-dire vraiment aléatoire).
xkcdpass est un moyen simple d'obtenir cela sans avoir à écrire de lignes simples.
$ xkcdpass
optimal mycology Kumamoto thorny chrism unsavoury
Il existe des options pour définir le nombre de mots, etc.
À installer:
pip install xkcdpass
(vous devrez peut-être Sudo
).python
et python-pip
, pour Python 2 ou 3.