pythonでパスワードを生成するプログラムを作ろう
皆さんこんにちは。インフラチームの齊藤です。
今回はpythonを用いてパスワードを作成する方法を書いてみようと思います。
早速ですが、みなさんは、パスワードを日頃どのように決めてらっしゃいますか?
パスワードを決める際にどんなものにしようか悩まれる方は多いのではないでしょうか。
インターネットに繋がっている環境があれば、
既存のパスワード作成サイトを探すこともできますが、
ネットに繋がっていない環境でサーバのパスワードを決める必要がある場合も考えられます。
そんなわけで、今日はパスワードを作成する簡単なプログラムをご紹介します。
パスワードを生成する
今回は、8文字のパスワードを10個生成するプログラムをpythonで作成しましょう。
以下がソースコードになります。
from random import choice from string import ascii_letters, digits, punctuation def gen_passwd(length=8, chars=ascii_letters+digits+punctuation): return ''.join([choice(chars) for i in range(length)]) for i in range(10): print(gen_passwd(8, ascii_letters+digits))
ポイントを絞って解説します。
gen_passwdは、パスワードの文字数と単語の羅列を引数として受け取り、
パスワードを出力する関数です。
ascii_lettersがa~z,A~Zのアルファベットの列です。
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
digitsが0~9の文字列です。
0123456789
このプログラムをお手元のPCで実行してみましょう。
$ python pass.py 49HisGp9 lCH0m8gC iw7kPHF9 sxRXMnVS h9u2g8Zd 7XI3Abwk U47mAn36 wtrxmhnJ 1Ml5DRTa GDlIO7Bn
パスワードの候補が出力されました!
より強力なパスワードにする
パスワードは特殊記号を使用することでより強力なパスワードにすることができます。
特殊記号とは以下のような記号です。
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
これを使用するために、関数の引数にpunctuationを足してプログラムを動かすと、
$ python random_pass.py [root@sim pybox]# ./random_pass.py P`)Y*HDg &j/{JigU NIDmYL|v DTg,,<8u [W:=7Y%H _JDy}OXJ ?4e0]fW :-rR2X4q #)M7/f+K <IY?'v$U
特殊記号が含まれたパスワードが生成されました。これでより強力なパスワードとなります。
パスワードの長さを8文字から変更するのが億劫になったら、sysやargparseをインポートすることでプログラムをコマンド化することもできます。
translateを使用してあらかじめ使わない文字を除外することもできるでしょう。
是非、拡張してみてください。
補足
サーバを攻撃する方法のひとつに辞書攻撃というものがあります。
クラッカーは辞書攻撃を仕掛ける際、パスワードを破るために、パスワードで使用されやすい単語が載った辞書ファイルを用意しています。
代表的な辞書はhttp://download.openwall.net/というサイトで手に入れられるようです。
クラッカーは、この辞書ファイルをもとに攻撃を仕掛けてくるかもしれません。
あなたのパスワードがこの辞書ファイルに含まれている文字を含んでいる場合には、
パスワードは破られてしまう可能性が当然あがります。
また、より直接的な方法として総当り攻撃と呼ばれるものも存在します。
こちらを回避したければ、パスワードを長くすることをオススメします。
Basic認証やWordpressのログイン画面など、
不特定多数の人物がアクセスできる場合には上記内容を是非一度、ご検討ください。