web-dev-qa-db-ja.com

ランダムな文字列を生成する方法は?

ランダムな文字列(パスワード、ユーザー名など)を生成したいと思います。必要な長さを指定できるようにする必要があります(例:13文字)。

どのツールを使用できますか?

(セキュリティおよびプライバシー上の理由から、文字列は、Webサイトでオンラインにするのではなく、オフラインで生成することが望ましいです。)

248
landroni

私のお気に入りの方法は、trとともに/dev/urandomを使用して、不要な文字を削除することです。たとえば、数字と文字のみを取得するには:

head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''

または、 includeOWASPパスワード特殊文字リスト からさらに文字を(-===-)するには:

</dev/urandom tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' | head -c 13  ; echo

入力に関するtrの不満に問題がある場合は、 次のようにLC_ALL=C を追加してみてください。

LC_ALL=C tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
229
herbert

暗号化のスイスアーミーナイフであるopensslコマンドを使用しています。

openssl Rand -base64 12

または

openssl Rand -hex 12
158
400 the Cat

ランダムなパスワードを生成するには、pwgenを使用できます。

pwgenは、ランダムで意味のない、発音可能なパスワードを生成します。これらのパスワードには、小文字のみ、または大文字と小文字が混在した数字、または投入された数字のいずれかが含まれます。大文字と数字は、単語のみを記憶するときに位置を思い出しやすいように配置されます。

長さ13の7つのパスワードを生成します。

geek@liv-inspiron:~$ pwgen 13 7
Eu7Teadiphaec giepahl3Oyaiy iecoo9Aetaib4 phaiChae6Eivi athoo3igee8Co
Iphu4ufeDeelo aesoYi2lie9he 

コメントで述べたように、-s引数を使用することでエントロピーの減少を回避できます(つまり、より安全で完全にランダムですが覚えにくいパスワードを生成します)。

geek@liv-inspiron:~$ pwgen -s 13 7
eAfycrPlM4cYv 4MRXmZmyIVNBp D8y71iqjG7Zq7 FQRHcserl4R8O yRCUtPtV3dsqV
0vJpp2h0OrgF1 QTp7MKtJyTrjz 

ランダムなユーザー名を生成するには、gpwを使用できます。

このパッケージは発音可能なパスワードを生成します。それはあなたがそれを養うどんな辞書からも取られた3文字の組み合わせ(トリグラフ)の統計を使用します。

長さ13の7つのパスワード(ユーザー名)を生成します。

geek@liv-inspiron:~$ gpw 7 13
sreepoidahsas
risadiestinge
ntodynesssine
deodstestress
natinglumperm
riasigentspir
enderiferback
155
landroni

これが私がやる方法です。 10文字のランダム文字列を生成します。 「fold」を他の文字列処理ツールに置き換えることで最適化できます。

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1
18
x1b2j

Pablo Repettoに触発されて、私はこれで終わりました覚えやすいソリューション:

shuf -zer -n20  {A..Z} {a..z} {0..9}

-zは複数行の出力を回避します

-e結果をエコーし​​ます

-r任意の文字が複数回出現することを許可します

-n20 20文字の長さのランダムな文字列

{A..Z} {a..z} {0..9}で許可されたcharクラス

shufはLinux coreutilsの一部であり、広く利用可能であるか、少なくとも移植されています。

12
entwicklerseite

私が使用するすべてのディストリビューションに組み込まれている標準のLinuxツールで可能な限り最高のエントロピーでパスワードを生成するには:

< /dev/urandom tr -cd "[:print:]" | head -c 32; echo

これは、ASCII印刷可能な文字-32(スペース)から126(チルド、~)のすべてを出力します。パスワードの長さは、head-cフラグで制御できます。 trの他の可能な文字セット(スペースを含めない場合は、33〜126の文字のみ、[:graph:]を使用)。

12
drws

必要なランダム性のレベルに応じて、組み込みの$RANDOM変数であるbash(およびzshksh、場合によってはその他)を単純に使用できます。

$ echo $RANDOM | tr '[0-9]' '[a-z]'
bfeci
$ echo $RANDOM | tr '[0-9]' '[a-z]'
cijjj

/dev/urandomから直接読み取るメソッドははるかに単純ですが、完了のために$RANDOMを使用することもできます。

echo $(for((i=1;i<=13;i++)); do printf '%s' "${RANDOM:0:1}"; done) | tr '[0-9]' '[a-z]'

重要:このソリューションは、アルファベットの最初の10文字を使用してランダムな文字列のみを生成します。それで十分かどうかは、何のために必要かによって異なります。

9
terdon

@Brandinは、別の回答へのコメントで、/dev/urandomを使用してhead -c 100から最大100バイトを取得する方法について説明しました。これを行う別の方法は、ddを使用することです。

tr -dc A-Za-z0-9 < /dev/urandom | dd bs=100 count=1 2>/dev/null

