/dev/urandom を使ったパスワード生成
/dev/urandomを使用してランダムなバイト列を生成し、ascii文字列のみを抽出してパスワードを生成する。
$ cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#$%^&*()_+-=[]{}<>?' | fold -w 20 | head -n 1
'a-zA-Z0-9!@#$%^&*()_+-=[]{}<>?'の部分に使用したい文字セットを指定する。
生成されるパスワードの長さはfold -wの引数に指定する。上記の場合は20文字のパスワードが生成される。
パイプで繋いでいる各コマンドは以下の通り動作する。
cat /dev/urandom:/dev/urandomからランダムなバイト列を読み取る。tr -dc 'a-zA-Z0-9!@#$%^&*()_+-=[]{}<>?':trコマンドで指定した文字セット(a-zA-Z0-9!@#$%^&*()_+-=[]{}<>?)以外(-c)の文字を削除(-d)する。fold -w 20:foldコマンドで20文字ごとに折り返す。指定した長さのパスワードを生成するために指定している。head -n 1:headコマンドで最初の1行を取得する。
macOSでのエラー
macOSのtrコマンドでは以下のエラーが発生する。
tr: illegal byte sequence
その場合はtrコマンドにLC_ALL=Cを設定して実行する。
$ cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9!@#$%^&*()_+-=[]{}<>?' | fold -w 20 | head -n 1
注意点
単純にランダムな文字列のうち有効文字の先頭から取得しているので、生成されたパスワードに必ずしも大文字・小文字・記号が混合されるとは限らない。
セキュリティ要件に応じて生成されたパスワードを確認し、必要に応じて再生成する必要がある。
opensslを使ったパスワード生成
opensslコマンドを使用してランダムなパスワードを生成する。
$ openssl rand -base64 20
-base64オプションを使用することで、Base64エンコードされたランダムなバイト列を生成する。
base64エンコードであるため、使用される文字は英数字と+、/、=のみ。
そのため/dev/urandomを使った方法と比べて文字種を自由に指定できない。
\第一線のプログラマーの行動原理を学べる!/
