node.js - node - SAL y HASH usando pbkdf2
node hash sha256 (2)
Fernando es mayormente correcto, pero tenga cuidado de que el # 3 sea de origen inadecuado. La longitud de sal recomendada es de 64 bits , no de bytes.
El uso de 64 bytes para la clave derivada es aceptable, pero sería excesivo solo para la sal.
Estoy usando los siguientes métodos para crear una contraseña con sal y hash desde la crypto lib en nodejs:
crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)
Para la llamada randomBytes (creando el SALT) ¿qué tamaño debo usar? He escuchado sales de 128 bits, tal vez hasta 256 bits. Parece que esta función usa un tamaño en bytes, así que ¿puedo asumir que un tamaño de 32 (256 bits) es suficiente?
Para la llamada pbkdf2, ¿cuál es un buen número de iteraciones y cuál es la longitud adecuada para la clave (keylen)?
Además, para el almacenamiento, he visto ejemplos de almacenamiento de la sal, longitud, iteraciones y derviedkey en la misma columna. Estoy usando un ejemplo que separa el 4 por ::
, es decir:
salt::derivedKey::keyLength::iterations
Al hacer esto, luego puedo separar en ::
para obtener los 4 valores, así que puedo generar una clave derivada basada en una contraseña proporcionada para ver si coincide. ¿Es esta la manera correcta de almacenar esto? ¿O debería ser un poco más "engañoso" al combinar estos valores?
1. Tamaño de bytes aleatorio :
Las sales deben tener al menos el mismo tamaño que la función hash, por lo que para sha256
debe usar al menos 32 bytes. El pbkdf2
Node.js Crypto usa SHA1
, por lo que 20 bytes deberían ser el mínimo. Sin embargo, lo menos que debe usar es de 64 bits (8 bytes) , como se explica en el # 3. (Fuente: https://crackstation.net/hashing-security.htm ).
2. Número de iteraciones PBKDF2 :
Vea esta pregunta para una gran discusión. Aproveché que el rango de 10.000 es suficiente sin impacto en el rendimiento, pero esto depende del hardware / rendimiento.
3. Longitud PBKDF2 :
Vea esta otra discusión sobre la longitud de las claves. El parámetro es nuevamente la función de hash utilizada, en su caso SHA-1, por lo que 20 bytes es el valor correcto. Dado que el Estándar de PBKDF2 recomienda sales de al menos 64 bits , es un desperdicio generar claves más pequeñas que su entrada, así que use al menos 8 bytes . No utilice una longitud de salida superior a 20, ya que no proporciona seguridad adicional, pero duplica el tiempo de cálculo para cada múltiplo de 20.
4. Cómo almacenar variables :
Discutidas en todos los enlaces anteriores (especialmente en https://crackstation.net/hashing-security.htm ), las sales deben guardarse a lo largo de las contraseñas (pero nunca deben reutilizarse en otro lugar), generalmente agregándolas primero en la cadena resultante (salt: hash), o en otra columna de la base de datos.
En cuanto a otras variables, su conocimiento no es crítico para violar la seguridad (como se indica en el Principio de Kerckhoffs , por lo que puede parametrizarlo de manera segura en cualquier lugar. Su forma de hacerlo al separarlos con "::" está bien, pero está ahorrando más información . https://crackstation.net/hashing-security.htm solo guardan "algorithm:iterations:salt:hash"
, por lo que en su caso, "salt::derivedKey::iterations"
es todo lo que necesita.