ddコマンドの最後にある2>/dev/nullは、 "... records in/... records out"出力を抑制するためのものです。

私はこれらの2つの方法の間の実質的な長所/短所を知りません。

trの両方の方法で入力に関する問題が発生しました。これは、バイナリ入力を受信するのが好きではないためだと考えたため、/dev/randomiconv -c -t USでフィルタリングすることを最初に提案しました。しかし、ジルは別の診断と解決策を提案しました。

LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | dd bs=100 count=1 2>/dev/null
5
dubiousjim

xxdコマンドを使用して長さを指定し(-lを使用)、LinuxとOSの両方で機能します。 https://www.howtoforge.com/linux-xxd-command/

xxd -l16 -ps /dev/urandom
5
northtree

一部のLinuxディストリビューションでは、APGがデフォルトで含まれています。

サイズが5から10のパスワードをサブセットSpecial、Numeric、Capital、およびLowerで生成するには、コマンドは次のとおりです。

apg -MSNCL -m 5 -x 10

そして戻る

@OpVeyhym9
3:Glul
3DroomIc?
hed&Os0
NefIj%Ob3
35Quok}

コメントで@landroniが言ったように。

4
Sandburg

まさにこの目的を持つmd5ツールの1つを使用できます。完全にランダムなパスワードを作成する場合は、md5passを使用できます。 「通常のテキスト」と「塩」を一緒に使用して、後で回復できる同じパスワードを簡単に作成できるため、非常にシンプルで便利なツールです。または、完全に取得することもできます。常にランダムなパスワード。一般的な使用法は次のとおりです。

md5pass [password] [salt]

ここで、passwordはランダム文字列の構築に使用される選択されたワードであり、saltは使用されるバイト単位のジャンプです。このような:

md5pass Word

$1$.MUittVW$j.XDTF1QRnxqFdXRUiSLs0

これにより、使用する「ランダムシーケンス」パスワードが作成されます。 saltを使用しない場合、後で同じ文字列を再作成できない可能性があります。

ただし、次のようにsaltを使用する場合:

md5pass Word 512

$1$512$.0jcLPQ83jgszaPT8xzds0

その後、Wordを元々定義されていたものと同じソルト(またはジャンプ)と組み合わせて使用​​した場合に回復できるシーケンスを作成できます。

4
Joke Sr. OK

これらの2つのコマンドは、ランダムなパスワードとパスフレーズをそれぞれ生成します。

shuf --random-source=/dev/urandom --repeat --head-count=20 file_with_characters | tr --delete '\n'

shuf --random-source=/dev/urandom --repeat --head-count=7 file_with_words | tr '\n' ' '

パスワードジェネレーターには、パスワードに使用させたいすべての文字を含むfile_with_charactersが必要です。1行に1文字、各文字を1回だけ使用します。ファイルには空白行を含めないでください。また、行は改行で終了する必要があります。

パスフレーズジェネレーターには、パスフレーズで使用するすべての単語を含むfile_with_wordsが必要です。1行に1ワード、各回に1ワードだけです。ファイルには空白行を含めないでください。また、行は改行で終了する必要があります。

--head-countオプションは、パスワードの長さ(文字数)またはパスフレーズ(単語数)を指定します。

2
Pablo Repetto

この場合、Unixの「1つのことをうまくこなす多くの小さなツール」という哲学が非常に役立ちます。

  • /dev/urandomランダム "バイト"のストリームです(これには印刷できない文字が含まれます)
  • base64バイトデータをエンコード[A-Za-z0-9/+](完全に印刷可能)
  • ddは、引数として指定された修飾子を適用して入力を出力にコピーします(ブロックサイズとブロックカウントを含めることができます)。

OSX

base64     < /dev/urandom | dd bs=1k count=1

Linux

base64 -w0 < /dev/urandom | dd bs=1k count=1

ノート:

  • 文字のサブセットが必要な場合は、パイプに修飾子を挿入できます。
    • 例:大文字を削除するにはtr -d '[A-Z/+]'+および/
  • bs(ブロックサイズ)は、必要な長さに設定できます。
  • Linuxでは、base64はデフォルトで76列に折り返されるため、必要がない場合は-w0でリセットする必要があります。
1
Bruno Bronosky

MacOSで/ dev/urandomをtrにパイプしても機能しないことがわかりました。ここに別の方法があります:

