¿El hash de ID de usuario?
Pase el nombre de usuario a través de uuid (RFC 4122) para obtener un nombre de usuario con hash (esto se debe principalmente a generar una cadena de longitud fija para que el DB pueda indexarlo ordenadamente)
Seleccione uuid de la base de datos para obtener la ID.
Esto no tiene sentido: las bases de datos pueden indexar cadenas de longitud variable sin problemas. De hecho, lo harán mejor que un UUID ya que la mayoría de los nombres de usuario tienen menos de 32 caracteres, por lo que solo tienes:
- Haciendo su programa más complicado
- Ampliar sus índices
Sal
Salt = md5 (nombre de usuario hash + ID db + contraseña)
¿Por qué? Se supone que la sal es un valor único, por lo que este exceso excesivo y discutible es menos útil que una sal completamente aleatoria. Solo toma algunos datos aleatorios de algún lugar ( /dev/random
o lo que sea que tenga Windows) y guárdalos en la base de datos. De todos modos, está buscando la contraseña, por lo que tomar la sal también no lo ralentizará en absoluto.
El hecho de que estés aprovechando estos valores sugiere que realmente no entiendes lo que está sucediendo.
- Si este valor se almacenó en cualquier lugar, el esquema de hashing de la contraseña se rompe (porque
md5(user+id+password)
es mucho más fácil de utilizar en la fuerza bruta que PBKDF2-sha512(password, salt, rounds)
. Probablemente sepa que es mejor almacenarlo, pero alguien más podrá acceder más tarde y "optimizar" "it ..
- Si no se almacena en ningún lado, no tiene sentido trocearlo. Solo use
user+id+password
como la sal directamente.
Rondas dinámicas
Donde las rondas = 2 ^ ((días entre ahora - 1 de enero de 2008)) / 365) * factor (50000 quizás).
Entonces, ¿qué pasa cuando lo miras mañana? De repente, el número de rondas es diferente y sus contraseñas no coinciden. Tendrá que almacenar esto en algún lugar, y la base de datos es el lugar más fácil. Además, si su hardware puede admitir un mayor número de rondas, ¿por qué no comenzar con el número más alto que pueda encontrar?
Si desea obtener un nuevo hash cada vez que alguien inicie sesión, simplemente genere un nuevo salt cada vez.
Conclusión
Puede obtener todo lo que desea, sin ninguna de las vulnerabilidades de seguridad, simplemente haciendo las cosas de manera estándar (bcrypt o PBKDF2, con sales aleatorias, y rounds
establece el valor más alto que puede manejar).