Paso uno: no confíe en las personas en Internet, propondré un algoritmo débil para asegurar que pueda romperlo.
Paso dos: No diseñe su propio algoritmo, o implementar cualquier otra persona que está en un sistema de producción hasta que tenga un PHD en la seguridad informática
cifrado no es suficiente para proteger contra ataques de repetición, si un atacante obtener el contraseña encriptada, les sirve tanto como una contraseña no encriptada si es suficiente para autenticarse.
que sugeriría:
- usuario entra allí contraseña
- Las solicitudes de cliente token del servidor
- servidor devuelve un token aleatorio único, y almacena esta en contra de la sesión de usuarios (tecleó por cookie almacenada en el servidor)
- El cliente encripta la contraseña + token con su clave pública y la pasa al servidor.
- El servidor descifra esto, usando su clave privada, y verifica que el token coincida con esta sesión, no se ha usado antes y no tiene más de 30 segundos.
- El servidor comprueba que el hash de la contraseña coincide con el hash de la contraseña de los usuarios que se almacena en el almacén de datos.
Todos los datos transmitidos seguirán estando visibles, por lo que los usuarios no obtendrán ninguna privacidad (como lo harían en https). Su algoritmo de cifrado, implementación de cifrado y clave pública serán públicos. Este es el caso de una gran cantidad de cryptolagy actual, una gran cantidad de algoritmos están diseñados para ser seguros con el atacante sabiendo esto.
Esto no protegerá contra ningún keylogger o ataque de spyware, ya que apuntarán antes de cifrar la contraseña.
No tengo conocimiento de las implementaciones de cifrado asimétrico implementadas en JavaScript, pero no hay nada fundamentalmente inseguro en este enfoque.
Gracias por la revisión, Michael Petrotta; Supongo que mi corrector ortográfico no estaba activado después de todo :) –
¿Por qué no solo usas HTTPS? –
@Alin Purcaru: Pregunta actualizada –