Il seguente generatore di password è sicuro?

2

utilizzo il seguente generatore di password (python) e vorrei chiedere se le password generate (di solito 32 caratteri e più) sono abbastanza casuali.

def pwgen(l=32):
    from random import Random
    rng = Random()

    a = "qwertzuiopasdfghjklyxcvbnm"
    n = "1234567890"
    r = "23456qwertasdfgzxcvbQWERTASDFGZXCVOB"
    l = "78901yuiophjklnmYUIPHJKLNM"

    all = a + n + r  + l

    pwl = 32
    try:
        pwl = int(l)
    except:
        pass    
    if pwl < 8  or pwl > 128:
        pwl = 32

    pw = []
    for j in range(pwl):
        pw.append(rng.choice(all))

    return("".join(pw))

la password generata è simile alla seguente:

cwVPBgYt5seoO97sg8fszNptAhnb60Jg
W3mkuLMH0HCiJ8L040pmMys8yvhncwI8
kro01d2Z2ft51WG8lmy9d5el50aZ7CUg
10QfutP1fvKdR8oVhdTt0xR0r5k7w7Md
OxRjsqs2rCjyVbalvhuw3nrjTu9096XF
6jjvkIvyeoei3YIz84XAgdsDRjIGjyRu
2bjnHvubpv2z2DOF9fjFDfLtdnf4mL3T
UhbhNvwdSKOj14hmbca7t2UiwRaJNwrC
    
posta castorio 29.08.2013 - 22:34
fonte

2 risposte

16
a = "qwertzuiopasdfghjklyxcvbnm"
n = "1234567890"
r = "23456qwertasdfgzxcvbQWERTASDFGZXCVOB"
l = "78901yuiophjklnmYUIPHJKLNM"

all = a + n + r  + l

Perché è così complicato? Inserendo più caratteri in più volte, è più probabile che questi caratteri appaiano nelle password, il che indebolisce la password. Rendendo la tua stringa di password così complicata, rendi difficile determinare la sicurezza delle password.

Per avere una possibilità pari di qualsiasi personaggio, elencali tutti una volta sola. Inoltre, puoi semplificarlo notevolmente utilizzando il stringa modulo.

import string

all = string.ascii_letters + string.digits

Un altro problema è che la random documentazione del modulo dice che non dovrebbe essere usato per la crittografia:

Python uses the Mersenne Twister as the core generator. It produces 53-bit precision floats and has a period of 2**19937-1. The underlying implementation in C is both fast and threadsafe. The Mersenne Twister is one of the most extensively tested random number generators in existence. However, being completely deterministic, it is not suitable for all purposes, and is completely unsuitable for cryptographic purposes.

[...]

Warning: The pseudo-random generators of this module should not be used for security purposes. Use os.urandom() or SystemRandom if you require a cryptographically secure pseudo-random number generator.**

Quindi, utilizza random.SystemRandom() invece:

import random
import string

# Consider adding string.punctuation
possible_characters = string.ascii_letters + string.digits

def generate_password(length=32):
    rng = random.SystemRandom()
    return "".join([rng.choice(possible_characters) for i in range(length)])

Poiché sappiamo esattamente quanti possibili personaggi ci sono (62), e sappiamo che dovrebbero essere distribuiti casualmente, possiamo dire con una sicurezza abbastanza elevata che una password generata da questo schema richiederà in media (62 ^ 32) / 2 (circa 10 ^ 57) tenta di indovinare.

Detto questo, una password di 32 caratteri è probabilmente abbastanza sicura, anche se non è casuale in modo ottimale.

    
risposta data 29.08.2013 - 22:56
fonte
5

La classe Random di Python non è un generatore di numeri casuali crittograficamente sicuro, quindi è probabilmente troppo prevedibile per gli aggressori. Inoltre è seminato da un timestamp (credo in millisecondi), limitando strongmente il numero di potenziali flussi casuali e quindi il numero di password. Sarebbe molto facile forzare le password per ogni possibile millisecondo in cui l'algoritmo avrebbe potuto essere eseguito, specialmente quando l'attaccante può stimare in quale momento è successo.

Modifica: dopo aver dato un'occhiata più da vicino alla documentazione di Python , sembra che Python semina il generatore casuale con entropia da / dev / urandom (o un suo equivalente di Windows) piuttosto che il tempo di sistema, se disponibile. Quindi non è quasi insicuro come in precedenza avevo insinuato. Tuttavia, non si può ancora fare affidamento sul generatore di numeri casuali predefinito di Python per la generazione di password. Ti consigliamo di utilizzare os.urandom o random.SystemRandom invece, come indicato dal precedente poster.

    
risposta data 29.08.2013 - 23:01
fonte

Leggi altre domande sui tag