lunes, 11 de marzo de 2013

Fortaleciendo protección de passwords en C#

Introducción

En la actualidad infinidad de paginas webs así como aplicaciones que requieren de un sistema de cuentas de usuario, para esto utilizan bases de datos para almacenarlas, pero acaso hace un buen trabajo al diseñar la manera que en que se tienen que proteger los passwords de los usuarios?, vemos que el peor error que se puede cometer es guardarlas en texto plano, para esto existen muchas y muy variadas formas de cifrar las contraseñas, que muchas veces por ser nuevos o no conocer las tecnologias no somos capaces de hacerlo correctamente, primero se tiene que conocer que los neologismos erroneos que decimos en español de ecriptar y desencriptar no se deben utilizar, se tiene que hablar correctamente sobre lo que se esta tratando, para esto como mencione antes lo correcto seria cifrar y descifrar, teniendo en cuenta esto, ahora nos debemos preocupar por otra cosa que es la seguridad de nuestras aplicaciones, muchas veces las diseñamos pero olvidamos esta parte, que muchas veces por falta de experiencia se comenten estos errores, pero claro crear software no es relativamente sencillo pero sobre la marcha se aprende, se tiene que buscar muchos medio y tener mucha lectura para aprender como se hace esto de manera correcta.

Forma general de protección utilizada

Se propone un ejemplo, para un pagina web, hecha en php y html, se incrusta un panel de logeo de usuario, este que como minimo se esta protegiendo contra ataques de tipo injecion sql, cross-site scripting u otro tipo de ataque, este tiene que tener un metodo de validado de usuarios, en el cual se valida el usuario y contraseña si tienen el formato correcto, despues de esto se mandan al servidor para que este regrese cierta informacion, ahi es donde se comente otro error ya que siempre y siempre se tiene que validar del lado del servidor, ya que aunque se tengan varias protecciones hay otros tipos de ataques que se pueden utilizar, como el famosisimo man-in-the-middle, que intercepta la comunicacion y aqui el atacante puede manipular la informacion a su favor, por esto es muy recomendable validar del lado del servidor, que anteriormente no se hacia ya que no se daban demasiado ataques, pero es mejor preparase contra todo y no esperar a que se presente un ataque de este tipo.

En muchos casos las paginas web son atacadas y por ende van contra la base de datos, por esto se tiene que tener un sistema de proteccion de passwords que sea muy enficiente contra ese tipo de ataques ya que si llegan a vulnerar la base de datos tendran el control total del sistema y demas partes, bien, entonces cuales son las formas mas habituales que utiliza la gente maliciosa contra estos sistemas?.

Hashing de passwords

Antes de hablar mas de esto, se hablara de el hashing de passwords que como sabemos es el cifrado de  los passwords o algun tipo de informacion que se tiene alamacenada y no se quiere que se conozca su contenido, cuando se utiliza algun algoritmo de cifrado, nos da como resultado un hash correspodiente al contenido que se le dio por entrada, la idea es que este no se puede reversear, en otras palabras, si alguien estudia el algoritmo MD5 por ejemplo, y conoce como es el proceso de crifrado es no se puede regresar ya que los algoritmos de cifrado son para eso, solo hay una salida y no se puede tener el valor de un password atraves de su hash, entonces muchas personas que estan a cargo de un sistema de cuentas de usuario utilizan distintos algoritmos para crifrar sus passwords entre los mas debiles actualmente son los SHA-1 y MD5 que sabemos que hoy en dia hay muchas maneras que crackear los passwords, ya que como se habia dicho estos no se pueden regresar a su estado original desde su hash pero, hay formas de crackear los passwords que se explicaran a continuacion.

los dos cifrados son para: "hola"

MD5: 4d186321c1a7f0f354b297e8914ab240
SHA1: 99800b85d3383e3a2fb45eb7d0066a4879a9dad0

Tipos de ataques

Ataques por diccionario
Estos ataque son muy comunes pero que siguen siendo muy eficientes a la hora de crackear passwords, el ataque por diccionario es donde la persona maliciosa hace un gran numero de consultas donde por medio de un diccionario pre-construido se prueban muchos passwords comunes y creados para ver si algunos es el real, son diccionarios que contienen muchas palabras, fraces que se prueban para sabes si alguno es el correcto.
Ejemplo de un diccionario:

luis
pedro
p4dro
comida
root
toor
password
123456
y asi una lista enorme

Fuerza bruta
Este ataque tambien aunque lento pero sigue siendo efectivo, este consiste en ir formando fraces o palabra y provarlas, por ejemplo:
a
aa
ab
aba
abb
abba

y asi se van creando una combinacion de muchas cadenas las cuales si se tiene paciencia y mucho tiempo puede que funcionen.

Tablas de busqueda (lookup tables)
Esta forma de crackear passwords tambien es muy efectiva aqui lo que se crea son una gran cantidad de hashes de muchos passwords que se tienen, este metodo es muy agil cuando ya se conoce que tipo de cifrado se tiene para guardar los passwords en la base de datos, por ejemplo en md5, si se ah vulnerado la aplicacion y se ve que los passwords son guardados con este metodo de cifrado, entonces se crear muchas cadenas cifradas con md5 y se van provando, por ejemplo un diccionario de md5: 

4d186321c1a7f0f354b297e8914ab240
dd485e41f1758def296e1bc7377f8ea7
622798bed7c24ae5977c1503d2d5571e
465b1f70b50166b6d05397fca8d600b0


Tabla de busqueda inversa (reverse lookup table)
Encontramos este tipo de ataque tambien sumamente efectivo, esta se basa como su nombre lo dice en la inversa de la anterior esta en lugar de buscar que hash de algun password en la base de datos, esta utiliza el hash de un password y busca todos lo usuarios que contengan este password, ya que hay muchos casos en los que las personas utilizan el mismo password y aunque suene un poco no cuerdo, realmente pasa en la vida real, un ejemplo seria este:

password -> 5f4dcc3b5aa765d61d8327deb882cf99 -> se busca en la tabla de users todos los usuarios que tengan ese hash de contraseña

Tablas arcoiris (rainbow tables)
Estas son tablas que utilizan un algoritmo de reduccion, no lo voy a explicar ya que tomaria un tiempo, pero puede que despues haga un articulo, por el momento nos centraremos en lo que estamos, entonces las rainbow tables tambien son muy efectivas compensan el tiempo de crackeo y la velocidad y memoria de una computadora, como lo que dije anteriormente no esta muy claro aqui lo explico, las rainbow tables son enormes cantidades de hashes o palabras, ya que lo que se hace es tener una combiacion muy basta de alguna palabra que se toma poniendole cualquier tipo de caracter como un ejemplo pongo:


contraseña     ------>   4c882dcb24bcb1bc225391a602feca7c
c0ntraseña     ------>   1d87c04b17b5f45dab56968823a50e76
contraseñ@   ------>   a4f93311c837fc944cd22e786392aa34 
C0ntr4s3ñ@ ------>    a77c4d12d8fdece0d6e902f821c63f40

Necesitamos ayuda!

Bien, vemos que existen muchos tipos de ataque que nos tomarian por sorpresa si no sabemos como defendernos correctamente, entonces vamos, necesitamos ayuda de algo o alguien para fortalecer el crifrado de las contraseñas, para eso vamos a hacer uso de un SALT o SAL,

SAL (salt)

Esta es una entrada de la funcion derivadora de claves y la otra es la contraseña o password y la salida de la funcion es la version cifrada de la misma, en otras palabras es la combinacion de un sal con una contraseña para fortalecer el hash de password, un ejemplo?:

password + YYLmfY6IehjZMQ =  77653244c6961112e659dc6bf496340c

Como se muestra en el ejemplo esa seria la manera de usar un Salt para fortalecer el cifrado de una contraseña, ahora viene otra cuestion.

No hacerlo de manera incorrecta

Vemos que el Salt se agrega a la contraseña para fortalecer su cifrado, pero antes de utilizarlo se debe tener en cuenta algunas cosas.
-No utilizar un Salt corto.
-No utilizar el mismo Salt para varias contraseñas.
-No inventar propios Salt's
Otra cosa que se debe de tener en mente es no combinar varios hash, con esto se genera la idea erronea de que el password es mas seguro por ejemplo:
sha1(md5+salt)
esto es una mala practica, puede que muchos digan que es segura pero como ya se vio arriba hay formas de crackear estos cifrados.

