2009-07-27 20 views
38

Supongamos que tiene la libertad de decidir cómo se almacenarán las contraseñas hash en un DBMS. ¿Hay debilidades obvias en un esquema como este?Hashing de contraseñas, sal y almacenamiento de valores hash

para crear el valor hash almacenado en el DBMS, tomar:

  • Un valor que es único para la instancia del servidor DBMS como parte de la sal,
  • Y el nombre de usuario como una segunda parte de la sal,
  • y crear la concatenación de la sal con la contraseña real,
  • y croquetas de toda la cadena usando el algoritmo SHA-256,
  • y almacenar el resultado en el DBMS.

Esto significaría que cualquiera que quiera llegar a una colisión debería realizar el trabajo por separado para cada nombre de usuario y cada instancia del servidor DBMS por separado. Planearía mantener el mecanismo hash actual algo flexible para permitir el uso del nuevo algoritmo hash estándar NIST (SHA-3) que aún se está trabajando.

El 'valor que es exclusivo de la instancia del servidor DBMS' no tiene por qué ser secreto, aunque no se divulgará por casualidad. La intención es garantizar que si alguien usa la misma contraseña en diferentes instancias del servidor DBMS, los valores hash grabados serían diferentes. Del mismo modo, el nombre de usuario no sería secreto, solo la contraseña propiamente dicha.

¿Sería una ventaja tener primero la contraseña y el nombre de usuario y el 'valor único' en segundo lugar, o cualquier otra permutación de las tres fuentes de datos? ¿O qué tal entrelazar las cuerdas?

¿Debo agregar (y registrar) un valor de sal al azar (por contraseña), así como la información anterior? (Ventaja: el usuario puede reutilizar una contraseña y aún así, probablemente, obtenga un hash diferente registrado en la base de datos. Desventaja: la sal debe registrarse. Sospecho que la ventaja supera considerablemente la desventaja.)

un buen montón de preguntas relacionadas con SO - esta lista es poco probable que sea integral:

creo que las respuestas a estas preguntas apoyan mi algoritmo (aunque si usted sólo tiene que utilizar una sal de azar, entonces el "valor único para cada servidor y los componentes de nombre de usuario son menos importantes).

+1

La parte aleatoria es importante, previene los ataques de predicción – Jacco

+0

se puede agregar http: // stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/1645190 # 1645190 a la lista de artículos – Jacco

+0

También agregue http://dba.stackexchange.com/questions/7492/password-hashes-fixed-length- binary-fields-or-single-string-field como una buena pista para acceder al sitio [dba.se] – jcolebrand

Respuesta

31

La sal solo tiene que ser aleatoria y única. Se puede conocer libremente ya que no ayuda a un atacante. Muchos sistemas almacenarán la sal de texto sin formato en la base de datos en la columna junto a la contraseña hash.

La sal ayuda a garantizar que si dos personas (usuario A y usuario B) comparten la misma contraseña no es obvio. Sin la sal aleatoria y única para cada contraseña, los valores de hash serían los mismos y, obviamente, si la contraseña para el usuario A se descifra, entonces el usuario B debe tener la misma contraseña.

También ayuda a proteger contra ataques donde un diccionario de valores hash se puede comparar con contraseñas conocidas. p.ej. mesas de arcoiris.

También el uso de un algoritmo con un "factor de trabajo" incorporado también significa que a medida que la potencia de cálculo aumenta el trabajo que un algoritmo tiene que pasar para crear el hash también se puede aumentar. Por ejemplo, bcrypt. Esto significa que la economía de los ataques de fuerza bruta se vuelve insostenible. Presumiblemente, se vuelve mucho más difícil crear tablas de hashes conocidos porque tardan más en crearse; las variaciones en "factor de trabajo" significarán que se deben construir más tablas.

+5

La salazón también nos protege de un ataque basado en la tabla del arco iris –

+0

Sí; como he notado en los comentarios a otras respuestas, mi pregunta se transformó cuando la escribí, y me di cuenta de que la sal aleatoria era necesaria, pero no me tomé el tiempo para pensar que también era suficiente. Agregar el nombre de usuario a la mezcla alarga principalmente los datos sobre los que debe trabajar el algoritmo hash, lo que ayuda a proteger contraseñas cortas. Cuan real es esa protección adicional, no estoy seguro. –

+10

Esta respuesta es incorrecta. El propósito de sales es * not * así que "las contraseñas compartidas no son obvias". El objetivo es hacer que los ataques de diccionario sean mucho más difíciles. (Permitir que respuestas peligrosamente incorrectas como esta se marquen como una "respuesta" es un defecto de diseño fatal de este sitio.) –

6

¿Por qué no agregar una sal al azar a la contraseña y hash esa combinación? Luego concatene el hash y la sal a un solo byte [] y almacénelo en el db?

La ventaja de una sal al azar es que el usuario puede cambiar su nombre de usuario.The Salt no tiene que ser secreto, ya que se usa para evitar ataques de diccionario.

+2

+1 por mencionar que un usuario ya no puede cambiar su nombre de usuario. –

+0

@pb: en este contexto, no quiero que los usuarios cambien su nombre, gracias. En algunos contextos, eso puede ser valioso, pero en lo que respecta a esta aplicación, el nombre de un usuario es fijo (o, más exactamente, si alguien cambia su nombre, se convierte en un usuario nuevo y diferente). Solo usar sal aleatoria y contraseña probablemente sea correcto; Estoy un poco preocupado por asegurarme de que haya suficiente material para que el algoritmo hash tenga sus dientes: esa es otra parte de la razón para agregar más que solo sal. Mientras escribía la pregunta, me di cuenta de que la sal aleatoria era necesaria; No me di cuenta de que era suficiente también. –

+0

el usuario todavía podría cambiar su nombre de usuario, pero tendría que volver a configurar su contraseña en ese momento. Por otro lado, usar una sal aleatoria tiene los mismos o mayores beneficios que usar una sal no aleatoria. – wprl

19

Creo que está complicando demasiado el problema.

de inicio con el problema:

  1. ¿Estás tratando de proteger las contraseñas débiles?
  2. ¿Estás tratando de mitigar los ataques del arco iris?

El mecanismo que propone protege contra un simple ataque de arco iris, porque incluso si el usuario A y el usuario B tienen la MISMA contraseña, la contraseña de hash será diferente. Sí, parece un método bastante elaborado para salar una contraseña que es demasiado complicada.

  • ¿Qué sucede cuando migra la base de datos a otro servidor?
    • Puede cambiar el valor único, por valor de base, si es así, se puede generar una tabla global de arcoíris, si no, no puede restaurar su base de datos.

En vez me acaba de añadir la columna extra y almacenar una sal adecuada al azar. Esto protegería contra cualquier tipo de ataque del arco iris. En múltiples implementaciones.

Sin embargo, no lo protegerá contra un ataque de fuerza bruta. Por lo tanto, si intenta proteger a los usuarios que tienen contraseñas molestas, deberá buscar en otra parte. Por ejemplo, si sus usuarios tienen contraseñas de 4 letras, probablemente podría descifrarse en segundos incluso con un salt y el algoritmo hash más nuevo.

+0

Buena respuesta.¡Vota y participa en 10K! –

+0

: p gracias! –

+1

Creo que puede que tengas razón, cuando escribí la pregunta, me di cuenta de que la sal aleatoria era necesaria; No me tomé el tiempo para señalar que era suficiente, también. Habiendo dicho eso, una preocupación es darle al algoritmo hash más datos para trabajar, y el nombre de usuario ayuda un poco, al igual que la sal. La recuperación a otra instancia del servidor DBMS es una preocupación válida, una que no había pensado. El nombre de usuario y la sal estarían bien debajo de eso, y el nombre de usuario no es 100% necesario. Gracias. –

7

Creo que debes preguntarte "¿Qué esperas ganar haciendo esto más complicado que simplemente generar un valor aleatorio de sal y almacenarlo?" Cuanto más complicado sea el algoritmo, más probable es que introduzca una debilidad inadvertidamente. Esto probablemente suene sarcástico, no importa cómo lo diga, pero tiene un significado útil: ¿qué tiene de especial la aplicación que necesita un nuevo y sofisticado algoritmo hash de contraseñas?

+0

@Peter: sin ofender, comprendo lo que dices. Un aspecto de "lo que es diferente" mientras escribía fue "asegurarse de que diferentes servidores con la misma contraseña almacenen claves diferentes". Como se señaló en otros comentarios, cerca del final de la pregunta me di cuenta de que la sal aleatoria era necesaria; No vi que era suficiente. Y los datos adicionales en el hash ayudan a proteger contraseñas cortas y malas. Lo que no puedo evaluar es cuánta diferencia hace eso. –

+0

Continuación: Si la sal es un entero de 8 bytes y la contraseña es una sola, ¿un hash SHA-256 realmente lo protege? Si el nombre de usuario tiene 3 caracteres y los datos del "servidor único" son, por ejemplo, una cadena de 32 caracteres determinada aleatoriamente (pero fija), ¿eso ayuda a proteger los datos ?: 44 bytes de datos para trabajar en lugar de solo 9. Parece como debería ser más seguro (9 bytes podrían ser atacados con arcoiris, y 44 bytes probablemente no podrían ser atacados tan fácilmente). Tal vez el 'servidor único' solo necesite ser una 'cadena fija de 32 bytes'; ... –

+0

Continuando (2): ... o tal vez necesita agregar 'sal más contraseña' a 64 bytes (o 32 bytes, o algún otro número) con una cadena fija? O tal vez esto es todo una gran persecución; realmente no importa –

Cuestiones relacionadas