ランダムの文字列を作成する方法(openssl コマンド)

random string

■ OpenSSLコマンド(openssl rand)での生成

「openssl rand」でランダムなデータ(バイナリデータ)を生成して、パスワードでも利用可能な文字列を作成します。

● openssl コマンドを利用して乱数を生成

openssl コマンドでランダムなデータを生成し、数値を出力するためには、od コマンドで整数値に変換します。

32bit(4byte)符号なし整数を出力する場合は、以下のように実行します。

$ openssl rand 4 | od -vAn -N4 -tu4
 2675742259

ランダムなデータをファイルへ出力する場合

$ openssl rand 10 > rand.dat

$ xxd rand.dat 
00000000: 7b38 4675 7037 55aa e1b8                 {8Fup7U...

“rand.dat” に、10バイトのランダムなデータが出力されます。
(テキストエディタなどでファイルの中身を表示させようとしても、まともに中身を確認できませんが)

ランダムなデータを16進数文字列として出力。

生成される文字列は、英字(大文字もしくは小文字)と数字の組み合わせ。

$ openssl rand -hex 10
e0b65715efe980422868

1バイトのデータを16進数文字列に変換するため、結果は20文字の英数字になります。

ランダムなデータをBASE64形式で出力。

生成される文字列は、英字(大文字・は小文字)と数字および記号(”/” および “+”)の組み合わせ。

$ openssl rand -base64 12
AsnYJx9+8fSUR0UB

BASE64形式の場合、出力されるバイト数(文字数)は、4/3 倍になります(4の倍数になります)。
そのため、12バイトを指定すると、結果は16(12 × 4 ÷ 3)文字になります。

openssl で指定するバイト数を3の倍数以外にすると、出力結果の末尾に “=” が付与されます。

$ openssl rand -base64 14
Ko+EAgwQNcxjU1OiM1A=

任意の文字数で出力する場合、長めの文字列を生成して、切り取る方法があります。

$ openssl rand -base64 20 | fold -w 20 | head -n 1
UGz3y4VbOarWjfj/riBH

長めのランダムな文字列は生成できたのですが、記号(”/” および “+”)が含まれない可能性があるので、ちょっと一工夫します。
紛らわしい文字「1(数字の1)」「I(大文字のアイ)」「l(小文字のエル)」などを記号に置き換えてみます。
(置き換える文字は、個人の趣味ですが・・・)

$ openssl rand -base64 12 | tr '1iIl0OZBU' '^$@#=%<>-'
cSSJDtJr3FK%K#$s

ランダムなデータを tr コマンドと組み合わせる

ランダムの文字列を作成する方法(Linux コマンドライン)と同様に、tr コマンドと組み合わせることも可能です。

openssl コマンドで生成したデータを、trやfoldとの組み合わせることで、不要な文字を取り除いたり桁数を変更することも可能です。

数字のみ8桁を出力。

$ openssl rand  1000 | tr -dc '0-9' | fold -w 8 | head -1
65621414

$ openssl rand  1000 | tr -dc "[:digit:]"  | fold -w 8 | head -1
37687151

英数字8文字を出力。

$ openssl rand  1000 | tr -dc '0-9A-Za-z' | fold -w 8 | head -1
Fxv5FkP5

英数字16文字を出力。

$ openssl rand  1000 | tr -dc '0-9A-Za-z' | fold -w 16 | head -1
J1LdO4LVmqvBo9eY