[PYTHON] Génération de clé de session Django 1.4.2

Je me suis demandé pourquoi django essayait de créer une clé unique, alors je l'ai recherchée avec mon voisin.

Comment créer une communication session ID-Skotoprigonievsk

Je n'ai trouvé aucun code qui prenait à portée de main le pid du système d'exploitation de la version 1.4.2.

Il existe une méthode _get_new_session_key () dans django.contrib.sessions.base.SessionBase, mais dans celle-ci, get_random_string () dans django.utils.crypto est utilisé et c'est probablement la fonction qui génère la clé.

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

Lorsque useng_sysramdom vaut False Random.getstate (), time.time () et settings.SECRET_KEY sont multipliés par SHA256 en tant que valeur de départ.

L'indicateur using_sysramdom est défini dans crypto.py pour déterminer si random.SysRandom est disponible. C'est le même que le contenu du blog ci-dessus.

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

C'est une valeur aléatoire à la fin, donc je me demande toujours si c'est une clé unique, mais je me demande si c'est comme ça.

À propos, lorsque j'ai essayé de créer une valeur unique dans le passé, [Catalyst :: Plugin :: Session](http://cpansearch.perl.org/src/BOBTFISH/Catalyst-Plugin-Session-0.37/lib/Catalyst/Plugin /Session.pm) J'ai emprunté (perl).

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;
}

Je n'ai pas appliqué le ramdom à la fin, donc je pense que celui-ci est plus unique, mais je ne sais pas.

Recommended Posts

Génération de clé de session Django 1.4.2
Argument Django Foreign Key on_delete
Django
Ecrire des contraintes de clé externe dans Django
Mémo d'enregistrement d'informations en utilisant la session dans Django
Tutoriel de clé externe de Django en 10 minutes