OpenSSL の rand コマンドでランダムな文字列を得る

パスワードなどのためにランダムな文字列が欲しいとき、使用する文字に制限があるような場合には、文字列生成用のスクリプトを書いたりしますが、お手軽に生成するなら OpenSSL の rand コマンドを使うのがおすすめです。

コマンドの書式は

$ openssl rand -hex 24
$ openssl rand -base64 24

のような形になります。最後の数字は生成するデータのバイト数です。上記の例では 24 バイトのデータを出力しています。-hex-base64 は出力時のフォーマットです。これらを指定しないと出力が文字化けしてしまい、使い物になりません。どのフォーマットで出力するかによって、実際に表示される文字の種類と長さが変わってきます。

-hex を指定した場合

-hex を指定した場合、出力される文字は正規表現で表すと [0-9a-z] になります。また、文字の長さは指定したバイト数を n とすると、2n となります。

$ openssl rand -hex 24
8282287913b59575be07c5b3ad7bdc50940e372a94019267

-base64 を指定した場合

-base64 を指定した場合、出力されるは正規表現で表すと [0-9a-zA-Z+/] になります。また、文字の長さは指定したバイト数を n とすると、4(n/3) となります(n/3 は切り上げ)。ただ、n が 3 の倍数でない場合は、末尾が = で埋められるので、n は 3 の倍数のほうがいいと思います。

$ openssl rand -base64 24
IJ+XidW4AQLG73HBJWtM/9I8jKAKMsji
$ openssl rand -base64 23
JeBCcyauK/y3ME0lhg1LWTSrqMZZulk=

ちなみに、Base64 の仕様で出力される文字が 64 文字を超えると改行されるため、出力を 1 行に収めたいときは出力するバイト数は 48 にとどめる必要があります。

$ openssl rand -base64 48
fyvx7ihbyRZGHIskq43tZeGT83up5kSYr3A8GBuxLJrjkdd4ZEQm9VeSBMk9B5st
$ openssl rand -base64 51
9oFAAOA5+FhsQRvpxGXo7vJPIHvZJvnn3GimK1Lym9zXJb5jO+qc0F/jJmDOhhxm
KecY

この記事を書いた人
グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。