¿Qué tipo de hash usar para almacenar los tokens de la API REST en la base de datos?

6

Tenemos una API REST que se comunica con un front-end móvil. Después de enviar una contraseña de un solo uso, el backend emitirá un token (cadena UUID v4 aleatoria) para que la aplicación móvil la use como autenticación en las solicitudes posteriores. El servidor almacenará una versión con hash de este token en la base de datos con el usuario.

Queremos asegurarnos de que autenticar el token lleve el menor tiempo posible.

PREGUNTA
¿Qué tipo de hashing / encriptación es suficiente para almacenar los tokens en la base de datos? ¿Es un hash rápido como SHA256 lo suficientemente bueno, o deberíamos usar un hash lento como bcrypt? Si utilizamos SHA256, ¿debemos incluir un salt, ya que el token original no copiado es solo un UUID de 16 bytes al azar?

    
pregunta maniciam 14.02.2017 - 01:42
fuente

1 respuesta

7

TLDR; SHA256 es lo suficientemente bueno

Para responder a esto, debemos analizar por qué, en primer lugar, usamos, hacemos hash y usamos múltiples iteraciones del hash;

  • ¿Por qué nos saltamos? Para proteger a los usuarios que tienen una entropía de contraseña débil, no se lesionen las contraseñas (por ejemplo, tablas de arco iris o dos usuarios con la misma contraseña). Esto no es un problema porque UUID4 tendrá 122 bits de entropía 1 .

    Si quisiéramos crear una tabla de arco iris de todos los valores UUIDv4 con SHA256 hash y pudiéramos hacer 1 billón de hashes por segundo 2 . Tomaría 168.6 cuatrillones de años para hacer la mesa del arcoiris. Así que no tenemos que preocuparnos por eso.

  • ¿Por qué hacemos hash? Para evitar que se almacenen copias de texto claro de la contraseña. Esto parece una buena idea. No quieres que alguien que pueda leer tu base de datos 3 pueda hacerse pasar por usuarios.

  • ¿Por qué usamos múltiples iteraciones? para ralentizar los ataques de fuerza bruta. Como se mencionó anteriormente, UUID4 tendrá 122 bits de entropía. El agrietamiento de estos hashes no es factible incluso a alta velocidad.

[1] 128 bits - 6 bits que son predetermined

[2] Las tasas de hashing más rápidas actuales se están encadenando todo el tiempo, por lo que no me molestaré en tratar de encontrar la velocidad más actual que estará desactualizada en unos pocos meses.

[3] Esto podría ser Inyección SQL, o una copia filtrada de una copia de seguridad, información privilegiada o lo que sea.

    
respondido por el Hybrid 14.02.2017 - 03:54
fuente

Lea otras preguntas en las etiquetas