Finalmente la manera correcta de cifrar passwords en C#

Llegamos a la parte mas interesante que es la de como vamos a cifrar los password de manera correcta?, entonces primero debemos generar un Salt seguro, como se menciona anteriormente no se debe inventar un propio Salt, se debe de utilizar algoritmos diseñados por expertos que por algo los diseñan, asi que no se den la tarea de hacerlo en casa, je, bueno continuando para generar un Salt en C#, se utiliza el algoritmo: Criptographically Secure Pseudo-Random Number Generator (CSPRNG), que como su nombre lo dice es criptograficamente seguro ademas de su alto nivel de aleatoriedad que proporciona, y no es para nada facil predecir la forma es que se generan los numeros, ya que tenemos la funcion de generacion de la Salt vamos a ver como implementarla en codigo:

En C# ya esta implementada en la libreria de System.Security.Criptography la funcion de derivacion de claves que se va a ocupar, que es la PBKDF2 por sus siglas (Password-Based Key Derivation Function 2), un poco de historia, es que forma parte de los laboratorios RSA y de los estandares de criptografìa de clave publica, PBKDF2 aplica una funcion seudo-aleatoria que requiere de una entrada mas la salt, repite el proceso varias veces para producir la clave derivada que tambien se conoce como clave de estiramiento, el numero de iteraciones que se recomiendo es del minimo 1000.

PROCESO DE DERIVACION DE LA CLAVE:

Cgd = PBKDF2 ( FSA, Password, Salt, I, Lcd)

Cgd = Clave generada derivada
FSA = Funcion Seudo-Aleatoria de longitud con dos parametros de salida
Password = Contraseña
I = Numero de iteraciones
Lcd = Longitud deseada de la clave derivada

Código para generar:



Código de comprobación un Hash:


los dos códigos se crean en la misma clase.

El hash que me da para:

contraseña = smj1FNyXjxnRUkaOEe7fT75GSWWerfow

si lo hace a ustedes les va a dar otra cosa, ya que se usa un Salt diferente cada ves que se ocupa.

Conclusiones

Hemos visto la forma en que se cifran las contraseñas para que sean mas seguras, pero muy aparte de eso tambien se deben de tomar muchas medidas mas de seguridad, esto se explico con el fin de fortalecer los hashes de los passwords, ya que muchos programadores crean bases de datos, pero no estan muy seguros o no saben como implementar la parte de seguridad adecuadamente, vemos que agregandole un Salt a un password este lo hace mucho mas fuerte, encontra los ataques descritos anteriormente seria muy dificil computar el hash correcto, ya que los Salts son diferentes para todos los passwords, al final del dia la seguridad no solo se basa en la fortaleza de un hash de un password sino del trabajo en equipo que se crea atraves de un conjunto de aplicaciones y herramientas para asegurar la informacion con su constante actualizacion y tambien en el de concientizar a nuestros usuarios e integrantes de equipo a utilizar de manera correcta las herramientas.

jueves, 7 de marzo de 2013

Como instalar y conectar Mysql con C#

Recientemente vi este problema en un conocido que me dijo que en el post que muestro como conectar mysql con c#, pongo el codigo pero no pongo de donde instalar ni como conectar, para esto hago este post, bueno aqui vamos

De seguro tienen mysql ya instalado en su maquina atravez del Wamp, Xamp, AppServer o algun otro, ahora lo que tenemos que hacer es instalar el conector que hay para C# desde la web oficial, aqui:

http://dev.mysql.com/downloads/connector/net/

Bien lo descargamos y lo instalamos, despues vamos a nuestro proyecto de C# en el Solution explorer en nuestro proyecto en la parte donde dice References damos click derecho y Add reference:


De ahi nos vamos a .NET buscamos el conector y listo! ya podremos trabajar con mysql y C#


Es pequeño el tutorial pero a muchos de seguro que les va a servir!
saludos!.

