En primer lugar, esto NO mejora la seguridad de su aplicación (suponiendo que sea una aplicación web).
Use SSL (o en realidad TLS, que comúnmente se llama SSL), no es realmente costoso (Mida el tiempo que está usando para encontrar formas de evitarlo y multiplíquelo con el salario mínimo, comprar un certificado casi siempre gana).
El por qué de esto es simple. TLS resuelve un problema (cuando se usa con certificados comprados, no autofirmado) que es bastante grande en criptografía: ¿Cómo sé que el servidor con el que estoy hablando es el servidor con el que creo que estoy hablando? Los certificados TLS son una forma de decir: "Yo, la autoridad de certificación, en la que confía su navegador, certifica que el sitio web en [url] tiene esta clave pública, con una clave privada correspondiente, que (clave privada) solo el servidor conoce, mira Firmé mi firma en todo el documento, si alguien lo modificó, puedes verlo ".
Sin TLS, cualquier cifrado se vuelve inútil, porque si me siento a tu lado en una cafetería, puedo hacer que tu computadora portátil / teléfono inteligente piense que soy el servidor y MiTM (Man in The Middle). Con TLS, su computadora portátil / teléfono inteligente gritará "CONEXIÓN NO CONFIABLE", porque no tengo un certificado firmado por la autoridad de certificación que coincida con su sitio. (Cifrado vs. Autenticación).
Descargo de responsabilidad: los usuarios tienden a hacer clic a través de estas advertencias: "¿Conexión no confiable? ¿Qué? ¡Solo quiero mis fotos de gatitos! Agregar excepción Haga clic en Confirmar Haga clic ¡YAY! ¡Gatitos!"
Sin embargo, si realmente no desea comprar un certificado, implemente el hashing javascript del lado del cliente (y use la biblioteca standford (SJCL) para eso, NUNCA IMPLEMENTE CRYPTO USTED MISMO ).
¿Por qué? Reutilización de contraseña! Puedo robar su cookie de sesión (lo que me permite fingir ante su servidor que soy usted) sin HTTPS fácilmente (vea firesheep). Sin embargo, si agrega un javascript a su página de inicio de sesión que, antes de enviar, codifica su contraseña (use SHA256, o incluso mejor, use SHA256, envíeles una clave pública que generó y luego cifre la contraseña cifrada con eso, no puede usar una sal con esto) y luego envía la contraseña cifrada / cifrada al servidor. REHASH el hash en su servidor con sal y compárelo con lo que está almacenado en su base de datos (almacene la contraseña de esta manera:
(SHA256(SHA256(password)+salt))
(guarde la sal como texto sin formato en la base de datos también)). Y envíe su contraseña así:
RSA_With_Public_Key(SHA256(password))
y verifique su contraseña de esta manera:
if SHA256(RSA_With_Private_Key(SHA256(sent_password))+salt_for_username) == stored_pass: login = ok
Porque, SI alguien está oliendo su cliente, que será capaz de iniciar una sesión a su cliente (secuestro de sesión) pero serán NUNCA ver la contraseña en texto plano (a menos que alteran su Javascript, sin embargo, un Starbucks hacker probablemente no saber howto / interesará en esto.) Para que tengan acceso a su aplicación web, pero no a su correo electrónico / facebook / etc. (para lo cual sus usuarios probablemente usarán la misma contraseña). (La dirección de correo electrónico será su nombre de usuario o se encontrará en su perfil / configuración en su aplicación web).