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:

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 (standard diceware_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.

roll_password.tar.gz

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

Kommentar

  1. # - 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!





Textile-Hilfe