パスワード(ランダム文字列)生成コマンドについて備忘録としてまとめておくのです
汎用コマンド
大抵どの環境にも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に渡す定数で文字列条件を調整printableの場合whitespaceも含まれてしまうためstrip追加- ref: https://docs.python.org/ja/3/library/string.html
python -c "import string,random;print(''.join(random.choice(string.printable).strip() for _ in range(45)));"
-H3IA6}]#LJ0q#sqp8uEBgJ1T]yboEC:bJ#Sr_"l
Julia
Random.randstring([rng], [chars], [len])利用- 標準モジュールのため追加インストール不要
- 適宜
rngに渡すジェネレータを変更 - 適宜
charsに渡す定数で文字列条件を調整
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
暇があったら随時追加