Escenario:
- El cliente envía su nombre de usuario
u
al servidor. - El servidor extrae una tupla en forma de
(username, salt, hashed_password)
de su base de datos, dondeusername
coincide con el nombre de usuario del clienteu
.hashed_password
es el resultado dehash(salt + password)
(dondehash
es una función hash criptográfica moderna) que se ha calculado cuando la tupla se ha escrito en la base de datos (por ejemplo, durante el registro del usuario). - El servidor envía
salt
al cliente. - El cliente calcula
h := hash(salt + password)
y envíah
al servidor. - El servidor compara
h
conhashed_password
y otorga acceso si los hashes coinciden.
Si asumimos que el servidor no ha calculado el hash durante el registro del usuario (en su lugar, el cliente calculó el hash y envió la tupla (username, salt, hashed_password)
al servidor para almacenarlo en la base de datos), ¿por qué este escenario? ¿No se considera una prueba de contraseña de conocimiento cero? ¿O es de hecho un ZKP?
Según tengo entendido, el servidor nunca ha visto la contraseña real, pero se puede verificar que el cliente posee la contraseña original que se utilizó para crear el hash inicial.