web-dev-qa-db-ja.com

Linuxでパスワードを作成するための1つのライナー?

1行のbashを使用して読み取り可能なパスワードをどのように作成しますか? 128ビットのエントロピーを探している場合はどうなりますか?

[〜#〜]編集[〜#〜]

読みやすいとは、94の印刷可能なASCII文字(スペースなし)を意味します。少なくとも128ビットのエントロピーがある限り、これらの文字よりも少ない文字を使用できます。

32
Andras Gyomrey

それは、「読み取り可能」の意味によって異なります。 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とは別に、そのバージョンには辞書ファイルも必要です。ここではイギリス英語用のファイルです。

53
Thomas Pornin

他の回答でいくつかのファブの提案。 makepasswdはどこでも利用できるわけではなく、trの使用は(少し)トリッキーなので、OpenSSLを使用する別のオプションがあります。

openssl Rand -base64 16

数値はランダム性のバイト数です。つまり、128ビットのエントロピーの場合は16バイトです。

22
paj28

Pwgenの使用

これまでで最もシンプルなワンライナー:

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(発音性に重点を置いているため、お勧めしません)

標準的なUnixツールの使用

すべてのシステムで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など)に含まれています。

11
Luc

含めることができる文字のタイプに応じて、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-932文字、3.79e + 57の組み合わせ)、192ビット(6.28e + 57の組み合わせ)のエントロピー:

< /dev/urandom tr -dc '_A-Za-z0-9' | head -c32; echo;

A-F0-948文字、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-943文字、2.35e + 77の組み合わせ)、256ビット(1.16e + 77の組み合わせ)のエントロピー:

< /dev/urandom tr -dc '_A-Za-z0-9' | head -c43; echo;

A-F0-964文字、16 ^ 64の組み合わせ) 、256ビット(2 ^ 256の組み合わせ)のエントロピー:

< /dev/urandom tr -dc 'A-F0-9' | head -c64; echo;

最後の6つのオプションは既に偏執的であることを考えると、上記のパスワードよりも複雑な、または大きいパスワードを選択してもまったく意味がありません。

10
Andras Gyomrey

読みやすく、比較的覚えやすいパスワードを作成するためのワンライナー:

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 \ \'
5
ONOZ

これを行うことができるmakepasswdと呼ばれるパッケージがあります。

 $ makepasswd --chars 64
3
Fred Concklin

/ 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)
1
uuidgen

uUIDを提供します。一部のバージョンでは、ユーザーのパスワードを盗聴してコンピューターに追跡できるため、コンピューターで生成されるUUIDのバージョンを確認することを忘れないでください。使用できます

uuidgen -r

iDがランダム(数字)の数字のみで構成され、追跡できないことを確認します。文字列は[a-z0-9]と-で構成されます。出力例:

4bc1b05b-77b5-4a4c-8300-e9dc53350fcb

文字列の品質は、乱数を生成するオペレーティングシステムの機能(/dev/random)。

0
Clearer

私はあなたが一行を要求したのを知っています、しかしそれはより多くで本当により頑丈です。 ;-)

_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_に変更しました。)

0
mpontillo

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
0
John B