Entendiendo el hashing de contraseña con sal usando Java

2

Contexto:

Estoy usando este tutorial y trato de entender e implementar el hashing de contraseñas con sal utilizando Java. Después de dedicar algo de tiempo a este tema, descubrí que la idea básica es:

  1. Convierta la cadena de contraseña en una matriz de caracteres.
  2. Genere una sal aleatoria usando SecureRandom (o similar).
  3. Hash la matriz de caracteres de la contraseña con una función de hash criptográfica estándar.
  4. Convierta las matrices de bytes de sal y hash a cadenas hexadecimales respectivas.
  5. Ponga el hexedSalt en hexedHash y guarde la cadena resultante junto con el hexedSalt en la base de datos.

Preguntas:

  • ¿Qué sentido tiene anteponer la constante PBKDF2_ITERATIONS a createHash(char[] password) ?
  • ¿Mi entendimiento de todo el proceso es correcto?
  • Aquí está el enlace a mi código fuente : qué valor debo guardar como hash y qué valor como ¿sal?
pregunta Sandeep Chatterjee 11.06.2015 - 22:18
fuente

2 respuestas

4

PBKDF2 es una función de hashing de contraseña (*); utiliza un número configurable de iteraciones (para hacerlo tan lento como sea apropiado) y una sal (para disuadir todo tipo de paralelismo en los ataques). Para verificar una contraseña, el hash se vuelve a calcular y debe producir el mismo valor. Para realizar este nuevo cálculo, debe utilizar el mismo número de iteraciones y el mismo valor de sal; de lo contrario, obtendrás una salida distinta y no serás más sabio.

Se generará un nuevo salt para cada nueva contraseña registrada (por ejemplo, cada vez que se crea una nueva cuenta de usuario y también cuando un usuario cambia su contraseña), por lo que debe almacenarse junto con el valor de hash.

El recuento de iteraciones también debe almacenarse, ya que puede modificarse en algún momento. En el código al que se vincula, el recuento es una constante ( static final ), pero su función conceptual es contrarrestar el aumento del rendimiento de las computadoras a lo largo del tiempo: se utiliza el número de iteraciones para hacer que cada una El hash de contraseñas es tan lento como puede tolerar, porque también lo hará lento para el atacante. Cuando compra un servidor nuevo y más rápido, es posible que desee aumentar el recuento de iteraciones (es decir, modificar el código fuente y volver a compilar la aplicación, con un recuento más alto). Sin embargo, en ese caso, no desea invalidar las contraseñas de hash almacenadas existentes. Por lo tanto, debe saber, para cada hash almacenado, cuántas iteraciones se usaron para ese hash específico. Esta es la razón por la que el recuento de iteraciones se almacena junto con la sal y el valor de hash en sí.

(*) Estrictamente hablando, una función de derivación de clave basada en contraseña, pero seamos sencillos.

    
respondido por el Thomas Pornin 11.06.2015 - 22:50
fuente
2

El hash de contraseña básico con sales solo implica la contraseña y un salt aleatorio que se unen antes de crear el hash. No menciona ese proceso de unión en su explicación y es importante porque, de lo contrario, Salt no agrega ninguna seguridad.

El ejemplo al que se ha vinculado está utilizando un tipo de hashing de contraseña más avanzado utilizando PBKDF2 que también tiene un recuento de iteraciones (número de veces para repetir el proceso de hashing). Eso se refleja en su código con

byte[] hash = pbkdf2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);

Por lo tanto, tienen que almacenar el hash de recuento de iteración, sal y contraseña final para utilizarlo cuando se vuelva a calcular un hash para fines de comparación de contraseña. Si va a implementar este ejemplo, deberá almacenar estos mismos datos.

    
respondido por el PwdRsch 11.06.2015 - 22:49
fuente

Lea otras preguntas en las etiquetas