set="abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
n=6
Rand=""
for i in `seq 1 $n`; do
    char=${set:$RANDOM % ${#set}:1}
    Rand+=$char
done
echo $Rand
1
Jake

通常のパスワードを生成するコマンドを提供したい

$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' |cut -c -13
b0R55751vWW9V

パスワードの長さを構成するには、cutコマンドの数値を必要な長さ(24文字など)に変更します。

$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' |cut -c -24
WFBhVHuKbrnRhd5kdWXPzmZG

0またはO、1、またはlを混同したくないですか?別のtrでフィルターで除外します

$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' | tr -d '0O1l'|cut -c -24
JuCphwvhrhppD9wVqfpP2beG

私は個人的にパスワードで特殊文字を好むことは決してないので、私は[:alnum:]パスワードジェネレーター用

私が使う:

base64 < /dev/urandom | tr -d 'O0Il1+\' | head -c 44

これにより、57文字の文字が得られます。文字列はコピーして貼り付けることができます(削除された+および\)または印刷して、区別が難しい文字(I1lO0)は削除されました。

  • 44文字で得られる:ログ2(5744)> 256.64ビットのエントロピー
  • 22文字のログ:ログ2(5722)> 128.32ビットのエントロピー

私はこれが好きです:

  • コマンドは入力が簡単で覚えやすい
  • 標準のシステムツールを使用する-余分なバイナリは不要
  • ランダム性を「浪費」しません(受信するランダムビットの89%を使用しますが、trに直接パイプするソリューションでは約24%を使用します)
  • 22と44の文字は、2つのブレークポイントの共通のパワー(かなり上)を非常にうまく組み合わせます
  • 出力は、最小限の人的エラー率で簡単に選択して貼り付けたり、印刷したり、再入力したりできます
  • md5sum/sha1sumなどの16進コード化された(22および44ではなく32および64)ソリューションより短い.

https://unix.stackexchange.com/a/230676/958 へのクレジット、特に私の最初のインスピレーションに対するコメント。

1
Iiridayn

これまでの答えのいずれも、完全にOSを超えたものではありません。

主な欠陥はロケール定義(MacOSの場合)とtrが文字の間隔を認識できない(Solarisの場合)ことで表されます。

shlibs を試してみてください。それは新鮮で本当にクロスOSです。ランダムな文字列を取得するコードはshlibs str005./shlibs str005)。

50文字のランダムな文字列を取得し、句読点を含め、数字を除外します。

shlibs str005 50 -p -xd
0
Nicolae Iotu

非常に安全なパスワードのための私の方法(16はパスワードの長さです):

cat /dev/urandom | tr -cd [:graph:]|head -c 16

結果の例:

jT@s_Nx]gH<wL~W}

または、複数のパスワードを生成するには:

猫/ dev/urandom | tr -cd [:graph:] | fold -w 16 | head -6

結果の例:

7ck%G7'|f&}_8(]s
<?*]E.CG[NB'gK#A
:tF-WPTOa3!i7S(h
2xy(>=%3=Kb1B$`6
*98Lf{d?Jzb}6q1\
E7uCEAN2Hz]]y|5*

安全性がやや低い(文字セットが小さい):

cat /dev/urandom |base64 -w 0|fold -w 16|head -6

結果の例:

rJqYxYZLOTV+A45w
PUKQ+BoBf6yfZw5m
+LRfpsN9CsLRiN8V
yMS6zDpL6NHmG17s
yTUWPG7Rum97schi
cognvjVwaKaAyPRK
0
Zibri

私は secpwgen in Alpine Linux を維持し、 私のGithub上のソース を維持します。

ランダムな文字列またはダイスウェアフレーズを生成できます。

musl64 [~]$ secpwgen
USAGE: secpwgen <-p[e] | -A[adhsy] | -r | -s[e]> N

PASSPHRASE of N words from Diceware dictionary
  -p    generate passphrase
  -pe   generate enhanced (with symbols) passphrase

SKEY PASSWORD of N words from S/Key dictionary
  -s    generate passphrase
  -se   generate enhanced (with symbols) passphrase

ASCII RANDOM of N elements (at least one option MUST be present)
  -A    Each letter adds the following random elements in output:
    a    alphanumeric characters
    d    decimal digits
    h    hexadecimal digits
    s    special characters
    y    3-4 letter syllables

RAW RANDOM
  -r    output BASE64 encoded string of N random BITS
  -k    output koremutake encoding of N random BITS

13文字のランダム文字列を生成するには、次のようにします。

musl64 [~]$ secpwgen -Aas 13
----------------
WK5#*V<]M3<CU ;ENTROPY=67.21 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

musl64 [~]$ secpwgen -Aa 13
----------------
GP0FIEBM9Y3BT ;ENTROPY=67.21 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

ユーザーがパスワードを覚えるには、ダイスウェアフレーズを使用します。

musl64 [~]$ secpwgen -p 5
----------------
wq seen list n8 kerr  ;ENTROPY=65.00 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

私は個人的に好きです:

musl64 [~]$ secpwgen -r 512
----------------
h62lL7G4gwh3/j9c7YteQvVXoqJrQKKPWVR3Lt7az36DcfWZWtUgBT19iwmJBwP4UahNzPe7qYD7OcklUFpCzQ== ;ENTROPY=512.00 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.
0
Stuart Cardall