Si bien otros han señalado que hay pocas ventajas (si es que las hay), no me importaría su afirmación de que no existen inconvenientes. Si almacena solo el nombre de usuario con hash, entonces buscar el nombre de usuario es fácil. Si almacena un nombre de usuario hasted y hash, la búsqueda se vuelve un poco más problemática.
Supongamos que si construimos una tabla SQL que contiene nombres de usuario y contraseñas (con hash) e indiquemos al servidor SQL que indexe la columna de nombre de usuario, hará algún tipo de búsqueda binaria o algún otro tipo de magia. Podríamos tener una tabla que se parece a:
Username | Password
test | j9lnvqjAuhNJs
(Este es el hash crypt (3) de la vieja escuela Unix solo por simplicidad y brevedad.)
Si almacena sus nombres de usuario en texto sin formato, la recuperación de la contraseña (hash) para un usuario es una simple llamada a SQL. Supongamos que desea validar las credenciales de un usuario que escribió el nombre de usuario test
:
SELECT password FROM users WHERE username='test';
Suficientemente simple. Ahora, si almacenáramos los nombres de usuario en el mismo formato que las contraseñas, nuestra tabla terminará con este aspecto:
Username | Password
M1CAtvzDdJDGU | j9lnvqjAuhNJs
Ahora, cuando un usuario escribe su nombre de usuario de test
, ¿cómo valida la contraseña? Una búsqueda binaria es inútil aquí, ya que ni siquiera sabe la sal que utilizó para almacenar el nombre de usuario. En su lugar, debe recorrer cada nombre de usuario en la base de datos, crypt
ing el nombre de usuario dado con el salt para ese nombre de usuario y compararlo con el nombre de usuario almacenado (con hash) para ver si coincide. ¡Yuch!
¿Supongamos que tomó algunas buenas precauciones y usó un hash lento agradable como bcrypt
en lugar de la vieja cripta Unix? Doble yuch!
Como puede imaginar, hay algunos inconvenientes serios al almacenar un nombre de usuario hash con sal en lugar de solo texto sin formato.