1行のbashを使用して読み取り可能なパスワードをどのように作成しますか? 128ビットのエントロピーを探している場合はどうなりますか?
[〜#〜]編集[〜#〜]
読みやすいとは、94の印刷可能なASCII文字(スペースなし)を意味します。少なくとも128ビットのエントロピーがある限り、これらの文字よりも少ない文字を使用できます。
それは、「読み取り可能」の意味によって異なります。 16進文字のみを使用する場合は、128ビットのエントロピーに到達するために32文字が必要です。この行は機能します(coreutils
パッケージのコマンドのみを使用):
head -c16 /dev/urandom | md5sum
この亜種は、「a」から「p」までの小文字のみのパスワードを生成します(これは、スマートフォンでパスワードを「入力」する必要がある場合に必要なものです)。
head -c16 /dev/urandom | md5sum | tr 0-9 g-p
入力する文字を1つ減らしたい場合は、次のことを試してください。
head -16 /dev/urandom | md5sum
(最初の16バイトすべてを0x0Aとして取得する確率、つまり「改行」文字は2です。-128、したがって、このラインは依然として128ビットのエントロピーを取得します。)
coreutils
からのコマンドに限定して、これを行うことができます:
mktemp -u XXXXXXXXXXXXXXXXXXXXXX
これは、/dev/urandom
をランダム性の内部ソースとして使用して、22文字のパスワードを生成します(ソースコードをチェックインし、strace
呼び出しで確認します)。文字は文字(大文字と小文字)と数字です。 62から22 2より大きい128、22文字で十分です。
さらに別のもの:
od -An -x /dev/urandom | head -1
これにより、4つの16進数の8つのシーケンスが表示されます。おそらく、これを小さなシーケンスに分割すると読みやすくなる可能性があります。
はるかに長い行と全く異なる種類のパスワードについては、これを試してください:
for i in {1..8} ; do head -$(expr $(head -c7 /dev/urandom | od -An -t dL) % $(wc -l < /usr/share/dict/british-english)) /usr/share/dict/british-english | tail -1 ; done
(これは64ビットのホストでのみ機能します。理由に気付きますか?) coreutils
とは別に、そのバージョンには辞書ファイルも必要です。ここではイギリス英語用のファイルです。
他の回答でいくつかのファブの提案。 makepasswdはどこでも利用できるわけではなく、trの使用は(少し)トリッキーなので、OpenSSLを使用する別のオプションがあります。
openssl Rand -base64 16
数値はランダム性のバイト数です。つまり、128ビットのエントロピーの場合は16バイトです。
これまでで最もシンプルなワンライナー:
pwgen
覚えやすいパスワードを作ろうとします。これを無効にしてより安全なパスワードを作成するには、--secure
または-s
フラグを使用します。
pwgen -s
生成されたパスワードが長すぎませんか?短すぎる?必要な長さを追加するだけです:
pwgen 9
# Or
pwgen -s 9
# Or
pwgen 9 -s
私はたまたまpwgenを知っています。他にもさまざまなツールがあります。ディストリビューションの検索機能を使用してそれらを見つけることができます。 Debianでは、これは次のとおりです。
apt-cache search password generator
正確な(大文字と小文字を区別しない)検索を行います。代わりにpassword generat
を使用すると、検索範囲が広がります。
パッケージをインストールする前に、その説明を表示すると便利です。再びDebianで:
apt-cache show $DESIRED_PACKAGE
# E.g.
apt-cache show pwgen
私がこの方法で見つけることができるツール:
pwgen
makepasswd
apg
otp
(1回限りのパッドの意味、推奨されません)gpw
(発音性に重点を置いているため、お勧めしません)すべてのシステムでpwgenを使用できるとは限りません。他の人が答えたように、md5sum
またはsha256sum
を使用できますが、これは0-9およびa-fのみを出力します。特殊文字は言うまでもなく、g-zや大文字と小文字の混在はできません。必要な長さのパスワードが得られるまで、/dev/urandom
から印刷できない文字を単に除外することをお勧めします。
cat /dev/urandom | tr -cd '@-~' | head -c 8
これにより、XiVsdn[y
またはV@FPV^lY
のようなものが得られます。末尾の8
は、必要なパスワードの長さに変更できます。 @-~
の部分を変更して文字を制限することもできます。たとえば、これは英数字のみを印刷します。
cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 8
これは、pwgen -s
が行うこととほぼ同じで、nZiUzNtE
のようなパスワードを提供します。
おまけとして、tr
ツールは、Microsoft Windowsを除くほとんどすべてのオペレーティングシステム(Mac OS X、GNU/Linux、Android/Linux、Solaris、FreeBSDなど)に含まれています。
含めることができる文字のタイプに応じて、128ビットのエントロピーで読み取り可能なパスワードを作成する簡単なコマンドは次のようになります。
< /dev/urandom tr -dc [:graph:] | head -c20; echo;
( ここ から取得)。 [:graph:]
は、スペースを除くすべてのASCII文字です。
説明:
128ビットは、3.40e + 38の組み合わせと同等です。 94の読み取り可能なASCII文字(スペースを除く)を使用している場合は、20文字少なくともその量の組み合わせに到達するには:94 ^ 20=2.90e + 39。
たとえば、_A-Za-z0-9
の使用のみが許可されている場合:
< /dev/urandom tr -dc '_A-Za-z0-9' | head -c22; echo;
63文字の場合:63 ^ 22=3.85e + 39完全なエントロピーに到達するために2つの文字を追加するだけです。
16進パスワードの場合:
< /dev/urandom tr -dc 'A-F0-9' | head -c32; echo;
16進数は簡単です。128ビットは、16進数文字のビットの32倍です。
重要なお知らせ:パスワードが必要なほとんどの状況では、背後でハッシュ関数を使用します。これにより、実際に実際の文字列が導出されます。利用される。この分析は、パスワードがハッシュ/使用される方法の影響を受けます。
追加注記:/dev/urandom
はこの操作に対して安全です。確認してください / dev/urandomのRandはログインキーに対して安全ですか? 。
追加注記:ハッシュ関数で複数の反復を使用している場合、合計の反復の表現に必要なビットを差し引くことができますあなたが到達できるビット、例えば:
65536反復=2 ^ 16反復、大まかに追加16ビット(2バイト)選択されたパスワードへのエントロピー。ブルートフォース攻撃では、使用されるハッシュを計算する前に、さらに2 ^ 16反復を実行する必要があるためです。
記録のためだけに、ここで説明するように、128ビットのエントロピーを超えても不必要ではありません。 すべての人類が安全に到達できない単純な操作の量?
しかし、あなたのパラノイアがそれを超えている場合は、いくつかの有用な数値を以下に示します。
すべてのascii読み取り可能(29文字、1.6e + 57の組み合わせ)、 192ビット(6.28e + 57の組み合わせ)のエントロピー:
< /dev/urandom tr -dc [:graph:] | head -c29; echo;
_A-Za-z0-9
(32文字、3.79e + 57の組み合わせ)、192ビット(6.28e + 57の組み合わせ)のエントロピー:
< /dev/urandom tr -dc '_A-Za-z0-9' | head -c32; echo;
A-F0-9
(48文字、16 ^ 48の組み合わせ) 、192ビット(2 ^ 192の組み合わせ)のエントロピー:
< /dev/urandom tr -dc 'A-F0-9' | head -c48; echo;
すべてのascii読み取り可能(39文字、8.95e + 76の組み合わせ)、 256ビット(1.16e + 77の組み合わせ)のエントロピー:
< /dev/urandom tr -dc [:graph:] | head -c39; echo;
_A-Za-z0-9
(43文字、2.35e + 77の組み合わせ)、256ビット(1.16e + 77の組み合わせ)のエントロピー:
< /dev/urandom tr -dc '_A-Za-z0-9' | head -c43; echo;
A-F0-9
(64文字、16 ^ 64の組み合わせ) 、256ビット(2 ^ 256の組み合わせ)のエントロピー:
< /dev/urandom tr -dc 'A-F0-9' | head -c64; echo;
最後の6つのオプションは既に偏執的であることを考えると、上記のパスワードよりも複雑な、または大きいパスワードを選択してもまったく意味がありません。
読みやすく、比較的覚えやすいパスワードを作成するためのワンライナー:
cat /usr/share/dict/words | shuf -n 4 | tr '\n' ' '| tr -d \'
出力例:
correct horse battery staple
より長いパスワードが必要な場合は、4をより大きい数字に変更します。スペースのないパスワードの場合、エスケープされたスペースを行の終わりに追加します。
cat /usr/share/dict/words | shuf -n 4 | tr '\n' ' ' | tr -d \ \'
これを行うことができるmakepasswdと呼ばれるパッケージがあります。
$ makepasswd --chars 64
/ dev/urandomからの16バイトのシードでapg
を使用します(最大許容)
apg -a 0 -d -m 15 -n 1 -c "`head -c16 /dev/urandom`"; echo
より多くのエントロピーからより長いパスワードを持つことができるように、apgコマンドをチェーンすることができます。
ランダムな情報を読みやすくするために、base64でエンコードできます。 base64の1文字には6ビットのエントロピーがあります。したがって、128ビットのエントロピーの場合、22文字(128/6 = 21 +⅓)が必要です。
これにより、次のコマンドが表示されます。
base64 < /dev/urandom | head -c 22
これは、「/ dev/urandomを使用して暗号品質のランダムデータを生成し、base64に変換して、最初の22文字を保持する」ことで英語に翻訳できます。
出力の最後に「行末」文字を追加することもできます。
echo $(base64 < /dev/urandom | head -c 22)
uuidgen
uUIDを提供します。一部のバージョンでは、ユーザーのパスワードを盗聴してコンピューターに追跡できるため、コンピューターで生成されるUUIDのバージョンを確認することを忘れないでください。使用できます
uuidgen -r
iDがランダム(数字)の数字のみで構成され、追跡できないことを確認します。文字列は[a-z0-9]と-で構成されます。出力例:
4bc1b05b-77b5-4a4c-8300-e9dc53350fcb
文字列の品質は、乱数を生成するオペレーティングシステムの機能(/dev/random
)。
私はあなたが一行を要求したのを知っています、しかしそれはより多くで本当により頑丈です。 ;-)
_base64
_ユーティリティの異なるバージョン間でのエラーチェックと互換性を排除したい場合は、主要な作業を1行に圧縮できます。この実装は、OS XとLinuxの両方で機能します。 (_create_password
_関数を参照し、_do_base64
_を単純な_base64
_を適切な引数で置き換えます。)_do_base64
_関数を、ASCII文字はバイナリ入力に基づいていますが、_base64
_を使用します(sed
を使用して_/
_、_+
_、および_=
_)を削除します大文字、小文字、数字を取得します。 (_26 + 26 + 10 = 62
_;どの94文字を指定したかわかりません。)
必要なパスワードの長さを引数として指定します。
_#!/bin/bash
function abort {
echo "Error: $*"
exit 2
}
function do_base64 {
WRAP=""
base64 --help | grep -q -- --wrap && WRAP="-w 0"
base64 $WRAP $@
}
function create_password {
let bytes=$1*2
dd if=/dev/urandom 2> /dev/null bs=$bytes count=1 \
| do_base64 \
| sed s/[\/\+=]//g \
| cut -c 1-${1}
}
if [ "$1" == "" ]; then
echo "Usage: $0 <desired-password-length>"
exit 1
fi
let length=0+"$1" 2> /dev/null || abort "Password length must be numeric"
create_password $1
_
出力例:
_$ mkpasswd 16
2LjxTkQHP7Lv4z0J
$ mkpasswd 24
txhhbeHfGZSl0UNRvsz78yFo
$ mkpasswd 64
TykZF3hMXcZp0rP4ig0d9zRsuVEDxHjIcLHGcNaf0ROhk66VCPc7tE8GXcVv7AKh
_
また、適切なエントロピーを取得したい場合は、_/dev/urandom
_を_/dev/random
_に置き換えることをお勧めします。 (エントロピープールが使い果たされたため、開発中に_/dev/urandom
_に変更しました。)
33〜126の乱数を使用して、最小128ビットのエントロピーでパスワードを作成する関数を次に示します。
pgen() {
local start=33 end=126 # printable, non-whitespace characters
local entropy=128
# Calculate minimum length to meet required entropy
local length=$(echo "($entropy/(l($((end+1-start)))/l(2)))" | bc -l)
length=$(echo "scale=0; ($length+0.5)/1" | bc) # round result up
# Use $1 as length if it has enough entropy
[ -n "$1" ] && [ $1 -gt $length 2>/dev/null ] && length=$1
for _ in $(seq $length); do
printf \\$(printf '%03o' \
$(shuf --random-source=/dev/urandom -i $start-$end -n1))
done
echo
}
この関数は、エントロピー要件を満たすために必要な最小の長さ(この場合は20の長さ)を計算し、その長さのパスワードを出力します。
最初の引数は、エントロピー要件を満たすための最小長よりも長い限り、stdoutに書き込まれるパスワードの長さを指定できます。
$ pgen
xx6r6e%Og;_8<4)o#aPO