2008-10-08 41 views
115

Cualquier salt obviamente ayudará al salazón y hashing la contraseña de un usuario. ¿Existen mejores prácticas sobre cuánto tiempo debe durar la sal? Guardaré la sal en mi tabla de usuarios, por lo que me gustaría obtener el mejor equilibrio entre el tamaño de almacenamiento y la seguridad. ¿Es una sal al azar de 10 caracteres suficiente? ¿O necesito algo más?¿Cuál es la duración óptima para la contraseña del usuario?

+1

O si existe una relación óptima para la longitud de sal a la longitud de salida de hash? La sal de 8 bytes puede ser suficiente para HMAC-SHA-256, pero puede que no para HMAC-SHA-512. –

+2

Para aquellos que no saben qué es la sal: Salt (cryptography) en la Wikipedia –

+6

No tengo una recomendación sobre la duración de la sal, pero las respuestas que se muestran aquí tienen mucha información incorrecta. Su sal definitivamente debe: - ser aleatorio - ser por secreto (ni un solo valor almacenado en la imagen de su programa o archivo de configuración). La sal no es un secreto criptográfico, por lo que guardarlo en tu mesa no es problema. El único propósito de una sal es garantizar que cuando diferentes instancias del mismo elemento son codificadas (o encriptadas) obtenga un resultado diferente. –

Respuesta

31

Actualmente accepted standards para contraseñas hash crea una nueva sal larga de 16 caracteres para cada contraseña y almacena la sal con el hash de la contraseña.

Por supuesto, debe tomarse el cuidado criptográfico adecuado para crear sal realmente aleatoria.

+5

* El carácter * está un poco mal definido. Deberías decir * byte *. – CodesInChaos

+7

