Digamos que tengo una llamada a la API que se supone que comprueba si existe una dirección de correo electrónico en la base de datos, sin transmitir la dirección de correo electrónico real. Para ese propósito, decidí almacenar el hash SHA256 de la dirección de correo electrónico en la base de datos, y actualicé al cliente para enviar el hash SHA256 del correo electrónico en la llamada a la API (en lugar de la dirección de correo electrónico de texto simple).
¿Cómo puedo hacer que esto sea más seguro utilizando sal al calcular el hash?
Según mi entendimiento, tener una sal fija es casi lo mismo que no tener sal en absoluto. ¿Hay alguna forma en que pueda tener sal única por dirección de correo electrónico, pero de tal manera que tanto el servidor como el cliente puedan calcularlas?
¿Tendría sentido algo como esto? Si no, ¿puede explicar por qué?
salt = sha256(email)
email_hash = salt + "|" + sha256(email + salt)
Considere la siguiente cita:
El valor de sal no es secreto y puede generarse al azar y almacenarse con la contraseña hash. Un gran valor de sal evita la precomputación ataques, incluidas las tablas de arco iris, asegurando que cada usuario La contraseña está hash únicamente. Esto significa que dos usuarios con la misma La contraseña tendrá diferentes hashes de contraseña (asumiendo diferentes sales son usados). Para tener éxito, un atacante necesita calcular previamente las tablas. para cada valor de sal posible. La sal debe ser lo suficientemente grande, de lo contrario un atacante puede hacer una tabla para cada valor de sal.
No estoy seguro de si me estoy perdiendo algo o no, pero esto significa que incluso si la sal no es un secreto ni es aleatoria, y todos saben cómo calcular la sal para una dirección de correo electrónico, todavía evitaría que el atacante no puede recuperar direcciones de correo electrónico de hashes utilizando tablas de arco iris. Debido a que cada correo electrónico sería hash único. ¿Es eso correcto?