lunes, 26 de febrero de 2007

El medio roto al encriptar

En estos día he estado averiguando como encriptar contraseñas en PHP, para que sean almacenadas en una base de datos, con el fin de desarrollar una aplicación en la que filtre el acceso a ciertos lugares usando nombres de usuario y contraseña... sin embargo, me encontré con un problema grave!!!, es posible que no me sirva de gran cosa encriptar las contraseñas cuando existe un problema en el proceso que afecta por completo la seguridad!!!

En un principio encontré algoritmos de encriptado ( MD5 ), junto con formas de implemenarlos en PHP, lo que permite que el proceso de cifrado se lleve a cabo en el servidor de mi aplicación, pero en este punto aparecieron suceptibilidades de seguridad graves, suceptibilidades relacionadas con el transpaso de la información desde el cliente hasta el servidor... mejor dicho:

Cuando un usuario ingrese a la aplicación, colocará su nombe de usuario y contraseña y da click en un boton de acceso, como "acceder", "log in" o cosas así; es en este punto donde empieza el algoritmo :

  1. El computador cliente toma los datos ingresados y los envía por la red hasta el servidor.
  2. El servidor recibe estos datos desde la red, comprueba la existencia del nombre de usuario.
  3. Si el usuario existe, se procede a encriptar la contraseña.
  4. Se compara el resultado del cifrado de la contraseña con los datos (previamente encriptados con el mismo algoritmo de encriptado) de contraseña almacenados en la base de datos.
  5. Si ambos datos (la contaseña encriptada enviada y la almacenada) son iguales, entonces se le dá acceso al cliente, de lo contrario se deniega el acceso.
Como pueden ver, el proceso es bastante simple, sin embargo, que pasa si alguien filta la información que sale desde el cliente???, es decir, que pasa si alguien "chuza" el cable de red y logra ver la contraseña que viaja antes de que llegue al servidor???

Pues se perdió el trabajo!!!! alguien que logre interceptar la contraseña podrá usarla cuantas veces quiera y se habrá perdido la seguridad!!!

Entonces encontré una nueva propuesta...

Algunos proponen que en lugar de hacer el encriptado en el servidor, es mejor hacerlo en el cliente, usando para ello JavaScript!!! así se evita que el "chuzador" vea la contraseña tal cual y solo va a poder ver el cifrado de la misma!!!, el resto del proceso es lo mismo e igual se usaría PHP para tener acceso a la base de datos, comparar información y todo eso...

... pero... si el chuzador usa el cifrado del password para enviarlo también al servidor??? no se tendría la misma debilidad que en el caso anterior, solo que esta vez en lugar de interceptar la contraseña original se intercepta la contraseña cifrada???

Es justo en este instante en donde pienso que a pesar de que es muy bueno que miles de científicos, investigadores e ingenieros al rededor del mundo luchen por perfeccionar los sistemas de encriptado, el esfuerzo pierde mérito siempre que exista la posibilidad de que el medio por el cual viaja la información tenga la posibilidad de "romperse" e interceptar así la información!!!

Para ser sincero solo hablo de lo que conozco, no sé si existan métodos para evitar esas "chuzadas", pero si no existe algo tan efectivo como los procesos de encriptado... quizá debamos dedicarle un poco más de tiempo y dedicación a solucionar este problema....

... o quizas sea yó quien no esté usando las técnicas de desarrollo adecuadas???

... en fin, esos son mis conflictos con el medio roto a la hora de encriptar.

PDT: Cualquier ayuda o información adicional es muuuy valiosa para mí, dejamne tu comentario!!!

2 comentarios:

jpromerobx dijo...

Lograr un sistema informático totalmente seguro es algo utópico, no sólo por las limitaciones que tengan los algoritmos de criptografía sino por el mismo descuido de los usuarios con las contraseñas y claves de sus e-mails, cuentas bancarias, etc. La seguridad que uno puede garantizar, se puede ver fácilmente vulnerada por un usuario que dejó su clave escrita en un papel pegado a la pantalla del PC. En palabras del famoso Kevin Mitnic: "... el poder de la Ingeniería Social ...!". Respecto al problema del envio de las claves, podes emplear una conexión segura entre el cliente y el servidor mediante SSL (http://es.wikipedia.org/wiki/SSL), para garantizar un transporte seguro de los datos y si el caso amerita, también están las VPN. Si la decisión es SSL, consulta: http://wiki.freaks-unidos.net/sysadmin
(artículo de como configurar Apache2 + SSL).

ugo dijo...

MD5 no es ningún algoritmo de encripción, es un algoritmo de Hash. Los algoritmos de hashing son de una sola via, no puedes obtener el texto original si tienes el hash.
De hecho, tu problema no es de encripción, es de autenticación.
Por lo pronto, como lo dijo jpromerobx, usa SSL para evitar que te 'chuzen'.