@CodesInChaos Creo que te refieres a [* octet *] (http://en.wikipedia.org/wiki/Octet_ (informática)) ;-) – user2864740

+1

¡Hola! Parece que el artículo de wikipedia ha cambiado. ¿Tal vez deberías consultar http://en.wikipedia.org/wiki/PBKDF2 o algo así? –

21

Editar: Mi respuesta a continuación responde la pregunta tal como se solicitó, pero la respuesta "real" es: simplemente use bcrypt, scrypt o Argon2. Si estás haciendo preguntas como esta, casi seguro que estás usando herramientas a un nivel demasiado bajo.

Honestamente, no hay ninguna razón defendible para que la sal no tenga la misma longitud que la contraseña hash. Si está utilizando SHA-256, entonces tiene un hash de 256 bits. No hay razón para no usar una sal de 256 bits.

Más de 256 bits no generará ninguna mejora en la seguridad, matemáticamente. Pero ir con una sal más corta siempre puede terminar en una situación en la que una tabla de arcoíris alcanza la longitud de la sal, especialmente con sales más cortas.

+0

¿Qué quiere decir con 'Más de 256 bits no generará ninguna mejora en la seguridad'. Mi creencia era que la sal se defendía contra – mrmcgreg

+14

. Las sales se defienden contra las tablas arcoiris. Una sal de 512 bits con un hash de 256 bits solo dará como resultado 256 bits de entropía en la contraseña final. –

+1

@Stephen No me gusta. La entropía no es el problema aquí. Digamos que tenemos un hash de 3 bits, usted dice que tener sal de 3 bits en un hash de 3 bits es tan seguro como tener una sal de 9999 bits en un hash de 3 bits. Esto es incorrecto, un atacante puede simplemente tener un conjunto completo pregenerado de tablas de arcoíris para todas las combinaciones de su sal de 3 bits + hash de 3 bits, logrando O (1) el tiempo necesario para romper cada fila incluso cuando cada secreto tiene su propia sal .... – Pacerier

58

La mayoría de estas respuestas son un poco erróneas y demuestran una confusión entre sales y claves criptográficas. El propósito de incluir sales es modificar la función que se utiliza para cifrar la contraseña de cada usuario, de modo que cada hash de contraseña almacenada tenga que ser atacado individualmente. El único requisito de seguridad es que sean únicos por usuario, no hay ningún beneficio en que sean impredecibles o difíciles de adivinar.

Las sales solo necesitan ser lo suficientemente largas para que la sal de cada usuario sea única. Es muy poco probable que las sales aleatorias de 64 bits se repitan incluso con mil millones de usuarios registrados, por lo que debería estar bien. Una sal única repetida es una preocupación de seguridad relativamente menor, que permite a un atacante buscar dos cuentas a la vez, pero en conjunto no acelerará mucho la búsqueda en toda la base de datos. Incluso las sales de 32 bits son aceptables para la mayoría de los propósitos, en el peor de los casos acelerará la búsqueda de un atacante en aproximadamente un 58%. El costo de aumentar las sales más allá de 64 bits no es alto, pero no existe una razón de seguridad para hacerlo.

También existe la ventaja de utilizar una sal para todo el sitio encima de la sal por usuario, esto evitará posibles colisiones con hashes almacenados en otros sitios y evitará el uso de tablas rainbow de uso general, aunque incluso 32 bits de sal son suficientes para hacer que las tablas arco iris sean un ataque poco práctico.

Aún más simple, y los desarrolladores siempre pasan por alto esto, si tiene ID de usuario únicos o nombres de inicio de sesión, estos sirven perfectamente como una sal. Si hace esto, debe agregar una sal para todo el sitio para asegurarse de no superponerse con los usuarios de otro sistema que tengan la misma idea brillante.

+12

Existe la ventaja de que las sales son impredecibles. Una sal predecible podría predecirse y usarse en un ataque de tabla hash. Por ejemplo, si su sal es solo el ID de usuario, una tabla de hash alfa simple que sea lo suficientemente larga incluirá no solo todas las contraseñas, sino también todas las combinaciones de nombre de usuario y contraseña. –

+5

Nota en relación con su último párrafo, si utiliza una sal para todo el sitio, eso debería ser exactamente eso: en todo el sitio. No en toda la aplicación, es decir, cada instancia nueva que instale de su aplicación debería generar una nueva sal para todo el sitio. Por ejemplo, si Windows usó la misma sal en cada base de datos de autenticación de Windows, entonces valdría la pena crear una tabla de arcoíris para esa sal, pero si cada instalación de Windows generara una sal nueva, entonces no sería así. –

+4

El problema no es que la sal deba ser difícil de adivinar. El atacante no necesita adivinar la sal: cualquiera que tenga acceso al hash ya tiene la sal. El problema es que si sus sales son muy comunes (como los nombres de usuario), pueden ser las mismas que en otros sitios, y en ese punto el atacante necesita un conjunto mucho más pequeño de tablas de arcoiris para hacer que los ataques sean factibles. Esta es la razón por la cual se menciona la idea de sal por sitio, para evitar este tipo de colisión con otros sitios. –

7

Wikipedia:

El SHA2-cripta y Bcrypt métodos-usado en Linux, BSD Unix, y Solaris-tienen sales de 128 bits. Estos valores de sal más grandes hacen que los ataques de precomputación para casi cualquier longitud de contraseña imposible contra estos sistemas en el futuro previsible.

Sal de 128 bits (16 bytes) será suficiente.Puede representarlo como una secuencia de 128/4 = 32 dígitos hexadecimales.

+0

Me parece que un ejemplo de lo que usan otros sistemas seguros es un gran ejemplo de lo que son las mejores prácticas. – cjbarth

+1

@ mklement0 Gracias, he actualizado la respuesta. –

1

Una respuesta podría ser utilizar como tamaño de sal el valor que el hash que va a utilizar proporciona en términos de seguridad.

E.g. Si va a usar SHA-512 use sal de 256 bits ya que la seguridad provista por SHA-512 es de 256 bit.

Cuestiones relacionadas