tipos password funciones encriptacion contraseñas contraseña con codigo and security encryption hash salt

security - password - hash en php



Hashing de contraseñas, sal y almacenamiento de valores hash (4)

Supongamos que tiene libertad para decidir cómo se guardarán las contraseñas hash en un DBMS. ¿Hay debilidades obvias en un esquema como este?

Para crear el valor hash almacenado en el DBMS, tome:

  • Un valor que es exclusivo de la instancia del servidor DBMS como parte de la sal,
  • Y el nombre de usuario como una segunda parte de la sal,
  • Y crea la concatenación de la sal con la contraseña real,
  • Y hash toda la cadena usando el algoritmo SHA-256,
  • Y almacene 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 real algo flexible para permitir el uso del nuevo algoritmo hash estándar ( SHA-3 ) de NIST que todavía se está trabajando.

El ''valor que es exclusivo de la instancia del servidor DBMS'' no necesita ser secreto, aunque no se divulgará casualmente. 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.

¿Habría alguna ventaja en tener la contraseña primero 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 aleatorio (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 ser registrada. Sospecho que la ventaja supera con creces la desventaja).

Hay bastantes preguntas SO relacionadas: es poco probable que esta lista sea exhaustiva:

Creo que las respuestas a estas preguntas son compatibles con mi algoritmo (aunque si simplemente utilizas una sal al azar, entonces el ''valor único por servidor'' y los componentes de nombre de usuario son menos importantes).


Creo que debes preguntarte "¿Qué esperas ganar al hacer esto más complicado que solo 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?


Creo que estás complicando demasiado el problema.

Comience 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 lo protege contra un simple ataque de arcoíris, ya que 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 migras el DB a otro servidor?
    • ¿Puede cambiar el valor único, por valor de base, de ser así, se puede generar una tabla global de arcoíris, de lo contrario no podrá restaurar su base de datos.

En su lugar, solo agregaría la columna adicional y almacenaría una sal aleatoria adecuada. Esto protegería contra cualquier tipo de ataque del arco iris. En múltiples implementaciones.

Sin embargo, no te 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.


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 de los ataques donde un diccionario de valores hash se puede comparar con contraseñas conocidas. por ejemplo, tablas de arco iris.

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 puede aumentarse. 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.


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 aleatoria 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.