Mostrando entradas con la etiqueta C#. Mostrar todas las entradas
Mostrando entradas con la etiqueta C#. Mostrar todas las entradas

miércoles, 28 de noviembre de 2012

Tips – Concatenar cadenas con String.Format

Últimamente he notado muchas cosas que en realidad no me agradan, he tenido que realizar algunas revisiones de código y he notado unas cuantas malas prácticas, una de ellas es la que expongo a continuación:
   1: TxtBoxUser.Text = login + " / " + firstName + " " + lastName;
Si bien funciona, no es precisamente lo más elegante, en estos casos es mejor usar otra forma de concatenar esta información, como por ejemplo el uso del método Format de la clase String.


   1: TxtBoxUser.Text = String.Format("{0} / {1} {2}", login , firstName, lastName);
Esto da una apariencia más elegante al código, y luce más profesional. Es importante tener en cuenta que si bien el código fuente no esta visible al público es muy importante realizar un trabajo de calidad, ya que al fin de cuentas somos profesionales, y entre mas alto el nivel, nuestro código debe ser más elegante y limpio.
Nunca se sabe cuando nos van a realizar una revisión al código, y es mejor sobresalir por la calidad de este y no por la mediocridad del mismo, al fin de cuentas esta es nuestra carta de presentación.

lunes, 22 de octubre de 2012

Microsoft Enterprise Library – Data Access Application Block I

Esta es la primera entrega de la serie de post que tratara el tema de Enterprise Library, en este caso cubriremos lo relacionado a la capa de datos.

En este primer post nos atañe preparar los requisitos previos para nuestra aplicación, que en este caso hacen referencia a la creación de la base de datos que vamos a utilizar en esta serie de post, así como los demás componentes que vamos a necesitar.

Manos a la obra

En este caso vamos a trabajar inicialmente con una base de datos en SQLServer, mas adelante usaremos una base de datos en Oracle. Para nuestro ejercicio, vamos a usar la base de datos Northwind, la cual puede ser descargada desde la página de la comunidad.

Por otra parte vamos a necesitar la última versión de Enterprise Library que a este momento es la 5, la cual podemos obtener en la página oficial.

Una vez descargado el script, debemos inicia sesión en la base de datos con privilegios de administrador con el fin de crear nuestra base de datos, una vez allí, abrimos el script y lo ejecutamos.

image

Aquellos que como en mi caso usan SqlServer 2012, van a encontrarse con el siguiente error:

Error1

Esto es debido a que en la versión SQLServer 2012 no esta soportado el uso de sp_dboption, según se puede ver en la página oficial, se debe optar por el uso de ALTER DATABASE.

Entonces, debemos remplazar las líneas:

exec sp_dboption 'Northwind','trunc. log on chkpt.','true'

exec sp_dboption 'Northwind','select into/bulkcopy','true'

por las siguientes:

ALTER DATABASE Northwind SET AUTO_SHRINK ON

ALTER DATABASE Northwind SET RECOVERY SIMPLE

Una vez se realiza el cambio y se ejecuta el script ya tenemos la base de datos creada, solo resta crear un usuario para trabajar con nuestra base de datos.

CreateDatabaseOk

DatabaseTree

Como vemos ya contamos con una base de datos apta para nuestras pruebas. Con esto, mas la instalación de Enterprise Library 5, ya tenemos las bases para realizar los ejemplos propuestos en esta serie de post.

lunes, 8 de octubre de 2012

Microsoft Enterprise Library 5

Microsoft Enterprise Library es una biblioteca compuesta por un conjunto de componentes de software reutilizables, que se encargan de las tareas mas comunes en lo que a temas transversales concierne.

Estos bloques de aplicación son una especie de guía que nos indica la forma mas adecuada de realizar dichas tareas, estos bloques están acompañados por respectivos ejemplos de uso, y pueden ser fácilmente ampliados para utilizarlos en proyectos complejos de nivel empresarial o en proyectos de línea de negocio.

