■ 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