Estoy tratando de ayudar a anonimizar a los usuarios pero aún les doy algunos controles. Por lo tanto, esto es diferente a decir, anonimizar un conjunto de datos donde nunca tendrá que volver a los usuarios originales.
Déjame darte un ejemplo. Quiero que un usuario ingrese su dirección de correo electrónico para iniciar sesión en mi sistema, pero no quiero almacenar la dirección de correo electrónico. Quiero asignar a ese usuario un UUID que luego usaré. Sin embargo, si el usuario pierde el identificador aleatorio, debe poder volver a ingresar su dirección de correo electrónico y luego volver al sistema.
La respuesta más simple a esto es un hash. Por supuesto que podría almacenar el hash junto al UUID. Si pierden el UUID, pueden volver y puedo volver a aplicar la contraseña. Por otro lado, si mi sistema se divide, los malos pueden simplemente realizar un ataque de diccionario en una lista de direcciones de correo electrónico y luego volver a identificar los UUID.
En primer lugar, ¿hay una forma estándar de hacer esto? bcrypt y PBKDF2 me vienen a la mente, pero obviamente no puedo almacenar una tupla de <email, salt, iterations>
sin hacer que el trabajo de los intrusos sea aún más fácil.
No me gusta inventar nuevas cosas de seguridad, pero he tenido una idea. Básicamente, almaceno <SHA512(email), salt, iterations>
y luego almaceno <PBKDF2(email, salt, iterations), UUID>
.
De esa forma tienen que atacar primero el diccionario de la primera tabla, y luego usar los resultados de eso para realizar ataques individuales del diccionario en cada fila de la segunda tabla, lo que debería ralentizar las cosas.