Dicho de una forma más simple, son componentes que han sido desarrollados basándose en los mejores patrones y en las mejores prácticas de desarrollo de software, y que ofrecen las soluciones más adecuadas para situaciones tan comunes como un log, o un componente de acceso a datos.

Esta pensado con el fin de hacer las cosas mas fáciles a las personas envueltas en labores de desarrollo ya que estos componentes ya encapsulan dentro de si todas las funcionalidades necesarias, lo que se traduce en un ahorro significativo de tiempo y esfuerzo, permite la reutilización de componentes y al mismo tiempo garantiza un buen nivel de estandarización en los desarrollos.

Actualmente Enterprise Library en su versión 5 cuenta con los siguientes bloques de aplicación.

  • Caching Application Block. Esta pensado para brindar funcionalidades de manejo de cache.
  • Cryptography Application Block. Brinda funcionalidades de criptografía, tal como algoritmo de Hash, etc.
  • Data Access Application Block. Contiene funcionalidades pensadas para facilitar el acceso a bases de datos.
  • Exception Handling Application Block. Brinda funcionalidades para el manejo avanzado de excepciones a través de toda la aplicación.
  • Logging Application Block. Tiene como finalidad aportar funcionalidades que faciliten el manejo avanzado de Logs en las aplicaciones.
  • Policy Injection Application Block. Este bloque de aplicación se puede utilizar para implementar políticas de interceptación para agilizar la implementación de características comunes, tales como la explotación forestal, caching, manejo de excepciones, y validación, a través de un sistema.
  • Security Application Block. Permite implementar las tareas correspondientes a la seguridad transversal de las aplicaciones.
  • Unity Application Block. Es un contenedor de inyección de dependencias ligero y extensible con soporte para constructor, propiedades, e inyección.
  • Validation Application Block. Contiene funcionalidades que permite implementar reglas de validación de negocio para los objetos de negocio, las cuales pueden ser usadas a través de las diferentes capas de la aplicación.

Como pueden ver, es una biblioteca muy completa e interesante, y aporta gran cantidad de funcionalidades que nos van a permitir llevar nuestros desarrollos a otro nivel.

Con esta premisa en mente, se da inicio a una serie de post en los cuales se trataran los diferentes bloques en mas detalle, de la mano de un pequeño proyecto, en el cual se espera hacer uso de estos con el fin de demostrar como podemos aprovechar esta maravillosa herramienta.

Para aquellos que deseen profundizar mas en el tema les recomiendo visitar la pagina de Patterns & Practices de Microsoft.

martes, 25 de septiembre de 2012

Control de versiones con Team Foundation Server Express 2012

 

VS2012

La gestión del control de cambios es un tema que normalmente preocupa a todo equipo de desarrollo, en la actualidad existen diferentes aplicaciones para ejercer dicho control, unas mas completas que otras, algunas de ellas de pago, otras libres.

En el caso de aquellos que desarrollamos con herramientas de Microsoft, estamos más que acostumbrados al uso de Team Foundation Server para este fin, pero esta herramienta esta pensada para grandes desarrollos, donde se cuenta con un equipo de trabajo de tamaño considerable, y dado su precio no es fácil para un desarrollador novel acceder a él, por lo que para proyectos pequeños terminaban decantándose por otras opciones como puede ser GIT.

La buena noticia es que ya tenemos a disposición una versión Express de Team Foundation, llamada Team Foudation Server Express, la cual nos va a permitir llevar el control de código de nuestros proyectos personales o pequeños proyectos para los cuales no contamos con los recursos necesarios para implementar un entorno mas complejo.

El primer punto a favor es que hace uso de Sql Server Express como repositorio, lo que es genial para el presupuesto.

Una de las cosas más destacables de esta versión es que permite ser utilizada con las versión Express de Visual Studio, lo que nos permite montar un entorno 100% free con productos Microsoft, aunque esta limitado a 5 usuarios.