viernes, 11 de enero de 2013

Comunicar un Form con otro Form

Este es un ejemplo de como puedes pasar argumentos y comunicar desde un Form a otro, bueno comencemos.

Primero explico lo que se va realizar en el ejemplo, se va a crear un Form llamado Padre este es un formulario normal que para entrar al sistema en mi ejemplo tienes que logearte, esto implica abrir otra ventana para el logeo, que sera el segundo Form llamado LogeoHijo, que se podria hacer en la misma ventana pero para efectos de este ejemplo lo hare asi.

Primero crearemos nuestro proyecto, yo lo llamare Padre


Le pondre un label y un boton para que se vea bien!,



Bien ya tenemos el Form Padre que tiene 2 labes en las flechitas que cacharan el texto que les envie el otro Form y el boton que llamara al otro Form, ahora creamos el otro Form que yo lo llamare como dije anteriormente LogeoHijo:


Bien ya lo tenemos aqui:


Y medio la decore pero seguimos, ahora ya tenemos los Form el Padre y el LogeoHijo, pero como los vamos a comunicar?, para eso tenemos que crear una interfaz que nos va a ayudar con la comunicacion yo la llame IComunica:


Bien, entonces nos refresamos al primer Form y damos doble click sobre el boton para administrar su evento:


Bien este boton es el que va a mandar a llamar al otro Form y lo crearemos asi:


Tambien debemos de crear un metodo aqui en este Form para setear o establecer los valores a los label's:



ya que este metodo es el que va a establecer los valores el los labes, pero para que este se pueda mandar a llamar tenemos que agregar la interfaz IComunica al Form Padre:


Ya esta, a continuacion agregamos el metodo a la interfaz, en mi caso el metodo se llama SetLabes:


si no le van entendiendo no se preocupen explico con calma ya que tengamos todos los elementos creados, bien, ya tenemos la interfaz que va a conectar al Form Padre, ahora procedemos a comunicar el Form que en mi caso se llama LogeoHijo, de esta forma:



el this.owner, se utiliza para decir que este Form es hijo del otro y que pertenece a el Form padre, bien si ejecutamos esto vemos como al cerrar el segundo Form el hijo, ya estan los datos en los labels del Form padre:


vemos que se ha completado exitosamente, en mi caso se queda abierto el segundo Form, pero ya saben que le pueden agregar un this.close(); para que al final del metodo cuando ya envie los datos se cierre, pero como dije ahi es de cada quien, espero que les sirva y pueden dejar sus quejas jeje o comentarios.

Saludos

Mi punto de vista de las interfaces

Que tal!, creo que a mas de uno les habra pasado que lo estan aprendiendo en la escuela o tal vez por su cuenta ahi es de cada quien, pero comienzan a estudiar las interfaces en C#, en mi experiencia la primera vez que las vi dije ¡y esto como para que sirve!, pero con el paso del tiempo se me han hecho muy utiles, y una vez le pregunte a un amigo, 'oyes para que sirven las interfaces?' y me dice que los metodos declarados en una interfaz se tienen que cumplir afuerza, osea como?, si que si tu tienes una clase por decir, la clase Principal, y ahi tienes metodos y todo eso, puedes declarar una interfaz llamada IPrincipal en la cual vas a tener los metodos de Principal declarados, asi cuando desde otra clase quieras llamar a los metodos de Principal. invocando solo la interfaz, lo puedes hacer y asi no accedes a todo el codigo de la clase Principal, esto es como un metodo de seguridad para no exponer codigo extra y no necesario.

Como abrir un form desde otro form en C#

Tenia la idea de hacer este y otro post en uno solo, pero creo que para lo que son nuevos en el lenguaje necesitan entender esto, y es que cuando uno esta trabajando con Form's en C# en ocaciones se necesita hacer mas de uno, pero y como abrir uno y luego otro y asi?

La idea base es esta:

Cuando tu creas un proyecto de Windows Form, y se crea el primer Form, ese es el Form padre que vas a utilizar como base, en otras palabras, ya ahi tu puedes ir creando mas Form's pero el que los va a mandar a llamar y administrar es el primer Form creado, por eso es el padre, y todos los consecuentes son lo Form's hijos, que puedes mandarlos a llamar entre ellos pero siempre estableciendo que el primer Form es el padre.

