No dejes de divulgar nuestros tutoriales y códigos con tus amigos, apóyanos para aumentar esta comunidad.
Solución:
Para la mayoría de los propósitos prácticos, esto da muy buen nonce:
import uuid
uuid.uuid4().hex
# 'b46290528cd949498ce4cc86ca854173'
uuid4()
usos os.urandom()
cuál es el mejor aleatorio que puedes obtener en python.
Nonce debería ser usado solo una vez y difícil de predecir. Tenga en cuenta que uuid4()
es más difícil de predecir que uuid1()
mientras que más tarde es más globalmente único. Para que puedas lograr aún más fuerza combinándolos:
uuid.uuid4().hex + uuid.uuid1().hex
# 'a6d68f4d81ec440fb3d5ef6416079305f7a44a0c9e9011e684e2c42c0319303d'
Así es como lo hace python-oauth2:
def generate_nonce(length=8):
"""Generate pseudorandom number."""
return ''.join([str(random.randint(0, 9)) for i in range(length)])
También tienen:
@classmethod
def make_nonce(cls):
"""Generate pseudorandom number."""
return str(random.randint(0, 100000000))
Además, existe este problema titulado: “make_nonce no es lo suficientemente aleatorio”, que propone:
def gen_nonce(length):
""" Generates a random string of bytes, base64 encoded """
if length < 1:
return ''
string=base64.b64encode(os.urandom(length),altchars=b'-_')
b64len=4*floor(length,3)
if length%3 == 1:
b64len+=2
elif length%3 == 2:
b64len+=3
return string[0:b64len].decode()
Y también referencias CVE-2013-4347. TL;DR versión, uso os.urandom
o la interfaz abstraída (SystemRandom).
me gusta mi lambda
s, y no quería caracteres no alfanuméricos, así que usé esto:
lambda length: filter(lambda s: s.isalpha(), b64encode(urandom(length * 2)))[:length]
Si bien esto probablemente no existe en el momento de la creación de esta pregunta, Python 3.6 introdujo el módulo de secretos que está destinado para generar números aleatorios criptográficamente fuertes adecuados para administrar datos como contraseñas, autenticación de cuentas, tokens de seguridad y secretos relacionados.
En este caso, generar un nonce se puede generar fácilmente (aquí un codificado en base64 string):
nonce = secrets.token_urlsafe()
Las alternativas son token_bytes para obtener un token binario o token_hex para obtener un hexadecimal string.
Comentarios y valoraciones del post
Si sostienes algún titubeo y disposición de innovar nuestro enunciado eres capaz de ejecutar una ilustración y con placer lo analizaremos.