En esencia cuenta con las mismas características de un TFS en instalación básica, y puede correr en los siguientes sistemas operativos:

  • Windows 7 (x86 and x64)
  • Windows 8 (x86 and x64)
  • Windows Server 2008 R2 (x64)
  • Windows Server 8 Beta (x64)

Y cuenta con las siguientes limitaciones:

  • No cuenta con integración con SharePoint y no incluye reporting.
  • Está limitado a 5 usuarios.
  • Solo soporta SQL Server Express
  • La única arquitectura de deployment soportada es la de Servidor único, es decir no soporta deployment en varios servidores.
  • No tiene TFS Proxy.
  • Incluye el Dashboard de Agile, pero las herramientas de planning no están habilitan.

No hay licenciamiento con esta edición del producto por lo que puede ser utilizado por un equipo pequeño de manera gratuita teniendo en cuantas las limitaciones comentadas anteriormente.

Esta disponible para su descarga en la página de TFS de Microsoft.

lunes, 23 de julio de 2012

Personalizando el control Menú de ASP Net - Modificando la Flecha

En algunas ocasiones se presentan proyectos que no revisten una complejidad alta, por tanto se planean en tiempo record, además de tener limitaciones de presupuesto, este tipo de situaciones no permite recurrir a nada que revista complejidad en su implementación, es en esos casos cuando se recurre al uso de los controles básicos que trae ASP Net.

En esta ocasión, se hizo necesario el uso del control Menú que viene de serie con Visual Studio, lo particular de la situación es que según el esquema de colores que se planteo suponía un pequeño problema, y es que la flecha que usa el control Menú para indicar que un elemento tiene subelementos es de color negro por defecto.
Manos a la obra:

Si bien no hay mucha información al respecto, la susodicha flecha resulto ser un recurso incrustado en el control, de manera que el primer paso es conseguir la imagen original para conocer sus características.
SaveArrow

Una vez hemos guardado copia de la imagen procedemos a revisar las propiedades de esta con el fin de obtener mas información sobre ella.

PropiedadesMenuArrow

Como se puede observar se trata de un GIF de 15 x 15 pixeles, con profundidad de 8 bits. El siguiente paso consiste en crear una imagen totalmente transparente para el menú estático, y modificar la flecha existente cambiando su color de negro a gris claro para los ítems dinámicos.

En este punto es necesario el uso de alguna herramienta de diseño grafico, en mi caso usare GIMP, que además de ser Open Source es sencillo de usar e instalar, ya que no dispongo de las horas necesarias para la instalación que requeriría otros productos.

Abrimos GIMP y creamos una nueva imagen, en la ventana de propiedades definimos las opciones de la siguiente forma:

CrearNuevaImagen
ImagenNueva

Una vez tenemos nuestra transparencia, la exportamos como GIF.

Transparencia
Exportar

Ahora solo resta cambiar el color de la flecha existente para que quede de color gris, para ello abrimos la imagen en GIMP, ampliamos la imagen para poder manejarla mejor, seleccionamos la herramienta de rellenado Relleno , seleccionamos el color blanco.
SelColor

Ahora, señalamos el área de color negro y voila… ya quedo… se ve gris gracias al ajuste de Umbral.

GrayArrow
Umbral

De esta forma ya tenemos listas nuestras imágenes, ahora procedemos a vincularlas a nuestro menú, tal como se ve a continuación:

   1: <asp:Menu ID="Menu" CssClass="menu" runat="server" DynamicHorizontalOffset="2" Orientation="Horizontal"
   2: StaticSubMenuIndent="10px" DynamicPopOutImageUrl="~/Images/MenuArrowGrey.gif"StaticPopOutImageUrl="~/Images/Trasparency.gif">
   3: <StaticSelectedStyle CssClass="staticSelectedStyle" />
   4: <StaticMenuItemStyle CssClass="staticMenuItemStyle" />

