今日は小ネタです。
どこかのサイトに登録するとパスワードを求められることが多いと思います。ブラウザの自動生成機能を使っても良いのですが、別のブラウザで使う時にコピーし忘れてしまったり、使えない文字が入っているのに平気で設定しようとしたりして、不便な時があります。
今回はパスワードを自動生成するスクリプトを python で作成します。
# -*- coding: utf-8 -*-
import secrets
import sys
num = 12
if len(sys.argv) > 1:
num = int(sys.argv[1])
p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
pa = [p[i:i+1] for i in range(len(p))]
x = [secrets.choice(pa) for i in range(num)]
print("".join(x))
ライブラリは secrets を使用します。こちらの方が /dev/urandom を使った類推しにくい結果が得られるようです。詳細はこちらの記事(英語)を参照してください。
文字列長はデフォルト12文字としました。
簡易なプログラムなので、稀に大文字・小文字が混じっていない、数字が入っていない等の現象が発生しますが、何回か実行してみてよさげな文字列を拾うのが良いと思います。
しかし、未だにログイン時にパスワードを求めるのではなく、ssh のように DH 鍵交換するとか、TLS のように証明書ベースにするとかもっとスマートな方向にならないのでしょうか。
文字列を分解して文字リストを作る部分が 3.8.x だと機能しませんでした。全バージョンで動作するよう書き換えました。