¿Requisitos para una ID de sesión segura?

4

Estoy escribiendo un servicio web que almacena datos que se compartirán entre dos sistemas separados.

/session/requestNewSession?args=<data> = > devuelve el ID de sesión

/session/requestArgs?session=<session id> = > devuelve <data> almacenado con la clave <session id>

El código se implementa en python en la biblioteca de matriz torcida, y he escrito mi propio generador de ID de sesión:

private_secret = os.urandom(64)
def generateRandomSessionKey():
 rawdata = private_secret + str(time.time()) + string.join(map(chr, [random.randint(0,255) for x in range(100)]),"")
 session_key = hashlib.sha256(rawdata).hexdigest()
 del(rawdata)
 return session_key

¿Es esta una forma adecuada de generar un ID de sesión seguro (no presumible)? Si no, ¿alguna idea sobre lo que debería hacer de manera diferente?

    
pregunta Dog eat cat world 29.04.2012 - 16:05
fuente

1 respuesta

5

Respuesta. Sí. Esta es una buena manera de generar una ID de sesión.

Justificación. El private_secret será indiscutible y criptográficamente sólido (que está garantizado por urandom() ). Entonces, todo lo que necesita es que la combinación de time.time() y sus números de random.randint() sean únicos: esa combinación nunca debe repetirse. Eso debería estar bastante garantizado. El generador de números aleatorios de Python no debería repetirse durante mucho tiempo, por lo que debería estar bien.

Para más información, consulte ¿Es seguro un rand de / dev / urandom para una clave de inicio de sesión? para obtener información relacionada pregunta.

Advertencia. El único factor de riesgo que puedo ver es si ejecuta el proceso del servidor en una máquina virtual, comenzando siempre desde el mismo punto de control. (En otras palabras, antes de la implementación, inicie el sistema operativo invitado en la máquina virtual una vez y realice el control en ese punto; luego, cada vez que inicia su servicio web, lo inicia desde ese punto de control). En esa situación, os.urandom() , time.time() y random.randint() podrían repetirse, lo que provocará que asigne el mismo ID de sesión a dos clientes diferentes. Pero mientras no utilices una máquina virtual de esa manera, deberías estar bien.

Una alternativa. Una forma más sencilla y una implementación tan segura sería utilizar lo siguiente:

def generateRandomSessionKey():
    return hexify(os.urandom(16))
    
respondido por el D.W. 30.04.2012 - 05:11
fuente

Lea otras preguntas en las etiquetas