ランダムな文字列(パスワード、ユーザー名など)を生成したいと思います。必要な長さを指定できるようにする必要があります(例:13文字)。
どのツールを使用できますか?
(セキュリティおよびプライバシー上の理由から、文字列は、Webサイトでオンラインにするのではなく、オフラインで生成することが望ましいです。)
私のお気に入りの方法は、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
暗号化のスイスアーミーナイフであるopenssl
コマンドを使用しています。
openssl Rand -base64 12
または
openssl Rand -hex 12
ランダムなパスワードを生成するには、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
これが私がやる方法です。 10文字のランダム文字列を生成します。 「fold」を他の文字列処理ツールに置き換えることで最適化できます。
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1
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の一部であり、広く利用可能であるか、少なくとも移植されています。
私が使用するすべてのディストリビューションに組み込まれている標準のLinuxツールで可能な限り最高のエントロピーでパスワードを生成するには:
< /dev/urandom tr -cd "[:print:]" | head -c 32; echo
これは、ASCII印刷可能な文字-32(スペース)から126(チルド、~
)のすべてを出力します。パスワードの長さは、head
の-c
フラグで制御できます。 tr
の他の可能な文字セット(スペースを含めない場合は、33〜126の文字のみ、[:graph:]
を使用)。
必要なランダム性のレベルに応じて、組み込みの$RANDOM
変数であるbash(およびzsh
とksh
、場合によってはその他)を単純に使用できます。
$ 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文字を使用してランダムな文字列のみを生成します。それで十分かどうかは、何のために必要かによって異なります。
@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/random
をiconv -c -t US
でフィルタリングすることを最初に提案しました。しかし、ジルは別の診断と解決策を提案しました。
LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | dd bs=100 count=1 2>/dev/null
xxd
コマンドを使用して長さを指定し(-lを使用)、LinuxとOSの両方で機能します。 https://www.howtoforge.com/linux-xxd-command/
xxd -l16 -ps /dev/urandom
一部のLinuxディストリビューションでは、APG
がデフォルトで含まれています。
サイズが5から10のパスワードをサブセットSpecial、Numeric、Capital、およびLowerで生成するには、コマンドは次のとおりです。
apg -MSNCL -m 5 -x 10
そして戻る
@OpVeyhym9
3:Glul
3DroomIc?
hed&Os0
NefIj%Ob3
35Quok}
コメントで@landroniが言ったように。
まさにこの目的を持つmd5
ツールの1つを使用できます。完全にランダムなパスワードを作成する場合は、md5pass
を使用できます。 「通常のテキスト」と「塩」を一緒に使用して、後で回復できる同じパスワードを簡単に作成できるため、非常にシンプルで便利なツールです。または、完全に取得することもできます。常にランダムなパスワード。一般的な使用法は次のとおりです。
md5pass [password] [salt]
ここで、password
はランダム文字列の構築に使用される選択されたワードであり、salt
は使用されるバイト単位のジャンプです。このような:
md5pass Word
$1$.MUittVW$j.XDTF1QRnxqFdXRUiSLs0
これにより、使用する「ランダムシーケンス」パスワードが作成されます。 salt
を使用しない場合、後で同じ文字列を再作成できない可能性があります。
ただし、次のようにsalt
を使用する場合:
md5pass Word 512
$1$512$.0jcLPQ83jgszaPT8xzds0
その後、Wordを元々定義されていたものと同じソルト(またはジャンプ)と組み合わせて使用した場合に回復できるシーケンスを作成できます。
これらの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オプションは、パスワードの長さ(文字数)またはパスフレーズ(単語数)を指定します。
この場合、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
(ブロックサイズ)は、必要な長さに設定できます。base64
はデフォルトで76列に折り返されるため、必要がない場合は-w0
でリセットする必要があります。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
通常のパスワードを生成するコマンドを提供したい
$ 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
)は削除されました。
私はこれが好きです:
https://unix.stackexchange.com/a/230676/958 へのクレジット、特に私の最初のインスピレーションに対するコメント。
これまでの答えのいずれも、完全にOSを超えたものではありません。
主な欠陥はロケール定義(MacOSの場合)とtr
が文字の間隔を認識できない(Solarisの場合)ことで表されます。
shlibs を試してみてください。それは新鮮で本当にクロスOSです。ランダムな文字列を取得するコードはshlibs str005
(./shlibs str005
)。
50文字のランダムな文字列を取得し、句読点を含め、数字を除外します。
shlibs str005 50 -p -xd
非常に安全なパスワードのための私の方法(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
私は 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.