4

予約プロセスの一環として、次の方法を使用してユーザーのランダム コードを作成しています。

 User.objects.make_random_password()

利用者は会場に立ち寄った際にパスワードを提示します。

2 人が同じコードに行き詰まることはないと想定しても安全でしょうか?

ありがとう

4

2 に答える 2

5

それは、あなたが現在持っている多くのユーザー、選択したパスワードの長さ、および使用方法によって異なります。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 のシードで起動し、それらの出力を組み合わせると、一部のパスワードが複数回表示されることが予想されます。

于 2012-09-23T16:38:39.780 に答える
5

いいえ、2 人が同じコードを持つことはできないと仮定するのは安全ではありません。ランダムとは、唯一無二という意味ではありません。指定した長さと扱っているユーザーの数によっては、可能性が低く、まれな場合があります。しかし、その独自性に頼ることはできません。

于 2012-09-23T15:34:39.957 に答える