![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Como encriptar el pasword y datos desde una página html ?
Hola,
Tengo el siguiente problema: Normalmente, uso un cliente en Delphi para conectarme a un DLL ISAPI en Delphi pero, ahora se requiere que parte del cliente esté en HTML. Es un área en que conozco poco; pero son pocas páginas y sencillas así que en principio no es mayor problema excepto por lo siguiente que escapa a mi conocimento: Como la conexión debe ser "segura", debo encriptar datos en el cliente. Bien entendido, hablo de una seguridad media, que para romperse exija una persona con conocimentos avanzados en software. Ahora bien, eso significa que debo descargar al cliente una pequeña rutina que haga la encriptación. Esa rutina debería llegarle al cliente compilada y ser llamada desde la página html antes de enviar el form. Por lo que he averiguado, en el OnSubmit de la forma debo llamar la rutina; pero tengo varias dudas. Me disculpan porque las reglas dicen que debo hacer una sola; pero la verdad todo es el mismo tema y creo más lógico condensarlo en un solo hilo : 1. Que lenguajes puedo usar para escribir la rutina? 2. Como se escribiría exactamente la llamada a la rutina ? 3. Como se descargaría la rutina en el cliente ? Para mayor seguridad, debería llegarle compilada; peo, la filosofía en los navegadores Web es de que llegue texto abierto para que pueda ser portable entre sistemas operativos. En mi caso no me interesa esa portabilidad. Los clientes serán siempre Windows. Puedo en realidad descargarla compilada ? 4. Como puedo proteger la rutina en el cliente para minimizar el riesgo de que personal no autorizado pueda ver el código compilado? |
#2
|
||||
|
||||
Hola,
Hasta donde yo llego, este tipo de tareas de autenticación, no deben dejarse nunca en el lado del cliente, sino en el del servidor. El cliente debería poder proporcionarte ciertos datos, como suelen ser un "login" de usuario y una contraseña, y el servidor verá qué respuesta ofrece a eso: o bien considera autenticado al usuario o no. Otra cosa es que puedas transmitir los datos, si hablamos de HTTP, mediante HTTPS, o sea usando una conexión "cifrada" (no sé si es correcto, porque no tengo experiencia), pero, me temo que esto ya es otro tema. Igual es que no he sabido entender lo que planteas. Tú dirás. ![]() |
#3
|
|||
|
|||
Cita:
Gracias por contestar. Sí, quizás no me he explicado bien. Empecemos por aclarar algo en lo que estas malinterpretando mi problema, y lo hago en detalle por mayor claridad de otros que lean el hilo: Una cosa es la autenticación del usuario; es decir, validar que el usuario exista, que su clave sea la correcta, lo permisos a tener y como vá acceder de ahí en adelante. Eso, como bien dices, queda en el lado del servidor, y por supuesto siempre lo he hecho así. Otra cosa muy diferente es el manejo de como enviar al servidor los datos de autenticación del usuario. El caso es que esos datos, al menos el password, deben ser enviados encriptados desde el cliente; es decir, en el cliente debe ejecutarse una rutina que reciba los caracteres digitados por el usuario y los encripte, en el cliente, para enviarselos al servidor ya encriptados. Encriptar es algo en lo que no tengo problemas, ya que con frecuencia escribo algoritmos de encriptación. Mi problema es que con html el paradigma de manejo de esas rutinas es bien diferente a Delphi. En Delphi tengo un ejecutable propio corriendo en el cliente. Descifrar una rutina de encriptación ubicada dentro de un ejecutable grande, compilado sin ninguna información de depuración y sin siquiera nombres de variables o de la rutina, que den una pista de su ubicación, aunque no imposible, es sumamente dificil ya que requiere conocimientos muy avanzados y tiempo. En html, el principio es el mismo: Debo encriptar con mis propios algoritmos ejecutandose en el cliente. Sin embargo, hay una gran diferencia: El código que lee el cliente para desplegar la página donde voy a leer los datos se envía como texto, por tanto, abierto a cualquiera con medianos conocimientos. Mi problema es como hago para ubicar mi rutina en el cliente de tal forma que pueda tener una seguridad razonablemente buena. Para ello, mi idea es que la rutina llegue compilada al Navegador Web del cliente; pero, como lo hago?, y lo más básico, en que lenguaje lo escribo ? |
#4
|
||||
|
||||
Hola,
Pero, yo sigo sin entender porqué es necesario que "cifres" ("encriptes") nada en el cliente. Supón que yo guardo en la base de datos el "hash MD5" de una determinada cadena, que esla contraseña de un usuario. Claro que yo podría enviar al servidor la cadena "cifrada", directamente, pero, ¿para qué voy a hacerlo? Es algo que puedo hacer perfectamente en el servidor. Más aún, todo lo que haga en el cliente quedará "a la vista", pero, en el servidor sólo yo sabré si la contraseña al cabo termina siendo "cifrada" con MD5, con SHA, o con cualquier otro algoritmo que quiera utilizar. Tú dices: Cita:
Ahora bien, mirando un poco para otro lado, es decir, suponiendo que tenemos que trabajar en el cliente, en este caso me parece que no hay otra sino Javascript, tal vez algún "applet" de Java, un "ActiveX", un aplicación "Flash"... cualquiera de estas "tecnologías" te ofrecen la posibilidad de trabajar en el cliente, y en la mayoría de ellas (por no decir en todas) encontrarás disponibles implementaciones de ciertos algoritmos que podrás utilizar para cifrar y descifrar información. No sé si las cosas van por ahí o no... |
#5
|
|||
|
|||
Cifrado en cliente
Hola,
Disculpa; pero el método que estás usando es totalmente inseguro y cualquiera, más o menos entrenado puede volarse esa "seguridad". Las aplicaciones que a las que dices estar acostumbrado, están trabajando muy mal esa parte. Si tienes datos importantes, te sugiero reescriban él código de seguridad tan pronto como sea posible Bajo ninguna circunstancia deberían viajar sin cifrar datos importantes por la red. De hecho, lo lógico es cifrar la totalidad del requerimiento, dificultando aún más la posibilidad de que descifren tú clave de usuario. Eso es precisamente lo que yo hago en Delphi; desde mi cliente, mando encriptado todo el bloque de datos vía "POST". No lo mencioné al principio para no complicar el tema En el servidor, lo que se maneja, transparentemente para los usuarios finales son dos cosas: 1. El usuario y la clave de conexión a la Base de Datos, la cual, normalmente, es una sola para todos los requerimientos que se reciben. Esa se debe encriptar, como una seguridad adicional, con un programa residente en el servidor que deje esa encriptación en campos del registro de Windows, o en un archivo. Cuando tú aplicación servidor se ejecuta, debe leer esa información y desencriptarla para así poder conectarse a la Base de Datos 2. La autenticación de usuario, es decir, las claves de usuario de la aplicación como tal, no las de conexión a la Base de Datos. Esa información, que es a la que te refieres, se guarda encriptada en una tabla de la Base de datos. Cuando el cliente envía un requerimiento, los datos se cifran primero en el cliente, de forma que viajen ocultos a terceros; el servidor los recibe y los desencripta; luego lee de la tabla de usuario, desencripta la clave guardada en la base de datos y la compara con la que ha recibido. Vale anotar que de ninguna manera, debería compararse directamente la cadena encriptada en la Base de Datos con la enviada desde el cliente; porque la única forma de que sean iguales es de que el algoritmo genere una encriptación idéntica para una cadena caracteres cada vez que sea invocado. Los algoritmos de ese tipo son los más fáciles de vulnerar y no deberían ser usados. De no proceder así. cualquiera puede interceptar el comando http que envías y ver cual es tú clave de usuario; para lo cual haya varias técnicas que no creo del caso detallar. De ahí en adelante pueden entrar a cualquier funcionalidad de tú aplicación a la que tengas acceso Mi problema es de conocimiento como implementar las cosas con página Web; pero, en todo lo demás relativo al tema, si tengo mucha experiencia. De lo que te acabo de explicar estoy totalmente seguro. Es más, casualmente hoy pude romper facilmente la seguridad de una aplicación que estaba usando una persona a la que consulté respecto al problema; y precisamente cometía el mismo error que tú |
#6
|
||||
|
||||
Hola,
Vamos a ver si podemos entendernos. Si de lo que se trata es de que nadie pueda interceptar los datos que un cliente envía a un servidor, efectivamente, se ha de utilizar un protocolo como HTTPS, en lugar de HTTP. Ahora bien, eso que dices de que la aplicación ha de guardar en el servidor una clave cifrada, y recibir una clave cifrada del cliente, que en el servidor se descifran y se comparan ambas claves... eso no es lo normal, lo que yo conozco, lo que puede verse en decenas de aplicaciones. Lo normal es que una aplicación (en el servidor) no guarde la contraseña cifrada, ni por supuesto "en claro", sino que lo que guarda es un "hash", una "firma" de la contraseña del usuario, que será única para la misma contraseña. De este modo, en el servidor no se conoce, en realidad, la contraseña del usuario: nadie puede conocerla, de hecho, porque no se usa ningún algoritmo de cifrado y descifrado, sino que se usa un algoritmo de "hashing", que retornará una cadena única partiendo de una cadena que sólo el usuario conoce. ¿Nunca te ha pasado que has perdido la contraseña de usuario de un sitio web y el sitio web te ha tenido que mandar una nueva contraseña? Te mandan una nueva contraseña, porque tu contraseña no la conoces sino tú: nadie más la conoce, ni el servidor, ni el cliente, ni nadie. Así que son cosas distintas. Efectivamente, es posible (pero tal vez no probable) que alguien "espíe" una comunicación entre un cliente y un servidor, pero, para evitar esto se puede usar un protocolo como "HTTPS", donde se cifra toda la conexión, no sólo unos determinados datos que viajen en ella. Pero el mecanismo de autenticación es el mismo. Insisto, no se trata de cifrar y descifrar una contraseña. Se trata de que nadie más que el usuario conoce la contraseña. Tú "juegas" en el servidor con un "hash" de esa contraseña, que ha de coincidir con el "hash" que previamente guardaste. No puedes descifrar nada. No conoces la contraseña, y, si alguien "entrara" en el servidor y accediera a la base de datos, lo único que encontraría serían un puñado de "hash", a partir de los cuales no es posible, al menos en teoría, descubrir la contraseña que hay detrás. Ahora piensa esto: si existe un mecanismo de cifrado y descifrado, alguien podrá siempre descifrar cierta información, si averigua qué mecanismo de cifrado se utilizó, empero, nadie puede descifrar un "hash": por tanto se evita el cifrado y descifrado, y es el usuario quien únicamente conoce su contraseña. Si se le "pierde", tal como he dicho ya, hay que crear una nueva, por decirlo así, puesto que ni siquiera tú conocerás las contraseñas de tus usuarios. Ahora bien, ¿no te parece esto una mejor solución? Yo creo que sí, pero, es que además es el "sistema" que se utiliza en estos casos. PD. Ya digo, siempre que estemos hablando de lo mismo, que todavía no me queda muy claro. PD. Parece claro que el protocolo HTTPS debería usarse cuando se intercambia información "sensible", empero, o me equivoco, o no resulta trivial apoderarse de datos a través de HTTP, así sin más. ¿Por qué digo esto? Bueno, porque el protocolo HTTPS lo utilizan determinados sitios web, pero, estarás conmigo en que otros muchísimos sitios no lo usan. Sin ir más lejos, estos foros no usan el protocolo HTTPS, sino que usan HTTP (y precisamente un sistema similar al que he descrito) para autenticar usuarios. Ahora bien, ¿hay alguien ahí interceptando lo que estoy enviando al ClubDelphi cuando me autentifico? ¿Es posible? Tal vez, pero, según parece, no es tan probable ni tan sencillo. Última edición por dec fecha: 09-01-2009 a las 03:01:45. |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Enviar Datos a pagina web desde delphi | tocomi | Internet | 3 | 18-02-2009 23:02:59 |
email html desde base de datos | nfrfabian | Internet | 2 | 26-01-2007 23:24:44 |
Como abrir una pagina html (LOCAL) | desve | Varios | 3 | 23-05-2005 21:53:49 |
Leer desde una página <HTML> | AGAG4 | Varios | 2 | 20-08-2004 02:56:43 |
Leer datos desde una página Web | cone220 | Internet | 1 | 16-01-2004 23:03:44 |
![]() |
|