コマンドラインでのパスワード生成コマンド備忘録


Tips for Password generate utils on cli

パスワード(ランダム文字列)生成コマンドについて備忘録としてまとめておくのです

汎用コマンド

大抵どの環境にもopenssl/dev/randomはあるだろうから汎用的な生成方法

OpenSSL

opensslコマンドでは以下

# openssl (Mac)
openssl rand 117 | base64

LU5VeI9gmazBXHHs/Gg3NjWs4Layq6f1Q5iiVS1nXkgzRYsVSQAWF4t2Zp2c1ImNzq6R9EJ9lNzso/BHK88QApZh7JV4xVWt6f+DqhF4iPaRZo672Tk4HwW/rucfkqIehLlYoMPIfpfJAZYtY2t7QsyRWA6n

# openssl (Linux)
openssl rand 117 | base64 -w0
...
  • openssl自体にも-base64オプションはありますが, ある一定の長さで折返しのwrap処理が発生するため あえてパイプでbase64コマンドに渡します(Mac以外の環境では-w0でwrap処理を無効に)
  • また、末尾のパディング(=)が気になる場合はrandに渡す数字の指定を3の倍数にしておく
    • 3の倍数かの判定は各桁の和が3の倍数かで簡単に判断できる
    • 上の例だと117 => 1 + 1 + 7 = 9(3の倍数)みたいな

/dev/random

ほぼないと思うけどopensslがない場合、/dev/randomで生成

# Mac
head -n10 /dev/random | base64 | cut -b 1-40

HtnP5ah/orISv3mXn3MBRF5j+YyQfd4s8gqtBOlh

# Linux
head -n10 /dev/random | base64 -w0 | cut -b 1-40
...
  • /dev/randomから生成されるランダムなバイナリを10行読み出しbase64後、ほしい文字列分切り出すアプローチ
  • /dev/randomのほうが理想的だけど、エントロピー不足で読み出せない場合は適宜/dev/urandomを利用
    • このあたり受容するかは場合に応じて

for each OS

基本上の方法で事足りるけど、大文字/数字/記号を含む、など細かい設定がほしい時など 各OSでよく使われるCLI Utilを利用

Mac/Debian(Ubuntu)

  • pwgenがよく使われる
  • Macならbrew, Debianならaptなどでインストールする必要があるのが微妙
# install
brew install pwgen

# gen rand (pwgen <生成する文字数> <生成する文字列の数>)
pwgen -ys 45 1

D]FQ!gcQ?iq-b#,IWAD>jg@\o=yP6]e7&E5s>"{%8<U7Q
  • man pwgenで適宜必要なオプションを
    • 記号あり--symbols(-y), Secure--secure(-s)あたりつけておくとかなり強力

RedHat(CentOS)

  • mkpassがよく使われる
  • 環境によってはyumなどでインストール必要
# install (expectに含まれる)
sudo yum install expect

# gen rand
mkpass -l 45

jhajz5nm^qmsdeniumJa7cpfgfljfzfnmLtgepjwihpgm
  • デフォルトで記号1つ、数字・大小英字2つ以上が入るようになっている
  • 適宜オプションで記号・大文字・数字の混入数を調整可能

for each Programming Lang

適当なプログラミング(スクリプト)言語でさくっと

Perl

  • String::Randomモジュールを利用
    • 要追加インストール
    • 適宜randregexに渡す正規表現で文字列条件を指定
# install module
cpan install String::Random

# ごちゃまぜ
perl -e 'use String::Random;my $s = String::Random->new();print $s->randregex(".{45}");'

K.oc_@t:>xR<>6}'4Ue%gYknn0j*o!jMPMAKNih6g[wZ"

# 大小英数字
perl -e 'use String::Random;my $s = String::Random->new();print $s->randregex("[a-zA-Z0-9]{45}");'

nG2hgsMvYrqJOWmRVCBA2iulGk6UViddZSzb8HjYlv5b

Python

  • random,string モジュールを利用
    • 標準モジュールのため追加インストール不要
    • 適宜ramdom.choiceに渡す定数で文字列条件を調整
python -c "import string,random;print(''.join(random.choice(string.printable).strip() for _ in range(45)));"

-H3IA6}]#LJ0q#sqp8uEBgJ1T]yboEC:bJ#Sr_"l

Julia

julia -E "using Random;randstring(RandomDevice(),['1':'9';'a':'z';'A':'Z';'%';'_';'/';'@';'!';'&';'*';'+';'-'], 45)" 

"BTWt@U6BAUPzYgN&rvUM4*jZPgc!ka*e7HSHO8ddVn3AA"

Javascript(nodejs)

  • cryptoモジュールを利用
    • 上述のopensslと同じようなアプローチで
node -p "require('crypto').randomBytes(45).toString('base64')"

G5MwOlogTXAn5YGLoEjFvu1PMW6OkN1RJkGxweWpcCTYMTDwjlM/xJQ286xZ

others

暇があったら随時追加


See also