安全な乱数

通常の乱数は簡単な規則で作られているので,パスワードの生成には使えない。暗号学的に安全な乱数(cryptographically secure random numbers)を使うべきである。Python では secrets というライブラリがこのために存在する(PEP 506 参照)。

ランダムなパスワードを生成したいなら,例えば次のようにすれば,9バイトのランダムなビット列を Base64 にしたもの(12文字)を出力してくれる:

In [ ]: import secrets

In [ ]: secrets.token_urlsafe(9)
Out[ ]: 'c31jnRMYaQ3j'

より一般的に,任意の文字集合のパスワードを生成するには,次のようにする:

n = 12  # 長さ
a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"  # 文字集合
print(''.join([secrets.choice(a) for _ in range(n)]))

サイトによっては,秘密のことばを全角で入れろなどと言ってくるところがある:

n = 12  # 長さ
a = "あいうえおかきくけこさしすせそたちつてとなにぬねの" \
    "はひふへほまみむめもやゆよらりるれろわん"
print(''.join([secrets.choice(a) for _ in range(n)]))

よく使うなら次のような mkpasswd.py を作ってパスの通ったところに置いておく:

#! /usr/bin/env python3

import sys, secrets

n = int(sys.argv[1]) if sys.argv[1:] else 12
a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
print(''.join([secrets.choice(a) for _ in range(n)]))

Last modified: