ランダムな文字列(パスワード、ユーザー名など)を生成したいと思います。必要な長さ(13文字など)を指定できる必要があります。
どのツールを使用できますか?
(セキュリティとプライバシーの理由から、ウェブサイトでのオンラインではなく、オフラインで文字列を生成することが望ましいです。)
apg
。
ランダムな文字列(パスワード、ユーザー名など)を生成したいと思います。必要な長さ(13文字など)を指定できる必要があります。
どのツールを使用できますか?
(セキュリティとプライバシーの理由から、ウェブサイトでのオンラインではなく、オフラインで文字列を生成することが望ましいです。)
apg
。
回答:
私のお気に入りの方法は、/dev/urandom
一緒に使用してtr
不要な文字を削除することです。たとえば、数字と文字のみを取得するには:
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
または、OWASPパスワード特殊文字リストからさらに文字を含めるには:
</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
head /dev/urandom | tr -dc A-Za-z0-9 | head -c10
この方法はより正確です。大文字、小文字、または数字の10文字を取得します
head
コマンドには問題がある可能性があります。はから最初の10行を出力し/dev/urandom
ます。つまり、10番目の改行が見つかったら停止します。したがって、tr
コマンドに送信される出力の長さはランダムです。からの出力が13文字未満になる可能性がありますtr
。私はこれが起こる確率を計算していません、計算は少し難しいです。
<dev/urandom tr -dc "$charset" | head -c "$length"
tr -dc A-Za-z0-9\!\"#$\&\'\(\)\*+,-./\:\\\\\;\<=\>\?@[]^_`{\|}~
tr ..
コマンドで何が機能していないのかわかりませんが、すべてを引用するだけで(一重引用符を除く)動作します– tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~'
。
ランダムなパスワードを生成するには、次を使用できます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
pwgen -s
。
私はopenssl
コマンド、暗号のスイスアーミーナイフを使用しています。
openssl rand -base64 12
または
openssl rand -hex 12
rand -hex
キーボードの90+ではなく、出力を16文字に制限します。base64は64文字であるため優れていますが、ランダムではありません(たとえば、予測可能なパディングパターンがあり、おそらくいくつかの文字は他の文字よりも頻繁に表示されます)。
openssl rand -base64 12
は、16文字の出力が生成されることに注意してください(256の値が64にマップされるため)。また、16進数の例では24文字が生成されます。16進数の場合は1:2の単純なマッピングなので損失はありませんが、base64の場合はパディングが使用されているため、多少の損失が生じる可能性があります。基数はランダム性に影響を与えません。それは、あるものが別のものにマッピングされる方法です。(そして、総ビット数がはるかに重要です)。
方法は次のとおりです。10文字のランダムな文字列を生成します。「fold」を他の文字列処理ツールに置き換えることで最適化できます。
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1
/dev/urandom
です。もちろん、当然のことです
私が使用するすべてのディストリビューションに組み込まれている標準のLinuxツールで可能な限り最高のエントロピーでパスワードを生成するには:
< /dev/urandom tr -cd "[:print:]" | head -c 32; echo
これは、32(スペース)から126(チルダ)までのすべてのASCII印刷可能文字を出力します~
。パスワードの長さはhead
の-c
フラグで制御できます。他にも使用可能な文字セットがありますtr
(スペースを含めないためには、文字33〜126のみを使用します[:graph:]
)。
< /dev/urandom tr -cd '[:graph:]'| tr -d '\\' | head -c 32; echo
` characters in generated string.
多くの言語でエスケープ文字であるため、 `が必要ない場合は問題が発生します
< /dev/urandom tr -cd "[:print:]" | tr -d ' \\/\`\|' | head -c 32; echo
除外する| \ / `とスペース
希望するランダム性のレベルに応じて、単純にbash(zsh
およびksh
、場合によっては他の)組み込み$RANDOM
変数を使用できます。
$ 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文字を使用してランダムな文字列のみを生成します。それがあなたにとって十分かどうかは、あなたがこれを何のために必要とするかに依存します。
$RANDOM
0から32767の間の数を出力します
rand=$(head -c 100 /dev/urandom | tr -dc A-Za-z0-9 | head -c13)
代わりに何かを使うだけです。
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の一部であり、広く利用可能であるか、少なくとも移植されています。
@Brandinは別の回答へのコメントで、を/dev/urandom
使用して最大100バイトを取得する方法を説明しましたhead -c 100
。これを行う別の方法はdd
次のとおりです。
tr -dc A-Za-z0-9 < /dev/urandom | dd bs=100 count=1 2>/dev/null
2>/dev/null
最後のdd
コマンドは、出力を「アウト記録に/ ... ...レコードを」抑制することです。
これらの2つの方法の間に大きな利点/欠点があることは知りません。
tr
入力について不平を言う両方の方法に問題がありました。これはバイナリ入力を受け取るのが好きではなかったためだと思い、最初のフィルタリングを提案しました/dev/random
をしましたiconv -c -t US
。ただし、Gillesは別の診断と解決策を提案しました。
LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | dd bs=100 count=1 2>/dev/null
iconv
ソリューションは1つのCPUコアを最大化し、出力を生成しません(それを殺す前に10
libc-bin
2.19 で提供されます。同じiconvかどうかわからない
tr
バイナリ入力をサポートします。ただし、このような範囲A-Z
はロケール設定の影響を受ける場合があります。試してくださいLC_ALL=C tr …
tr
マルチバイトをまったくサポートしていないため、GNUのみがサポートしています(たとえば、前回チェックしたとき、すべてのバイトの6ビット目を設定するだけで大文字小文字の変更が実装されていました)。他のシステム(BSDなど)はマルチバイトをサポートしますが、ランダム入力ストリームが有効なマルチバイトストリームである可能性はほとんどのエンコーディングで非常に小さいため、そこで失敗します。GNU はいつでもマルチバイトサポートを追加できますが、この時点では失敗します。もちろん、設定LC_ALL=C
はそれを修正します。
tr
(Cロケールで)バイナリ入力を処理する必要があります。(まあ、[OK]を、それが唯一のNULLバイトがサポートされることを明示的に述べて、それが空でないファイルは、改行文字で終わっていないことを言っていない、サポートされるようにしているが、実際には、同様常にそうだということ。)
APG
一部のLinuxディストリビューションにはデフォルトで含まれています。
Special、Numeric、Capital、およびLowerのサブセットでサイズ5〜10のパスワードを生成するには、コマンドは次のとおりです。
apg -MSNCL -m 5 -x 10
そして戻ります
@OpVeyhym9
3:Glul
3DroomIc?
hed&Os0
NefIj%Ob3
35Quok}
コメントで@landroniが言ったように。
apg -a1 -m14
md5
まさにこの目的を持つツールの1つを使用できます。完全にランダムなパスワードを作成する場合は、を使用できますmd5pass
。「通常のテキスト」と「塩」を一緒に使用して、後で回復できる同じパスワードのビット構成をジャンプすることができます。または、完全に常にランダムなパスワード。一般的な使用法は次のとおりです。
md5pass [password] [salt]
where password
は、ランダム文字列の構築に使用される選択された単語であり、salt
使用されるバイト単位のジャンプです。このような:
md5pass word
$1$.MUittVW$j.XDTF1QRnxqFdXRUiSLs0
これにより、使用する「ランダムシーケンス」パスワードが作成されます。使用しない場合salt
、後でこの同じ文字列を再作成できない場合があります。
ただし、次のsalt
ようなものを使用する場合:
md5pass word 512
$1$512$.0jcLPQ83jgszaPT8xzds0
その後、同じソルト(またはジャンプ)と共に単語を使用した場合に元々定義されていた場合に回復できるシーケンスを作成できます。
salt
使用されている、これは... PasswordMakerのアプローチに似て聞こえる
xxd
コマンドを使用して、長さを指定します(-lを使用)。これは、LinuxとOSの両方で機能します。
https://www.howtoforge.com/linux-xxd-command/
xxd -l16 -ps /dev/urandom
これらの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' ' '
パスワードジェネレーターには、パスワードに使用するすべての文字、1行に1文字、それぞれ1回ずつを含むfile_with_charactersが必要です。ファイルには空白行が含まれてはならず、行は改行で終了する必要があります。
パスフレーズジェネレーターには、パスフレーズで使用するすべての単語、行ごとに1単語、および正確に各1回を含むfile_with_wordsが必要です。ファイルには空白行が含まれてはならず、行は改行で終了する必要があります。
--head-countオプションは、パスワードの長さを文字数またはパスフレーズ数で指定します。
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
私が使う:
base64 < /dev/urandom | tr -d 'O0Il1+\' | head -c 44
これにより、57の可能な文字が与えられます。文字列は、コピー+
アンドペースト(削除および削除\
)するか、区別が難しい文字(I1lO0
)が削除されたため、印刷して再入力できます。
私はこれが好きです:
功績https://unix.stackexchange.com/a/230676/9583と私の最初のインスピレーションのために特にコメント。
1
、エントロピーを減らすことなく安全に追加できます(数字を1つ取得するために新しい数字を生成すると、エントロピーが低下します)。!
エントロピーを低下させずに安全に追加することもできます。どちらのスキームもエントロピーを増やす価値はありませんが、生成された文字列を古いパスワード要件に準拠させることができます。
この場合、「1つのことをうまく行う多くの小さなツール」というUnixの哲学が非常に役立ちます。
/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
ない限り、リセットする必要があります。パスワードを生成する通常のコマンドを提供したい
$ 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:]
私が自分のパスワードジェネレーターだけを選ぶ理由です
私secpwgen
は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.
非常に安全なパスワードの方法(16はpwの長さ):
cat /dev/urandom | tr -cd [:graph:]|head -c 16
結果の例:
jT@s_Nx]gH<wL~W}
または、複数のパスワードを生成するには:
cat / 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
これを達成するための非常に簡単でシンプルな(おそらくあなたが探しているよりも簡単な)方法は、与えられた範囲で乱数を生成し、その数字を同等のASCII文字に変換し、文字列の末尾に追加することです。
Pythonの基本的な例を次に示します。
import random # import random library
passFile = open("passwords.txt", 'w') # create file passwords.txt
passNum = int(input("Number of passwords: ")) # get number of passwords
passLength = int(input("Password length: ")) # get length of passwords
for i in range(passNum):
password = "" # reset password
for i in range(passLength):
num = random.randint(65, 122) # get random number
while num in range(91, 97): # Don't include punctuation
num = random.randint(65, 122)
password += chr(num) # add character to current password
passFile.write(password + "\n") # add current password to file
passFile.close() # close file
編集:コメントを追加し、複数のパスワードを生成してファイルに書き込むためのコードを追加しました
このコマンドが欲しい:
date +%s | sha256sum | base64 | head -c 12
date +%N
使用します。スクリプトで多数のユーザーとパスワードを生成すると、多くのまたはすべての日付コマンドで秒が同じになり、同一のパスワードが生成されるためです。
dd if=/dev/random bs=512 count=1
か?
http://passwordsgenerator.net/に移動 します。最大2048文字のランダムな文字列を生成し、大文字、小文字、0〜9の数字、句読点、または任意の組み合わせを選択できます。
apg
個人的に使用します。)