APIトークンやパスワード、暗号鍵などに使うランダムな文字列が欲しいときは、openssl randを使う。

$ openssl rand -hex 16
5716e7f5eb697596812661242853e3d0

-hexは16進数、-base64はBase64で出力する。数値は出力の文字数ではなく、生成するバイト数を表す。

$ openssl rand -base64 32
wGA08IyUS3Pz7a1BSJh5RPng95b5wh/CCx2r046Rwdk=

実行例はUbuntu 24.04のOpenSSL 3.0.13のもの。

欲しい文字数から指定するバイト数を決める

openssl randの数値はバイト数なので、出力の文字数は形式によって変わる。

形式出力の文字数例
-hexバイト数の2倍-hex 16で32文字
-base64バイト数の約4/3倍(4の倍数に切り上げ)-base64 32で44文字
$ openssl rand -hex 16 | tr -d '\n' | wc -c
32
$ openssl rand -base64 32 | tr -d '\n' | wc -c
44

16進数は0-9a-fだけで構成されるため、どこに貼り付けても扱いやすい。Base64は英大文字・小文字・数字に加えて+・/・=を含む。そのかわり、同じ文字数でより多くのランダムなデータを表せる。

用途別の例

APIトークンやシークレットキーを作る

アプリケーションの設定ファイルに書くシークレットキーなどは、-hexで作ると扱いやすい。以下は32バイト(256ビット)のランダムな値を64文字の16進数で出力する例。

$ openssl rand -hex 32
85d363562699af44fbf2b72bfc3f9667ad7949c2320db5605555eb5881f6e3e2

パスワードを作る

パスワードのように短い文字数で強度を確保したい場合は、-base64を使う。

以下は15バイトから20文字のパスワードを作る例。

$ openssl rand -base64 15
XSIPhN9kSfeMGrumIfuW

使える文字種を指定したい場合は、/dev/urandomとtrを組み合わせる方法もある。

参考: コマンドでパスワードを生成する

URLに含められる文字列を作る

Base64の+・/・=は、URLの中では特別な意味を持つ。たとえば+はクエリ文字列で空白として扱われ、/はパスの区切りになる。URLに含める場合は、+を-に、/を_に置き換え、=を取り除いてURLセーフなBase64にする。

$ openssl rand -base64 18 | tr '+/' '-_' | tr -d '='
-j4Az3KxAHUZHFxXX3jo9enK

この形式はbase64url(RFC 4648)と呼ばれる。バイト数を3の倍数にするとBase64の末尾に=が付かないため、上の例のtr -d '='はバイト数が3の倍数でない場合のためのものである。

暗号鍵をバイナリのまま保存する

-hexと-base64のどちらも付けない場合は、ランダムなバイト列をそのまま出力する。-outでファイルに保存できる。

$ openssl rand -out key.bin 32
$ ls -l key.bin
-rw-r--r-- 1 root root 32 Sep 30 13:24 key.bin
$ od -An -tx1 key.bin
 aa 4e db dc fd d1 cb d1 d1 1b 7f c4 09 9c 82 ac
 26 89 bd ee ac b7 7f 4c 3b 10 95 44 50 30 03 b6

バイナリを端末へそのまま出力すると、端末の表示の崩れる場合がある。-outでファイルに保存するか、odなどに渡す。

-hexや-base64と-outを組み合わせると、テキストとして保存される。末尾に改行が付くため、-hex 16で保存したファイルは33バイトになる。

$ openssl rand -hex -out key.hex 16
$ wc -c key.hex
33 key.hex

Base64の出力を1行にする

-base64の出力は64文字ごとに改行される。48バイトを超える値を生成すると、複数行になる。

$ openssl rand -base64 64
Uz8NaYakudS4Od4ymiibEFOPMmzWqsmRJbxoBKKOHUDHmmhIbd1pvu2YsYggohiE
N6tHSiTrtLlktohj7eNP6g==

1行にしたい場合は、trで改行を取り除く。

$ openssl rand -base64 64 | tr -d '\n'

-hexは改行されず、常に1行で出力される。

注意点

-hexと-base64を両方指定した場合

-hexと-base64を両方指定すると、後に指定した方が使われる。

$ openssl rand -base64 -hex 4
807cd46c
$ openssl rand -hex -base64 4
A6Qdfg==

バイト数を0や単位付きで指定した場合

バイト数に0を指定するとエラーになる。

$ openssl rand -hex 0
rand: Use -help for summary.

バイト数を省略した場合はエラーにならない。-hexでは空行だけが出力され、-base64や形式の指定なしでは何も出力されない。

OpenSSL 3.0では、1Kのような単位付きの指定はできない。

$ openssl rand 1K
rand: Can't parse "1K" as a number
rand: Use -help for summary.

OpenSSL 3.5や3.6では1Kや1Mのような単位を使え、1Kは1024バイトとして扱われる。

macOS標準の/usr/bin/openssl(LibreSSL)は挙動が異なる。1Kはエラーにならず1バイトとして扱われる。また、0を指定してもエラーにならない。

参考

openssl-rand - OpenSSL Documentation