Para ello basta con asignar a las propiedades StaticPopOutImageUrl y DynamicPopOutImageUrl las rutas de las imágenes y ya tenemos el menú de acuerdo a los requisitos.

CustomMenu


Como se puede observar, los ítems estáticos ya no tienen la flecha, y los subitems la tienen de color gris, tal como requería.

El proceso es en realidad sencillo, la manipulación de las imágenes no representa mayor dificultad, y me permite alcanzar mis objetivos sin mayor dificultad.

miércoles, 4 de julio de 2012

Brindando seguridad a nuestras aplicaciones

Son muchas las ocasiones en que necesitamos implementar mecanismos de seguridad confiables en nuestras aplicaciones, sin que sean excesivamente complicadas o difíciles de desarrollar. En esta ocasión voy a implementar una solución basada en hash, usando para ello las utilidades de encripción aportada por el Framework de .NET

Este tipo de mecanismos ofrecen un buen nivel de seguridad a nuestras aplicaciones, ya que las hash son de tamaño fijo, y pueden representar una gran cantidad de datos. Sumado a ello cualquier cambio que se realice en los datos ocasionan grandes cambios imprevisibles en el valor hash

En esta guía utilizaremos el algoritmo SHA1, el cual es de 160 bits. Este mecanismo esta pensado como una solución para manejar las contraseñas de usuarios, pues se buscaba un mecanismo que garantizara que no hubiese forma de descifrar las contraseñas.

Así en lugar de almacenar una contraseña cifrada, se almacena la hash de dicha contraseña. Esto significa que la contraseña es irrecuperable, lo que garantiza un buen nivel de seguridad pues aun cuando la información sea sustraída no hay posibilidad alguna de recuperar las contraseñas.

Servicios de Criptografía

En .Net los servicios de criptografía están definidos en el namespace System.Security.Cryptography, el cual provee mecanismos de codificación y decodificación de datos, además de otras operaciones tales como hashing, generación números aleatorios, y mensajes de autenticación.

Manos a la obra

El siguiente es el método que obtiene la hash:

   1: public string GetSHA1(string data)
   2: {
   3:     SHA1CryptoServiceProvider Sha1 = new SHA1CryptoServiceProvider();
   4:     Byte[] buffer;
   5:  
   6:     //Convertimos la cadena en un arreglo0 de bytes
   7:     buffer = Encoding.ASCII.GetBytes(data);
   8:  
   9:     //Obtenemos la hash, y la codificamos en base 64 para evitar caracteres no soportados
  10:     return Convert.ToBase64String(Sha1.ComputeHash(buffer));
  11: }

Como se puede ver es bastante sencillo de implementar, si se desea elevar el nivel de seguridad se puede cifrar la contraseña antes de calcular la hash. En mi caso esta ultima ha sido la solución implementada.


Etiquetas de Technorati: ,,,

Cifrado con Triple DES


Triple DES es el algoritmo que hace triple cifrado del DES, también es conocido como TDES o 3DES, fue desarrollado por IBM en 1978.

Cuando se descubrió que una clave de 56 bits no era suficiente para evitar un ataque de fuerza bruta, TDES fue elegido como forma de agrandar el largo de la clave sin necesidad de cambiar de algoritmo de cifrado. Este método de cifrado es inmune al ataque por encuentro a medio camino, doblando la longitud efectiva de la clave (112 bits), pero en cambio es preciso triplicar el número de operaciones de cifrado, haciendo este método de cifrado muchísimo más seguro que el DES. Por tanto, la longitud de la clave usada será de 192 bits, aunque como se ha dicho su eficacia solo sea de 112 bits.

Servicios de Criptografía

En .Net los servicios de criptografía están definidos en el namespace System.Security.Cryptography, el cual provee mecanismos de codificación y decodificación de datos, además de otras operaciones tales como hashing, generación números aleatorios, y mensajes de autenticación.

Manos a la obra

