Python - よく使うモジュール - セキュリティ - secrets 乱数生成
- 1. 概要
- 2. ランダムパスワード生成
- 3. URL safe な文字列
1. 概要
ランダムパスワードを作成したいと、「Python」「ランダムパスワード」をキーワードに検索するとかかるのが、「secrets」です。
ドキュメントには。
secrets モジュールを使って、パスワードやアカウント認証、セキュリティトークンなどの機密を扱うのに適した、暗号学的に強い乱数を生成することができます。
と記述されております。
本ページは、下記にサイトを参考にさせていただきました。
「secrets --- 機密を扱うために安全な乱数を生成する」
「Python で強力なパスワードを作る #Python3」
「パスワードに使用可能な記号一覧」
「ユーザー名、パスワードに使用できる文字」
本ページのソースは、実行結果を掲載しません。
なんせ、ランダムなもので、何が表示されるかは、一定ではないのでね。
2. ランダムパスワード生成
ドキュメントでは。
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))
というソースが例示されています。
「range(8)」の部分は、文字数に相当するので、これは、8文字のパスワードを生成しているわけです。
「secrets.choice()」の中には、パスワードを構成する文字を記述します。
ドキュメントには、もうひとつ。
import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(secrets.choice(alphabet) for i in range(10))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3):
break
これは、「アルファべットと数字からなり、小文字を少なくとも1つと数字を少なくとも3つ含む、10文字のパスワードを生成する」ということだそうです。
まぁ、なんとなくわかりますわな。
3. URL sage な文字列
英数字に記号を混ぜたいので、文字列定数には、記号もいれたいところです。
import string
import secrets
password = ''.join(secrets.choice(string.ascii_letters + string.digits + string.punctuation) for i in range(16))
てな感じでしょうか。
しかし、サイトによっては、いわゆる 33 文字のパスワード用の記号(「パスワードに使用可能な記号一覧」参照)のうち使えるものがないものもあります。
ユーザ名の場合、「:」「"」が使えなかったりします。
「secrets」には、「token_urlsafe()」というメソッドも用意されています。
import secrets
password = secrets.token_urlsafe(16)
てな感じですかな。
しかしこれだと、「.」あたりは、はいらないんでしょうな。
結局。
import string
import secrets
password = ''.join(secrets.choice(string.ascii_letters + string.digits + '\'!"#$%&()*+,-./:;<=>?@[\]^_`{|}~') for i in range(16))
というソースを書いておいて、場面ごとに、文字列から、使えないものをけずったりするしかないのかな。
文字列定義の最初の文字は、「'」をエスケープしていますので、ご注意。
|
|