Supongamos que estas en el primer Form y creaste otro Form llamado por ejemplo "login" y lo vas a mandar a llamar desde el primer Form, entonces seria con esto:

Login logeo=new Login();   -> aqui creas la instancia del segundo Form
logeo.show(this);                 -> aqui le dices que se muestre ese Form

Esto no es nada del otro mundo pero si debes de tener en mente que si intentas llamar al Form padre desde el hijo, si se va a poder pero cuando cierres este Form como es el padre, se destruira todo lo demas cerrando al Form hijo de donde lo llamaste tambien, ya que el control lo tenia el padre.

Lee lo siguiente si quieres si no puedes regresar a lo que estabas haciendo, bueno es que queria comentar que esto me paso una ves en la escuela, que con otro compañero mio estabamos haciendo formularios en distintos forms, pero veia que a el si le agarraba y a mi no, ahh, esa ves me enoje mucho, y creo que a mas de uno le habra pasado y pasara, pero de ahi aprendes de los errores terribles que cometes, espero les sirva.

Saludos.

miércoles, 2 de enero de 2013

Mejor forma de conectar a MySql desde C#

Me propuse a escribir esto porque muchas veces tratamos de usar archivos, el los cuales hay que hacer la conexión, abrirlos, tratarlos, y cerrar la conexión, de momento aquí solo me limitare a hablar sobre cuando uno hace la conexión a mysql desde una aplicación C#, pero se aplica para toda metodología que trate con archivos externos, recursos de red, etc., que de seguro mas de uno lo hecho mas de una vez, entonces cual es la forma que nos enseñan en la escuela o vemos el los post o foros?, me atrevo a decir que es esta:

Aclaro: usado el motor MySql y legunaje de programación C#

En este ejemplo es cuando lees datos

// se crea la cadena de conexion con las credenciales necesarias
string CadenadeConexion="Server=localhost;Database=base1;UID=user;
Password=root";
// se crea una nueva conexion hacia el gestor de base de datos
MySqlConnection conexion=new MySqlConnection(CadenadeConexion);
// se abre la conexion
conexion.Open();
// se crea un comando
MySqlCommand cm=new MySqlCommand();
// se establece el comando
cm.CommandText="Select * from tabla";
// se crea un adaptador
MySqlAdapter ad=new MySqlAdapter();
// se crea una tabla que recibira los datos
DataTable ds=new DataTable();
// se llena la tabla
ad.Fill(ds);
// se cierra la conexion
conexion.Close();

Este es un tipico ejemplo sobre como trabajar con Mysql y C#, entonces los inconvenientes son los siguientes:

1.-Para comenzar que se pueden generar excepciones que el codigo anterior no puede manejar, lo recomendable es poner un try y catch, ya que este cachara la excepcion, tambien es conveniente imprimir la exception para saber donde fue.

2.-En algunos casos hay que mantener abierta la conexion para ejecutar varias consultas y cerrar la conexion al final esto consume mas recursos de los necesarios.

3.-Puede que tengas un boton de salir y este al mismo tiempo cierre la conexion, si esto ocurre algunas veces dan click en cerrar ventana y se queda abierta la conexion.

  *la mas importante*
4.-El CLR libera automaticamente la memoria para almacenar objetos que ya que ya no son necesarios y la liberacion de memoria no es DETERMINISTICA y estos se liberan cuando el CLR decide realizar que elementos no son utilizados, entonces cuando utilizamos conexiones a la base y utilizamos variables, guardamos valores y todo esto, se liberan hasta que el recolector del CLR lo decida.

hay otra forma de hacer esto y teniendo menos problemas a continuacion pongo el codigo:

string ConString = @"Server=" + se + ";Database=" + da + ";UID=" + us + ";Password=" + pa;
using (MySqlConnection cn = new MySqlConnection(ConString))
{
try
{
cn.Open();
 }catch{}
// comandos y ejecuciones
}

Esta es la forma que recomendable ya que con el uso de la directiva USING todos los elementos que se utilicen dentro y creados ahi se liberaran cuando termina y salga del using.

