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))
 というソースを書いておいて、場面ごとに、文字列から、使えないものをけずったりするしかないのかな。  文字列定義の最初の文字は、「'」をエスケープしていますので、ご注意。
AbemaTV 無料体験