予約プロセスの一環として、次の方法を使用してユーザーのランダム コードを作成しています。
User.objects.make_random_password()
利用者は会場に立ち寄った際にパスワードを提示します。
2 人が同じコードに行き詰まることはないと想定しても安全でしょうか?
ありがとう
それは、あなたが現在持っている多くのユーザー、選択したパスワードの長さ、および使用方法によって異なります。User.objects.make_random_password()
デフォルトの場合、可能性は基本的にゼロです.IMO;
このメソッドは、 を使用して実装されget_random_string()
ます。django github リポジトリから:
def get_random_string(length=12,
allowed_chars='abcdefghijklmnopqrstuvwxyz'
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'):
"""
Returns a securely generated random string.
The default length of 12 with the a-z, A-Z, 0-9 character set returns
a 71-bit value. log_2((26+26+10)^12) =~ 71 bits
"""
if not using_sysrandom:
# This is ugly, and a hack, but it makes things better than
# the alternative of predictability. This re-seeds the PRNG
# using a value that is hard for an attacker to predict, every
# time a random string is required. This may change the
# properties of the chosen random sequence slightly, but this
# is better than absolute predictability.
random.seed(
hashlib.sha256(
"%s%s%s" % (
random.getstate(),
time.time(),
settings.SECRET_KEY)
).digest())
return ''.join([random.choice(allowed_chars) for i in range(length)])
github によると、現在のコードはデフォルトで 62 文字 (小文字と大文字と数字) の文字列から 12 文字のパスワードを使用しています。これにより、62**12 または 3226266762397899821056 (3.22e21) の異なるパスワードが可能になります。これは、現在の世界人口 (約 7e9) よりもはるかに大きいです。
文字は、random.choice()
関数によってこの文字のリストから選択されます。random.choice()
問題は、 を繰り返し呼び出すと、同じシーケンスが 2 回返される可能性がどのくらいあるかということになります。
の実装からわかるようget_random_string()
に、コードは予測可能性を回避しようと懸命に努力しています。OS の疑似乱数生成器 (Linux および *BSD では、イーサネット パケットまたはキープレスが到着する時間などから実際のランダム性を収集します) を使用しない場合、各呼び出しでrandom
モジュールのMersenne Twister予測可能 PRNG を次の組み合わせで再シードします。現在のランダムな状態、現在の時刻、および (おそらく一定の) 秘密鍵。
したがって、2 つの同一のパスワードを生成するには、ランダム ジェネレーターの状態 (Python では約 8 kiB) と生成時刻 (エポックからの秒数で測定) の両方time.time()
が同一である必要があります。システムの時間が適切に維持されていて、パスワード生成プログラムの 1 つのインスタンスを実行している場合、その可能性は基本的にゼロです。このパスワード生成プログラムの 2 つ以上のインスタンスをまったく同時に、まったく同じ PRNG のシードで起動し、それらの出力を組み合わせると、一部のパスワードが複数回表示されることが予想されます。
いいえ、2 人が同じコードを持つことはできないと仮定するのは安全ではありません。ランダムとは、唯一無二という意味ではありません。指定した長さと扱っているユーザーの数によっては、可能性が低く、まれな場合があります。しかし、その独自性に頼ることはできません。