Hay un mecanismo para permitir la autenticación segura a través de HTTP sin SSL o TLS, pero rara vez se usa, y aún no es tan bueno como HTTPS. Básicamente, es una medida de seguridad de interés histórico a medias que nunca tuvo éxito, y realmente deberías usar HTTPS de todos modos. Pero como preguntaste .......
El protocolo HTTP admite dos mecanismos de autenticación: Autenticación de acceso básica y de resumen, ambos descritos en RFC 2617 . Estos son mecanismos que hacen que su navegador muestre un cuadro de diálogo de autenticación , no integrado en El contenido de la página. La autenticación básica, que a veces se usa, no es mucho mejor que la transmisión de texto simple.
El mecanismo Digest, sin embargo, es un protocolo de desafío-respuesta. El servidor emite un desafío que contiene un nonce (alguna cadena aleatoria). El cliente debe volver a emitir la solicitud con una respuesta que sea una función hash del nonce y la contraseña (pero no la contraseña en sí).
Hay algunas advertencias importantes:
- El servidor generalmente almacena la contraseña de texto sin formato (o una versión equivalente a texto sin formato de la misma) para poder verificar el desafío. Esto es indeseable, ya que las mejores prácticas exigen que solo se almacenen los hashes de contraseña con sal. (@ user2829759 señala que el servidor también podría almacenar el hash MD5 de (usuario: dominio: contraseña) .
- El mecanismo Digest usa MD5, que se considera un algoritmo hash inseguro en estos días. A diferencia de SSL / TLS, no hay negociación de algoritmo entre el cliente y el servidor.
- No hay verificación de la identidad del servidor. La falsificación es posible, al igual que los ataques de hombre en el medio. Lo único que la Autenticación Digestica es buena para proteger es la propia contraseña, que no es tan útil como se podría pensar.
En Apache, mod_auth_digest .
Una lección que puede extraerse de esta pieza de trivia es que un hackeo de cifrado basado en JavaScript es probable que sufra las mismas debilidades. Si necesita seguridad, simplemente use HTTPS!