ランダムなパスワードを生成します。なぜ移植性がないのですか?

ランダムなパスワードを生成します。なぜ移植性がないのですか?

任意のパスワードを生成し、次のことをしたいと思います。

</dev/urandom tr -dc [:print:] | head -c 64

Ubuntuを実行している私のラップトップでは、期待どおりに印刷可能な文字のみが生成されます。ただし、学校サーバー(Red Hat Enterprise Linuxを実行)にSSHで接続して実行すると、同様の結果が得られ、3!ri�b�GrӴ��1�H�<�oM����&�nMC[�Pb�|L%MP�����9��fL2q���IFmsd|l�Kまったく機能しません。ここで何が間違っている可能性がありますか?

答え1

あなたでしょうか?ロケールそしてティー質問。

今、GNU TRシングルバイト文字のみが完全にサポートされています。したがって、マルチバイトエンコーディングを使用するロケールでは、出力が奇妙に見えることがあります。

$ </dev/urandom LC_ALL=vi_VN.tcvn tr -dc '[:print:]' | head -c 64
`�pv���Z����c�ox"�O���%�YR��F�>��췔��ovȪ������^,<H ���>

シェルはマルチバイト文字を正しく印刷しますが、GNUはtr印刷できないと見なされるバイトを削除します。

確実に使用するには、ロケールを設定する必要があります。

$ </dev/urandom LC_ALL=C tr -dc '[:print:]' | head -c 64
RSmuiFH+537z+iY4ySz`{Pv6mJg::RB;/-2^{QnKkImpGuMSq92D(6N8QF?Y9Co@

答え2

それについて考えてください

$ dd if=/dev/urandom bs=48 count=1 status=none | base64
imW/X60Sk9TQzl+mdS5PL7sfMy9k/qFBWWkzZjbYJttREsYpzIguWr/uRIhyisR7

これには2つの利点があります。

  • 〜8 KB以外の任意のデバイスから48バイトのみを読み取ります。同じホスト上の他のプロセスにランダムな数字が必要な場合は、一度に最大8 KBを使用すると深刻な問題になる可能性があります。 (はい、誰も使用してはいけないと主張することができます。ブロックするランダム装備だが人する.)

  • の出力にはbase64特別な意味を持つ文字はほとんど含まれていません。 (まったくそうでない場合は、| tr +/ -_最後に追加して(例のように)バイト数を確認してください。入力するtoはbase643の倍数です。 )

この方法で生成されたパスワードは正確に384ビットのエントロピーを持ちます。一部現在行われている作業(log 2 96 64 ≒421.4)よりも少ないが、ほとんどの目的に十分です(256ビットのエントロピーは「太陽がいつ使い果たされるかを推測中」の範囲に安全に属します)とは別に私が知っている限りRSA鍵の場合)。

答え3

[:print:]他の人は、ロケールが意味を決定すると指摘しました。ただし、印刷可能なすべての文字がパスワードに適しているわけではありません(ASCIIでも同様)。空白、タブ、#$%^は本当に必要ないですか?パスワードに - 覚えにくいだけでなく、基本認証システムにとって潜在的に危険である可能性があり、入力フィールドに入力できない可能性があります。この場合、「一般」文字を手動で選択する必要があります。

LC_ALL=C </dev/urandom tr -dc '[:alnum:]_' | head -c 64

または単に

</dev/urandom tr -dc 'A-Za-z0-9_' | head -c 64

または、より良い方法は、base64他の回答で提案されているように使用することです。

答え4

パスワードを生成するためにこれを使用する理由があるかどうかはわかりませんが、/dev/random痛みを軽減するためにpwgenを使用することをお勧めします。

$ pwgen -s 10 1

ここで、10はパスワードの長さです。

http://man.cx/pwgen

関連情報