[PYTHON] Django 1.4.2 Generierung von Sitzungsschlüsseln

Ich fragte mich, warum Django versuchte, einen eindeutigen Schlüssel herzustellen, und suchte ihn bei meinem Nachbarn nach.

Ich konnte keinen Code finden, der die PID des Betriebssystems in 1.4.2 zur Hand hatte.

Es gibt eine Methode namens _get_new_session_key () in django.contrib.sessions.base.SessionBase, aber darin wird get_random_string () in django.utils.crypto verwendet und es ist wahrscheinlich die Funktion, die den Schlüssel generiert.

crypto.py


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)])

Wenn useng_sysramdom False ist Random.getstate (), time.time () und settings.SECRET_KEY werden mit SHA256 als Startwert multipliziert.

Das Flag using_sysramdom wird in crypto.py gesetzt, um festzustellen, ob random.SysRandom verfügbar ist. Dies entspricht dem Inhalt des obigen Blogs.

crypto.py


import random
try:
    random = random.SystemRandom()
    using_sysrandom = True
except NotImplementedError:
    import warnings
    warnings.warn('A secure pseudo-random number generator is not available '
                  'on your system. Falling back to Mersenne Twister.')
    using_sysrandom = False

Dies ist am Ende ein Ramdom-Wert, also frage ich mich immer noch, ob es ein eindeutiger Schlüssel ist, aber ich frage mich, ob es so ist.

Übrigens, als ich in der Vergangenheit versucht habe, einen eindeutigen Wert zu erstellen, Catalyst :: Plugin :: Session /Session.pm) Ich habe mir (perl) geliehen.

Session.pm


my $counter;

sub session_hash_seed {
    my $c = shift;

    return join( "", ++$counter, time, rand, $$, {}, overload::StrVal($c), );
}

# ~~ snip ~~

sub generate_session_id {
    my $c = shift;

    my $digest = $c->_find_digest();
    $digest->add( $c->session_hash_seed() );
    return $digest->hexdigest;
}

Ich habe Ramdom am Ende nicht angewendet, daher denke ich, dass dieses einzigartiger ist, aber ich weiß es nicht.

Recommended Posts

Django 1.4.2 Generierung von Sitzungsschlüsseln
Django Foreign Key on_delete Argument
Django
Schreiben Sie externe Schlüsseleinschränkungen in Django
Memo zur Informationsaufzeichnung mit Sitzung in Django
Djangos External Key Tutorial in 10 Minuten