Autor Tema: Internet Account Manager V1.2 (SOLUCIONADO)  (Leído 3737 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cristiantorres

  • Sv Jr.
  • **
  • Mensajes: 76
  • Bendiciones para todos
    • Blog dedicado a la programacion
Internet Account Manager V1.2 (SOLUCIONADO)
« : mayo 31, 2012, 10:20:09 pm »
Buenas noches a todos.

Ayer publique en este foro la versión 2 de mi humilde aplicación para administrar cuentas de usuarios, pero ahora un usuario de este foro me hiso ver que no manejaba la encriptacion y desencriptacion de una forma totalmente segura.

Asi que me puse a pensar como solucionar este inconveniente y como hacer mas segura la aplicación y se me ocurrieron varias formas de hacerlo así que aplique quizas la mas conveniente, lo que hice fue que por cada usuario que se registre en la aplicación ademas del usuario y contraseña tendrá que ingresar una key que sera con la cual se encriptara y desencriptara su información y guardo esta key en la bd pero le aplico hash para que no pueda ser desencriptada y asi proteger la información de una manera mas segura.

Esto fue lo que cambie a la hora de crear la cuenta tendrán que ingresar la key.



Lo demás sigue igual.






Link de descarga http://sdrv.ms/KCOFzi

Eso es todo saludes, y al usuario que descubrió la manera de como desencriptar antes los datos lo invito a que lo vuelva hacer y me cuenta como le fue.

Bendiciones buenas noches


« Última Modificación: mayo 31, 2012, 11:04:27 pm por cristiantorres »
Visita mi Blog C#, Asp.Net, Python y mas...
http://cristiantorresalfaro.blogspot.com
http://codemania.tk

Desconectado eduardo91

  • Sv Jr.
  • **
  • Mensajes: 50
Re:Internet Account Manager V1.2 (SOLUCIONADO)
« Respuesta #1 : junio 01, 2012, 10:10:00 am »
Vaya manera de ingeniárselas puede ser una aplicación útil, la probare para ver como funciona

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re:Internet Account Manager V1.2 (SOLUCIONADO)
« Respuesta #2 : junio 01, 2012, 01:32:13 pm »
@CristianTorres, lo siento mucho pero sigues cometiendo el mismo error en seguridad. Ya te actualize la pagina para descifrar las contraseñas.. Puedes verla aqui:

http://decrypt.click-system.net/

Ahora no solo hay q copiar de la base de datos la contraseña que se desea desencriptar, sino tambn la "KEY" que se encuentra en la tabla "USUARIOS", y listo.. pueden desencriptar cualquier contraseña del Internet Account Manager v1.2.

Bueno saludos, si necesitas ayuda para corregir el error m puedes preguntar con mucho gusto.
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado Jarmandaros

  • -*-Miembro Eterno-*-
  • The Communiter-
  • *****
  • Mensajes: 3873
  • -^- Despicable Member -^-
    • Jarmandaros Blog
Re:Internet Account Manager V1.2 (SOLUCIONADO)
« Respuesta #3 : junio 01, 2012, 01:47:10 pm »
Creo que aun no es seguro utilizarlo pero va en camino   :thumbsup:
Queres Vender o Comprar un producto X? unite al grupo del Tiangue! en Facebook, solo necesitas una cuenta en FB. EL Tiangue!
Visita mi Blog

Desconectado cristiantorres

  • Sv Jr.
  • **
  • Mensajes: 76
  • Bendiciones para todos
    • Blog dedicado a la programacion
Re:Internet Account Manager V1.2 (SOLUCIONADO)
« Respuesta #4 : junio 01, 2012, 07:36:34 pm »
@CristianTorres, lo siento mucho pero sigues cometiendo el mismo error en seguridad. Ya te actualize la pagina para descifrar las contraseñas.. Puedes verla aqui:

http://decrypt.click-system.net/

Ahora no solo hay q copiar de la base de datos la contraseña que se desea desencriptar, sino tambn la "KEY" que se encuentra en la tabla "USUARIOS", y listo.. pueden desencriptar cualquier contraseña del Internet Account Manager v1.2.

Bueno saludos, si necesitas ayuda para corregir el error m puedes preguntar con mucho gusto.
jeje me estas poniendo las cosas un poco dificiles.

que me suguieres para solucionarlo.
Visita mi Blog C#, Asp.Net, Python y mas...
http://cristiantorresalfaro.blogspot.com
http://codemania.tk

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re:Internet Account Manager V1.2 (SOLUCIONADO)
« Respuesta #5 : junio 01, 2012, 10:55:00 pm »
Vaya mira, una de las soluciones q te daria si no quieres ofuscar tu codigo es:

1 - Lo puedes hacer Web (que seria lo ideal), ya q de esa manera cualquier usuario estando en cualquier maquina puede acceder a sus credenciales en lo sitios, imaginate ha salido de su casa donde tiene el programa, solo necesita acceder a una computadora al sitio y poder adminsitra via web sus contraseñas. Siento que seria el mejor enfoque para tu aplicacion que tiene muy buena idea. Ojo tambn ganas portabilidad en cualquier plataforma, no tiene q ser necesariamente Windows, (a excepcion de Mono en Linux para correr app en .NET), estando en al Web, no importa si esta en un SmartPhone, Tablet, iPad, Tele Inteligente, o OS, siempre vas a poder acceder, asi q ganas un buen numero de beneficios alli

2 - Bueno, pero si quieres mantener la aplicacion Desktop, buena una solucion para la "Key" de las cuentas podria ser utilizar una "Encriptacion de Maquina".
Los pasos serian asi:
  • Creas una nueva cuenta de usuario, pides su Nickname, password, y Key de cifrado.
  • La "Key" proporcianada por el usuario, la encriptas utilizando la clase ProtectData. Link de ayuda: http://msdn.microsoft.com/es-es/library/system.security.cryptography.protecteddata.aspx
  • La encriptacion en ese modo significa que solo puede ser Desencriptada en tu Computador, si intentas desencriptar en otra computador, te va a dar otro valor.
  • Y cada vez que necesites desencriptar una credencial, debes de desencriptar la Key, y pasarsela a tu funcion para desencriptar la contraseña de la cuenta que desea ver.

Ojo con ese metodo tienes sus pros y sus contras.
- Solo vas a poder desencriptar en la maquina que utilizas, (podrias crear un metodo adicional por si el usuario se cambia de PC, pueda volver a encriptar sus Password, en la nueva maquina)
- Nadie podria llevarse tus credenciales, ya que para ver tus contraseñas es OBLIGACION q lo vea desde tu maquina, ya q no podria desencriptar en otra maquina que no fuera la tuya.
- Puede ser un problema si el usuario anda el programa en un USB de una maquina para otra.

Aunq en resumido, la mejor opcion sigue siendo lo de la Web, te ahorras varias problemitas como estos, ya que solo en tu servidor estaria el almacen de datos, asi q es mas dificil que llegen al almacen. En cambio tu almacen de datos cualquiera puede llegar a la informacion.

Pero bueno, ambos tienes sus pro y contras. Y para finalizar, podrias "ofuscar" tu aplicaciones, para q no se puede Decompilar el Exe tan facil.!

MSDN tiene muy buenos tutoriales y otros metodos que pueden ser mejor que lo q yo te planteo, puedes echar un vistazo en MSDN: http://msdn.microsoft.com/es-es/library/fkytk30f(v=vs.80).aspx y empezar a ver otra opcion que se adapte mejor a tus necesidades

NOTA:
Si quieres algo un poquito mas completo, puedes utilizar el Algoritmo Asimetrico RSA, (hasta donde me acuerdo haber visto en clase, es el mas seguro), el algoritmo utiliza Llave Privada y Llave Publica para desencriptar el contenido (Este algoritmo utiliza Amazon en su servicio de Web Services), lo que hace es q tu puedes darles a todos tu llave Publica, para que puedan encriptarte contenido, y solo tu puedas desencriptar con tus llaves privadas y tu llave publica. Ojo la llave publica solo es para q las demas personas puedan encriptarte y mandarte a ti contenido encriptado. Y las llaves privadas (que solo tu tienes) te sirven para desencriptar. Podrias leer un poquito mas sobre ver como implementar el algoritmo en tu aplicacion.

te dejo un ejemplo que encontre para pasar a XML tu calve privada y publica de RSA:
http://topicos-seguridad.blogspot.com/2009/04/creacion-de-llaves-publicas-y-privadas.html
« Última Modificación: junio 01, 2012, 11:15:36 pm por Juancho »
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado cristiantorres

  • Sv Jr.
  • **
  • Mensajes: 76
  • Bendiciones para todos
    • Blog dedicado a la programacion
Re:Internet Account Manager V1.2 (SOLUCIONADO)
« Respuesta #6 : junio 02, 2012, 09:47:03 am »
Vaya mira, una de las soluciones q te daria si no quieres ofuscar tu codigo es:

1 - Lo puedes hacer Web (que seria lo ideal), ya q de esa manera cualquier usuario estando en cualquier maquina puede acceder a sus credenciales en lo sitios, imaginate ha salido de su casa donde tiene el programa, solo necesita acceder a una computadora al sitio y poder adminsitra via web sus contraseñas. Siento que seria el mejor enfoque para tu aplicacion que tiene muy buena idea. Ojo tambn ganas portabilidad en cualquier plataforma, no tiene q ser necesariamente Windows, (a excepcion de Mono en Linux para correr app en .NET), estando en al Web, no importa si esta en un SmartPhone, Tablet, iPad, Tele Inteligente, o OS, siempre vas a poder acceder, asi q ganas un buen numero de beneficios alli

2 - Bueno, pero si quieres mantener la aplicacion Desktop, buena una solucion para la "Key" de las cuentas podria ser utilizar una "Encriptacion de Maquina".
Los pasos serian asi:
  • Creas una nueva cuenta de usuario, pides su Nickname, password, y Key de cifrado.
  • La "Key" proporcianada por el usuario, la encriptas utilizando la clase ProtectData. Link de ayuda: http://msdn.microsoft.com/es-es/library/system.security.cryptography.protecteddata.aspx
  • La encriptacion en ese modo significa que solo puede ser Desencriptada en tu Computador, si intentas desencriptar en otra computador, te va a dar otro valor.
  • Y cada vez que necesites desencriptar una credencial, debes de desencriptar la Key, y pasarsela a tu funcion para desencriptar la contraseña de la cuenta que desea ver.

Ojo con ese metodo tienes sus pros y sus contras.
- Solo vas a poder desencriptar en la maquina que utilizas, (podrias crear un metodo adicional por si el usuario se cambia de PC, pueda volver a encriptar sus Password, en la nueva maquina)
- Nadie podria llevarse tus credenciales, ya que para ver tus contraseñas es OBLIGACION q lo vea desde tu maquina, ya q no podria desencriptar en otra maquina que no fuera la tuya.
- Puede ser un problema si el usuario anda el programa en un USB de una maquina para otra.

Aunq en resumido, la mejor opcion sigue siendo lo de la Web, te ahorras varias problemitas como estos, ya que solo en tu servidor estaria el almacen de datos, asi q es mas dificil que llegen al almacen. En cambio tu almacen de datos cualquiera puede llegar a la informacion.

Pero bueno, ambos tienes sus pro y contras. Y para finalizar, podrias "ofuscar" tu aplicaciones, para q no se puede Decompilar el Exe tan facil.!

MSDN tiene muy buenos tutoriales y otros metodos que pueden ser mejor que lo q yo te planteo, puedes echar un vistazo en MSDN: http://msdn.microsoft.com/es-es/library/fkytk30f(v=vs.80).aspx y empezar a ver otra opcion que se adapte mejor a tus necesidades

NOTA:
Si quieres algo un poquito mas completo, puedes utilizar el Algoritmo Asimetrico RSA, (hasta donde me acuerdo haber visto en clase, es el mas seguro), el algoritmo utiliza Llave Privada y Llave Publica para desencriptar el contenido (Este algoritmo utiliza Amazon en su servicio de Web Services), lo que hace es q tu puedes darles a todos tu llave Publica, para que puedan encriptarte contenido, y solo tu puedas desencriptar con tus llaves privadas y tu llave publica. Ojo la llave publica solo es para q las demas personas puedan encriptarte y mandarte a ti contenido encriptado. Y las llaves privadas (que solo tu tienes) te sirven para desencriptar. Podrias leer un poquito mas sobre ver como implementar el algoritmo en tu aplicacion.

te dejo un ejemplo que encontre para pasar a XML tu calve privada y publica de RSA:
http://topicos-seguridad.blogspot.com/2009/04/creacion-de-llaves-publicas-y-privadas.html

Gracias por tus soluciones las analizare, es que yo siento que ofuscar el código no sirve de nada porque lo único que hace es cambiar el nombre a las variables y de igual manera podrias obtener facilmente los algoritmos de encriptacion de hecho le pase Dotfuscator que biene con el visual y no hizo grandes cambios.
Visita mi Blog C#, Asp.Net, Python y mas...
http://cristiantorresalfaro.blogspot.com
http://codemania.tk

Desconectado cristiantorres

  • Sv Jr.
  • **
  • Mensajes: 76
  • Bendiciones para todos
    • Blog dedicado a la programacion
Re:Internet Account Manager V1.2 (SOLUCIONADO)
« Respuesta #7 : junio 02, 2012, 09:55:06 am »
Según lo que entiendo, todo lo que se necesita para desencriptar el contenido encriptado con algoritmos de clave privada/pública es:

- La clave privada.
- El contenido encriptado con esa clave privada.

Si se usa un algoritmo de clave privada/pública, y alguien realmente quiere robarse la base de datos, podría:

- Asumiendo que TODOS los datos del usuario están encriptados, y no solo la contraseña: Extraer la clave privada del ejecutable y proceder a desencriptar la base de datos.

- Asumiendo que la contraseña está encriptada pero el resto de los datos estén desencriptados: Simplemente saltarse todo lo que tenga que ver con contraseñas y copiar el contenido desencriptado.

Si alguien está realmente decidido a robarse la información de una base de datos como la de este caso, el principal problema es que cualquiera tenga acceso físico a la máquina. Así no importa que el programa esté ofuscado, porque sería posible extraer la clave privada del ejecutable, o robarse la máquina entera.

El segundo y más serio problema sería dejar todos los datos en cuestión sin encriptar.

Así que para tener verdadera seguridad es necesario asegurarse de que ningún usuario ajeno a la administración "oficial" de la máquina tenga acceso físico a esta.

---------------------------------------------------------------------------------------

Para la contraseña, me parece posible tener buena seguridad convirtiéndola simplemente a un hash, como mínimo MD5, y de preferencia SHA-1, o en el mejor de los casos SHA-2. Así evitamos usar funciones específicas de .NET sobre las que no tenemos control.

MD5 se puede atacar con una técnica llamada "tunneling", que puede encontrar un contenido diferente al original (otra "contraseña") que genera un hash equivalente en cuestión de minutos y que vencería la seguridad.

Así que si se usa MD5 se podría hacer algo como esto, para hacer extremadamente difícil un ataque de "tunneling":

- La contraseña debe validarse para que solamente contenga caracteres A-Z, a-z, 0-9 y símbolos del "alfabeto" inglés.

- La contraseña debe tener un mínimo de 8 caracteres y un máximo de 15 caracteres.


Las dos medidas anteriores también sirven para bloquear cualquier intento de "tunneling" con datos arbitrarios. Así el programa rechazará datos que no cumplan con esa especificación de conjunto de caracteres y tamaño de contraseña, en su forma de texto plano.

---------

Para encriptar la contraseña (Cuando se cree un usuario):

- Concatenar el nombre de usuario con la contraseña. Así la contraseña será dependiente del nombre del usuario y no de la máquina en que se está ejecutando con ProtectedData, que también me parece una opción viable y más estándar, y porteable a diferentes lenguajes y plataformas, no solo a .NET.

- Aplicar o no aplicar, de forma aleatoria, codificación Base64 a la cadena concatenada original.

- Aplicar un hash MD5 repetitivamente sobre sí mismo a esta contraseña en Base64, un mínimo de 4 veces y un máximo de 128 veces.

- Cada vez que un usuario se loguee exitosamente, usar aleatoriamente el resultado de un número de iteraciones diferente del hash MD5. Así incluso la misma contraseña tendrá diferente apariencia de forma constante, lo que debería dificultar un poco más averiguarla.



Para desencriptar (al loguearse):


- Tomar el usuario y la contraseña y concatenarlas.
- Crear una versión de esta cadena concatenanda, en texto plano y codificada con Base64.
- Probar iterativamente cada una de estas cadenas convertidas a hash MD5, con un mínimo de 4 veces y un máximo de 128 veces y comparar cada resultado, hasta encontrar un hash que concuerde con el de la contraseña guardada.



En lugar de usar MD5, podríamos usar SHA-1 y SHA-2 con estos pasos, pero con estas medidas incluso usando MD5 debería ser virtualmente imposible sobrepasar la contraseña. Podrían también estar encriptadas adicionalmente con una clave privada/pública. Aunque para los datos en cuestión sí sería necesario todavía encriptar el resto de datos sustanciales con una o más claves privadas/públicas, y medidas para asegurarse de que estas no puedan ser extraídas por nadie ajeno al sistema.


Hay muchas implementaciones de MD5, Base64 y SHA-1/SHA-2 en JavaScript, C, y seguramente en .NET (incluyendo funciones que ya vienen con Visual Studio), así que se pueden usar si no tenemos implementaciones propias en este momento, y todo lo que quedaría es usar este procedimiento u otro similar más avanzado para asegurar las contraseñas y los datos con estos algoritmos de manera óptima.

Exacto pienso igual que tu cuando se encriptan datos para desencriptarlos necesitas la clave que se uso para encriptar y desencriptar los datos y el algoritmo, pero para hacer esto quien quiera desencriptar los datos necesita tener los datos de la bd, asi que tambien ahi es responsabilidad del usuario no tener la bd en un lugar que puedan acceder fácilmente otros usuarios.

Y por las demas recomendaciones gracias las tendre en cuenta y las analizare.
Visita mi Blog C#, Asp.Net, Python y mas...
http://cristiantorresalfaro.blogspot.com
http://codemania.tk