Grandes respuestas hasta ahora, pero algo que creo que también debería mencionarse porque no está muy claro en el artículo al que hace referencia. La función de hashing se ejecuta contra el salt concatenado junto con la contraseña y luego el salt se concatena nuevamente con el hash resultante de la función y esa cadena es lo que se almacena en la base de datos de contraseñas como / etc / shadow.
Un ejemplo real
Este ejemplo muestra lo que sucede cuando un usuario elige su contraseña en un sistema Unix, cómo se almacena en / etc / shadow y luego cómo se verifica la contraseña cuando el usuario inicia sesión. Voy a utilizar ejemplos reales en su lugar. de nombres de variables o cadenas como foobar. También voy a ignorar cosas como pam para hacer esto un poco más simple.
- El usuario 'monroe' ejecuta el programa de contraseña y elige la contraseña 'HorseStapler + 5'
- El programa passwd recibe la contraseña, la comprueba (para ver las reglas de validez), luego determina qué algoritmo necesita usar para el hashing (DES, MD5, SHA-256, SHA-512). Digamos que el sistema elige SHA- 512 por su algoritmo de hash.
- El algoritmo SHA-512 utiliza una cadena aleatoria de 16 caracteres por su sal formada por caracteres alfanuméricos + '.' y '/'. El sistema genera una cadena de sal aleatoria 'BohpaS.aul0Qua / t'.
- El sistema ahora concatena el salt en la contraseña como esta 'HorseStapler + 5BohpaS.aul0Qua / t'. Este es el "nuevo" texto plano que realmente será grabado y almacenado. Lo hace más único para que cualquier otra persona que use la contraseña 'HorseStapler + 5' debido a su popularidad no dé como resultado el mismo hashtext en la base de datos de contraseñas. También protege contra ataques de la mesa del arco iris.
- El sistema ejecuta el algoritmo hash en la nueva cadena SHA512 ('HorseStapler + 5BohpaS.aul0Qua / t') y obtiene la salida de hashtext '
- Para que el sistema pueda autenticar al usuario en el futuro, almacena la sal y también un indicador para el tipo de hashing utilizado en el archivo / etc / shadow como la siguiente cadena en el segundo campo (campo cifrado) para eso entrada de usuario como esta '$ 6 $ BohpaS.aul0Qua / t $ IVUen1dSKZ634jM.KLQ1Am / WPh..DSO2MYI53qffac2IFzESKwIufyVjzQGlxNenOXGehMTCdSoL9DLPe6Zff1'
La entrada completa en / etc / shadow se ve así:
monroe:$6$BohpaS.aul0Qua/t$IVUen1dSKZ634jM.KLQ1Am/WPh..DSO2MYI53qffac2IFzESKwIufyVjzQGlxNenOXGehMTCdSoL9DLPe6Zfm1:15196:0:99999:7:::
La parte de $ 6 $ indica que fue SHA-512 hash. La parte intermedia entre el segundo y el tercer carácter '$' almacena la sal que se utilizó. Este campo en el archivo de la sombra se llama el campo cifrado. A algunas personas no les gusta ese nombre porque está encriptado, no encriptado. Cifrado implica que se puede descifrar, lo que no se puede descifrar. Sin embargo, me referiré a él como el campo de contraseña cifrada.
Re-autenticación
- La próxima vez que Monroe inicie sesión en el sistema, envía la contraseña 'HorseStapler + 5'.
- El sistema busca al usuario en / etc / shadow y encuentra la cadena completa arriba. El sistema toma la parte de sal (la parte intermedia entre la 2ª y la 3ª '$') y luego la concatena con la contraseña como arriba. Luego, indica que el uso del algoritmo SHA-512 está indicado por el designador de algoritmo '6' entre la primera y la segunda '$'.
- El sistema luego compara el hashtext resultante con la cadena después de la tercera '$' en el campo de contraseña cifrada del archivo shadow.
Esperemos que esto demuestre por qué el algoritmo de hash solo necesita ser un algoritmo de una manera y cómo se usa exactamente la sal.
El motivo del archivo shadow es que el archivo / etc / password necesita ser legible en todo el mundo en un sistema Unix. Solían almacenar la contraseña cifrada (y hace mucho tiempo incluso la contraseña de texto claro) en el segundo campo del archivo / etc / password. Lo movieron al archivo de la sombra y solo le dieron acceso de root a ese archivo y el mecanismo de autenticación necesita privilegios de root para autenticarse.
Bueno, eso terminó siendo mucho más largo de lo que pensé.