Quiero saber cuáles son los puntos a tener en cuenta al crear un token de hash para los enlaces de restablecimiento de contraseña.
En particular, ¿cómo hacerlo imprevisible para un atacante?
Quiero saber cuáles son los puntos a tener en cuenta al crear un token de hash para los enlaces de restablecimiento de contraseña.
En particular, ¿cómo hacerlo imprevisible para un atacante?
La mayoría de los generadores de números aleatorios solo generan números pseudoaleatorios. Crean una serie de números que parecen aleatorios a primera vista, pero los números siguen un algoritmo exacto. Para evitar que generen la misma serie de números cada vez que se usan, se inicializan sembrando con un valor de inicio. Un buen generador de números pseudoaleatorios debe generar una serie diferente de números para cada valor semilla posible.
En la práctica, un generador de números pseudoaleatorios a menudo se inicializa con la hora actual. Debido a que el tiempo será diferente cada vez que se ejecute un programa, nunca generará la misma secuencia de números. Desafortunadamente, esto no es suficiente para ningún propósito de seguridad, porque el momento de la inicialización es muy predecible. Por esa razón, necesita combinar valores de otras fuentes de entropía que son difíciles o imposibles de predecir para un atacante externo.
Las fuentes de entropía que son viables dependen de su entorno.
Use un generador de números aleatorios criptográficamente seguro para generar una secuencia aleatoria. Hay muchos disponibles, construidos en diferentes plataformas. Muchos marcos e idiomas proporcionan envoltorios para acceder a estos, como la función openssl_random_pseudo_bytes en PHP .
Podrías generar tu propio. El artículo anterior sugiere:
Un hash criptográficamente seguro de un contador también puede actuar como un buen CSPRNG en algunos casos. En este caso, también es necesario que el valor inicial de este contador sea aleatorio y secreto. Sin embargo, ha habido poco estudio de estos algoritmos para su uso de esta manera, y al menos algunos autores advierten sobre este uso.
Sin embargo, debe agregar algo impredecible . Es decir, configura el contador como un número generado impredecible y simplemente incrementalo cada vez. Necesitaría una entropía adecuada tanto para su valor de contador como para su hash de salida (128 bits).
De todos modos, ya que necesita una fuente impredecible para esto, y hay una advertencia en contra de este uso, me gustaría ir con la primera opción de simplemente generar una secuencia criptográficamente segura utilizando funciones de lenguaje integradas.
Lea otras preguntas en las etiquetas password-management password-policy hash