Ventajas:

1.- Se liberan los objetos utilizados cuando termina las instrucciones de using y sale.

2.- Solo se utilizaran los recursos necesarios cuando se ejecuten.

3.- En el uso de archivos, conexiones a red, bases, etc. es recomendable, ya que estos servicios siempre estan corriendo y sus recursos son limitados y se requiere una administracion optima.

Espero que le sirva saludos.

viernes, 21 de diciembre de 2012

Estilos de etiquetas en PHP

La verdad es que ya tenia ganas de escribir sobre esto, ya que casi no eh visto algo relacionado, el caso es que si programas web en php, o apenas comienzas a programas es bueno que sepas esto, no se si el titulo sea el apropiado pero ya leyendo esto te daras cuenta porque, cuando programas en php, que me imagino previamente que ya sabes que es un lenguaje del lado del servidor y eso, que para escribir codigo php lo tienes que encerrar entre "<?" y "?>", bueno y te preguntaras aja y eso que?, estare escribiendo articulos en los cuales yo no te enseñare a programar, ni nada de eso, solo me limitare a explicar algunas cosas que creo que son necesarias saber, si quieres aprender a programar en php y eso busca algunos tutoriales, ya que en la red hay muchos, bueno volviendo al tema he dejado claro que ya tienes que saber algo del lenguaje, y con esto les platico esto, que en php hay 4 formas o estilos de etiquetas en los cuales vas a poder escribir codigo php, y diras para que?, es bueno saber los distintos modelos o estilos que hay en php para que si tienes un pagina enfrente y no funciona en cierta parte sepas que es lo que esta pasando, asi pues a continuacion os mostrare los 4 estilos que conozco para escribir php:

Estilo corto:

<?
codigo php
?>

Estilo XML

<?php
codigo php
?>

Estilo Scripting

<SCRIPT LANGUAGE='php'>
codigo php
</SCRIPT>

Estilo ASP

<%
codigo php
%>

Estan son la 4 formas que conozco para escribir codigo php, la primera que es utilizada por la mayoria es la manera corta de escribir php, ademas de es mas eficiente, pero bueno de ahi sigue el estilo Xml que como su nombre lo dice, es cuando utilizas documentos Xml en tus paginas web, para esto tienes que utilizar este tipo de estilo, asi pues tambien esta el estilo scripting que no es mas que definir el lenguaje en un script, para que puedas utilizarlo, y por ultimo esta el estilo ASP el cual se adapta a diseños ASP.

En lo personal trabajo con el segundo el estilo Xml, pero como mencione arriba cada quien se adapta y utiliza el que mejor le convenga y quiera, por si tienen algunos problemas al escribir php en sus distintos estilos aqui pongo como hay que configurar el archivo php.ini para utilizarlos:

Para poder utilizar el primer estilo que es el corto necesitamos activar esta opcion en el archivo php.ini que esta en vuestra carpeta donde tengan instalado el php, asi que ya que tenga el archivo lo abren con cualquier editor de texto en mi caso lo hice con el bloc de notas, ya hecho esto nos situamos en la parte donde dice:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Language Options ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

y buscamos la parte que dice:

short_open_tag = Off

bueno en mi caso la tenia en off pero hay que activarla con ON guardar los cambios y listo, pasamos a la segunda opcion que es por default, no hay que habilitar nada asi que podermos utilizarla normalmente, asi que vamos a la tercera que en su caso tampoco hay que habilitar nada basta con declarar con habeis hecho anteriormente y listo, pero sin en cambio tambien esta la 4 y ultima en la cual si tenemos que ir tambien al archivo php.ini, situarnos como el anterior en la parte de Language Options y buscar la parte:

asp_tags = Off

en mi caso tambien la tengo deshabilidata, pero basta con ponerla en modo ON y listo tendremos habilitado el estilo asp

Esta referencia que mas que nada es eso una referencia, ya que algunas veces uno tiene alguna duda como esta y ahi nadie que te diga que cosa ah pasado, espero les haya servido, que lo dire de nuevo son cosas pequeñas pero que es bueno saberlas.