Empecemos por el método de cifrado.

   1: public string Encryption(string data, string key)
   2: {
   3:     TripleDESCryptoServiceProvider TDes = new TripleDESCryptoServiceProvider();
   4:     MD5CryptoServiceProvider Hash = new MD5CryptoServiceProvider();
   5:  
   6:     Byte[] buffer;
   7:  
   8:     try
   9:     {
  10:         //Se convierte la cadena en un arreglo de bytes
  11:         buffer = Encoding.ASCII.GetBytes(data);
  12:  
  13:         //Definimos la llave de encripción, en este caso se me ocurrio incrementar la seguridad
  14:         //usando como llave  de encripción, la hash MD5 de la llave que se especificada en el metodo
  15:         TDes.Key = Hash.ComputeHash(Encoding.ASCII.GetBytes(key));
  16:  
  17:         //Se define el modo de cifrado que se desea utilizar
  18:         TDes.Mode= CipherMode.ECB;
  19:  
  20:         //Se crea el encriptor y se transforma el bloque de bits, se convierte a texto en base 64 para poderlo manejar
  21:         //ya que asi es mas viable el uso sobre con HTTP
  22:         return Convert.ToBase64String(TDes.CreateEncryptor().TransformFinalBlock (buffer,0,buffer.Length));
  23:     }
  24:     catch (Exception ex)
  25:     {
  26:         Console.WriteLine("Se genero un error al cifrar los datos! : {0}", ex.ToString());
  27:         throw ex;
  28:     }
  29: }

En este caso TDES maneja una llave mas larga razón por la cual se me ocurrió que en lugar de la llave que se recibe por parámetro, seria mejor utilizar el hash de la misma, de esta forma se hace aun mas robusto el mecanismo.


Es importante entender que existen diferentes métodos de cifrado, y que se debe usar el mismo tanto para el cifrado como para el descifrado del mensaje.


A continuación veremos el método para descifrar los datos que previamente hemos cifrado.


   1: public string Decryption(string data, string key)
   2: {
   3:     TripleDESCryptoServiceProvider TDes = new TripleDESCryptoServiceProvider();
   4:     MD5CryptoServiceProvider Hash = new MD5CryptoServiceProvider();
   5:  
   6:     Byte[] buffer;
   7:  
   8:     try
   9:     {
  10:         //Se convierte la cadena en un arreglo de bytes
  11:         buffer = Convert.FromBase64String(data);
  12:  
  13:         //Definimos la llave de encripción, en este caso se me ocurrio incrementar la seguridad
  14:         //usando como llave  de encripción, la hash MD5 de la llave que se especificada en el método
  15:         TDes.Key = Hash.ComputeHash(Encoding.ASCII.GetBytes(key));
  16:  
  17:         //Se define el modo de cifrado que se desea utilizar
  18:         TDes.Mode = CipherMode.ECB;
  19:  
  20:         //Se crea el desencriptor y se transforma el bloque de bits, se convierte a texto en base 64 para poderlo manejar
  21:         //ya que asi es mas viable el uso en ambientes de redes
  22:         return Encoding.ASCII.GetString(TDes.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length));
  23:     }
  24:     catch (Exception ex)
  25:     {
  26:         Console.WriteLine("Se genero un error al descifrar los datos! : {0}", ex.ToString());
  27:         throw ex;
  28:     }
  29: }

Como se puede ver, no es un proceso complicado, al contrario, es muy sencillo de implementar y nos permite gozar de un nivel de seguridad mas que adecuado para la mayoría de nuestras aplicaciones, si bien no es adecuada para ambientes donde la seguridad es el atributo de calidad dominante, si es una muy buena opción como mecanismo de seguridad en un entorno normal.


Etiquetas de Technorati: ,,,

jueves, 28 de junio de 2012

Cifrado con DES

