Tengo una idea para un algoritmo. No sé si cometí algún error y necesito algunos pensamientos adicionales / revisión por pares sobre ello.
Esto funcionaría como una prueba de conocimiento (casi) cero para enviar contraseñas que se pueden implementar fácilmente.
registration:
Un usuario envía su contraseña al servidor (riesgo de una sola vez).
El servidor calcula un hash "seguro" de dicha contraseña. Este hash tiene que ser muy largo, digamos 4k caracteres.
login:
Cuando un usuario desea iniciar sesión, primero calcula dicho hash en su máquina local. Luego, el servidor le dice al cliente que una las letras aleatorias a una nueva contraseña única. El servidor solo envía las posiciones de las letras y las envía al azar, de modo que haya suficientes permutaciones para no quedarse sin combinaciones. Tiene que haber un historial de cartas ya usadas, para que al menos una carta nunca expuesta se use. De lo contrario, un MITM podría simular un cliente.
Después de unir todas las letras a una nueva contraseña, dicha contraseña se "revisa" de forma segura y se envía al servidor para su verificación. el servidor realiza las mismas tareas que el cliente y compara su versión con los datos de los clientes.
Incluso si el envío de contraseñas de un solo uso está "seguro", el atacante tiene tiempo. Entonces, después de que se revela la mitad de la contraseña original con hash, se incrementa el contador, y dicha contraseña se hasheado una vez en el lado del servidor y se descartan las contraseñas de hash antiguas. Este contador se envía al cliente cada vez que quiere iniciar sesión, por lo que aumenta las vueltas de hash por el contador para que coincida con los datos del servidor.
Esta es una idea que se me ocurrió hace unos segundos. Parece ser un buen enfoque. Pero me gustaría ver sus pensamientos sobre esto, ¿dónde está la falla? ¿O ya se ha utilizado algo similar?