Diceware Passwörter mit der Shell generieren
Ich hab mir ein kleines Shellskript geschrieben, dass mir sichere Diceware-Passwörter generiert. Wer nicht weiß, was Diceware ist und warum die relativ sicher sind, dem seien folgende Links ans Herz gelegt:
- Password Strength by XKCD
- Die original Diceware-Seite
- Wikipedia-Seite zu Diceware
- und ein wenig genauer über Schlüssellängen
Das ist natürlich ein typischer Fall von NIH, weil es für die Bash/Shell oder auch online wahrscheinlich hundert andere und gut funktionierende Tools dafür gibt, aber selber programmieren und grübeln macht einfach deutlich mehr Spaß.
Die Benutzung ist relativ einfach:
$ ./roll_password.sh
gibt ein Passwort mit fünf Wörtern (english) aus. Folgende Argumente können mit übergeben werden:
-c
bestimmt die Anzahl der Wörter, die das Passwort haben soll (standard:5
)-l
die minimale Zeichenanzahl des gesamten Passwortes (standard:14
)-w
Wortlistendatei aus denen sich das Passwort generieren soll (standarddiceware_wordlist_en
)
Für Schlüssel-Signierungen und Kryptographie würde ich die generierten Passwörter nicht benutzen, dafür ist die $RANDOM-Umgebungsvariable nicht zufällig genug, aber als Passwörter für typische Online-Dienste sind sie sehr gut geeignet.
Das Skript kann man hier herunterladen. Im Download enthalden sind das Shellskript, die englische und die deutsche Diceware-Wortlistendatei.
Und hier noch ein bisschen Skript, für die, die nur daran interessiert sein sollten.
#!/bin/bash # # Name: roll_password.sh # Description: This script rolls a random passphrase based of a wordlist (Diceware). # Author: Tommy Schmucker # Created: 2012-06-08 # Modified: 2012-09-25 # Version: 0.2 #
usage() { cat << EOF
This script rolls a random pass phrase based of a wordlist (Diceware).
usage: $0 [-h] [-c number] [-l number] [-w file]
-h Show this message -c Count of words in the pass phrase -l Minimun length of the pass phrase -w Wordlist file
EOF }
count=5 wordlist=diceware_wordlist_en min_length=14 phrase=
while getopts "hc:l:w:" option; do case $option in h) usage exit 1 ;; c) count="$OPTARG" ;; l) min_length="$OPTARG" ;; w) wordlist="$OPTARG" ;; ?) usage exit ;; esac done
[ -e "$wordlist" ] || { echo "$wordlist does not exists, exiting"; exit 1; }
roll_number() { number= for i in `seq 5`; do roll=`expr $RANDOM % 6` digit[i]=`expr $roll + 1` number=$number${digit[i]} done }
get_word() { word= roll_number word=`cat $wordlist | grep $number | awk '{print $2}'` }
get_phrase() { for j in `seq $count`; do get_word if [ $j == 1 ]; then phrase="$word" else phrase="$phrase $word" fi done }
get_phrase length=`echo -e "$phrase\c" | wc -m`
if [ $length -lt $min_length ]; then echo $'\n'"Phrase \"$phrase\" is too short ($length chars)."$'\n'"You should run the command again!"$'\n' else echo $'\n'"$phrase"$'\n' fi
# - Kleiner schrieb am 21. November 2012, 15:27:
Hmm, hier war ich wohl falsch. Hatte einen Passwort Generator gesucht und auf dem Link unter meinem Namen verlinkt. Vielleicht hilft es auch jemand anderen!
Viele Grüße!