2010-05-09 25 views
5

Estoy trabajando en una aplicación de plataforma móvil que me gustaría que los usuarios autenticaran en la web. Me preguntaba la mejor manera de hacer seguridad. El usuario está enviando una contraseña para HTTP a un servidor php que se autentica en una base de datos mysql en el mismo servidor. Obviamente, no quiero enviar la contraseña en texto plano a través de Internet, pero tampoco quiero hacer 2 hash SHA.Enviando contraseñas a través de la web

Esto es lo que el servidor se parece (en pseudocódigo)

$pass = $_POST['pass']; 

if ((get PASSWORD where USERNAME = USERNAME) == SHA($pass)) return PASS; 

Esto es bastante estándar y no creo que haya otra manera de hacer esto. Pero me preguntaba cómo debería preparar los datos antes de enviarlos por Internet.

Respuesta

10
  1. Si quiere seguridad, USTED. DEBE. UTILIZAR. HTTPS. Con un certificado propio, no autofirmado. Hagas lo que hagas, las identidades que se autentican en la comunicación no encriptada serán triviales para robar. (No importa la contraseña, el atacante puede simplemente robar la cookie de sesión que se proporciona con cada solicitud).
  2. Hashing no tiene valor en sí mismo, debe salarlo. (Esto no está realmente relacionado con la autenticación: es una segunda capa de defensa para el caso cuando alguien roba su base de datos. Lo cual sucederá tarde o temprano si se convierte en un objetivo prometedor). Use bcrypt con una sal aleatoria por usuario larga, sha * es inseguro porque es demasiado rápido.
  3. Utilice métodos que ya están en uso en proyectos grandes que tienen en cuenta la seguridad. Esos métodos, hasta cierto punto, han resistido la prueba del tiempo. Existen métodos basados ​​en la respuesta de desafío que evitan enviar la contraseña de cualquier forma, pero la criptografía es difícil, y es muy fácil implementar algoritmos seguros de una manera insegura.Use un buen marco de seguridad (por ejemplo, PHPass), no confíe en el código que no se usa ampliamente.
+0

+1 para una respuesta mucho más detallada que la mía. –

+0

Gracias por las respuestas chicos. No tengo demasiada experiencia en programación web, creo que es hora de estudiar un poco más sobre seguridad. ¿Hay alguna guía que pueda darme la imagen general de cómo estas tecnologías funcionan juntas? Solo para obtener más información, este es un programa de Android donde el usuario debe crear un nombre de usuario/contraseña en la aplicación, y luego voy a implementar una interfaz web para que el usuario pueda interactuar con el teléfono. Por lo tanto, la única vez que se envía la contraseña a través de Internet es en la creación del usuario. – Falmarri

4

Puede usar SSL si su aplicación cliente lo admite.

0

Como señaló Pekka, SSL es su mejor opción.

Como alternativa, usar SHA en JavaScript es bastante fácil, rápido y ya está escrito. Here's an example y aquí es una biblioteca: crypto.js

+0

No hay necesidad de implementarlo usted mismo. Hay muy buenas libs que ya hacen eso. Por ejemplo Crypto.js, escribí al respecto aquí: http://techpriester.tumblr.com/post/547863016/crypto-js-by-jeff-mott – selfawaresoup

+0

Juro por Dios que hay una biblioteca de ejemplo en mi enlace;) Let reformulo eso para que quede más claro. –

0

Para el sistema no crítico regular de la mayoría de los sitios web envían la contraseña en texto plano a través de Internet durante una petición HTTP POST. La contraseña es codificada por el lado del servidor por SHA1/MD5 y verificada con el valor en la base de datos.

También puede usar https basic authentication, esto codificará la contraseña con un algoritmo simple. Pero aunque no envía la contraseña en texto plano, la codificación es tan simple que es muy (¡muy!) Fácil de descifrar. Pero al usar la autenticación básica, no puede usar un formulario de inicio de sesión normal, tendrá que hacerlo con la compatibilidad de los navegadores para la autenticación básica (¡no muy fácil de usar!).

Si necesita más seguridad, la mayoría de los sitios web simplemente instala un certificado SSL del lado del servidor que compre en un ISP (por ejemplo, godaddy). Esto hará posible acceder a su script de inicio de sesión a través de una conexión encriptada SSL. Esta solución se considera segura (siempre que no sea fácil adivinar o robar la contraseña).

Otro enfoque interesante, pero poco común, es hacer la codificación SHA1 en JavaScript antes de hacer una solicitud (Ajax) al servidor (JS sha-1 example). En teoría, esto podría proporcionar una seguridad bastante razonable ...

Y si todo esto aún no es suficiente, podría considerar la instalación de client certificates o un sistema de desafío de respuesta con una calculadora o SMS.

+3

No estoy de acuerdo con hacer la codificación sha1 antes de enviarla. De esta forma, el hash sha1 solo actúa como contraseña, y cualquiera que detecte el tráfico de la red puede simplemente enviar el hash al servidor sin necesidad de conocer la contraseña original. Además, esto hace que sea inaccesible para las personas que no son compatibles con JS, o significa que su servidor tiene que detectar qué tipo de contraseña se envió (hash o sin hash). –

+3

El servidor podría enviar la sal, el cliente podría calcular el hash salado, agregar una cadena aleatoria, hash nuevamente, devolver el segundo hash y la cadena aleatoria, y el servidor podría verificar agregando la cadena aleatoria al hash de contraseña almacenada y hashing de nuevo. Es un poco complicado de extraer (se necesitan dos solicitudes para iniciar sesión), pero es razonablemente seguro contra un atacante que puede monitorear la comunicación pero no puede realizar un ataque de hombre en el medio. Por supuesto, él robaría la cookie de sesión de todos modos. – Tgr

+0

@Tgr: ¿Cómo ayuda el segundo hash con la cadena aleatoria a hacer las cosas más seguras? Si el primer hash (hash la contraseña + el salt) es vulnerable a un ataque de repetición, el segundo hash no ayudaría en absoluto porque el atacante volvería a reproducir la misma cadena "aleatoria". –

Cuestiones relacionadas