パスワード(ランダム文字列)生成コマンドについて備忘録としてまとめておくのです
汎用コマンド
大抵どの環境にも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
暇があったら随時追加