Data Encryption Standard (DES) es un algoritmo de cifrado, fue escogido como un estándar FIPS en los Estados Unidos en 1976, en aquel tiempo alcanzo gran popularidad, pero hoy en día se considera inseguro, esto en parte a que la longitud de clave es de solo 56 bits.
Aun cuando puede no ser apto para un entorno en el que se requiere una gran seguridad si puede ser usado en aplicaciones mas sencillas para brindar un nivel de seguridad mas que aceptable. Bajo esta premisa, veremos la forma de implementar este mecanismo de cifrado en nuestras aplicaciones.

Servicios de Criptografía

En .Net los servicios de criptografía están definidos en el namespace System.Security.Cryptography, el cual provee mecanismos de codificación y decodificación de datos, además de otras operaciones tales como hashing, generación números aleatorios, y mensajes de autenticación.

Manos a la obra

Empecemos por crear el método que cifrar los datos:
 
   1: private static string Coding(string cadena, string key)
   2: {
   3:     DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   4:     Byte[] buffer;
   5:     Byte[] cryptoKey=new byte[8];
   6:     
   7:     try
   8:     {
   9:         //Se convierte la cadena en un arreglo de bytes
  10:         buffer = Encoding.ASCII.GetBytes(cadena);
  11:  
  12:         //Se convierte la llave en un array de bytes y se toman 8 bytes que usa DES
  13:         Array.Copy(ASCIIEncoding.ASCII.GetBytes(key), 0, cryptoKey, 0, 7);
  14:  
  15:         //Se define la llave de encripción
  16:         des.Key = cryptoKey;
  17:  
  18:         //Se define el modo de cifrado que se desea utilizar
  19:         des.Mode = CipherMode.ECB;
  20:  
  21:         //Se crea el encriptor y se transforma el bloque de bits, se convierte a texto en base 64 
  22:         //ya que asi es mas viable el uso sobre redes
  23:         return Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length));
  24:     }
  25:     catch (Exception ex)
  26:     {
  27:         Console.WriteLine("Se ha presentado un error! : {0}", ex.ToString());
  28:         throw;
  29:     }
  30: }


Como se puede observar, la llave que usa DES es de 8 bytes, así que se toman solo 8 bytes de el array, pues de otra forma se generara una excepción.

Es importante entender que existen diferentes métodos de cifrado, y que se debe usar el mismo tanto para el cifrado como para el descifrado del mensaje.
A continuación veremos el método para descifrar los datos que previamente hemos cifrado.

   1: private static string UnCoding(string cadena, string key)
   2: {
   3:     DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   4:     Byte[] buffer;
   5:     Byte[] cryptoKey = new byte[8];
   6:  
   7:     try 
   8:     {
   9:         //Se convierte la cadena en un arreglo de bytes
  10:         buffer = Convert.FromBase64String(cadena);
  11:  
  12:         //Se convierte la llave en un array de bytes y se toman 8 bytes que usa DES
  13:         Array.Copy(ASCIIEncoding.ASCII.GetBytes(key), 0, cryptoKey, 0, 7);
  14:  
  15:         //Se define la llave de encripción
  16:         des.Key = cryptoKey;
  17:  
  18:         //Se define el modo de cifrado que se desea utilizar
  19:         des.Mode = CipherMode.ECB;
  20:  
  21:         //Se crea el decodificador y se transforma el bloque de bits, se convierte a una cadena de texto
  22:         return Encoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0,buffer.Length));
  23:     }
  24:     catch (Exception ex)
  25:     { 
  26:         Console.WriteLine("Se ha presentado un error al decodificar! : {0}", ex);
  27:         throw ;
  28:     }
  29: }

Como se puede ver, no es un proceso complicado, al contrario, es muy sencillo de implementar y nos permite gozar de un moderado nivel de seguridad en aplicaciones donde por diferentes motivos la seguridad no esta entre los atributos de seguridad dominantes, pero que tampoco queremos dejarla de lado totalmente.

Etiquetas de Technorati: ,,,,,,