lunes, 8 de junio de 2015

Respaldo de Configuración IIS

Puede que por muchas razones necesario mantener un respaldo de la configuración de nuestro servidor IIS teniendo en cuenta que se debe almacenar por separado los archivos de cada sitio.

Realizar una copia de respaldo 

Lo primero seria iniciar la sesion como administrador y abrir una consola de comandos (cmd.exe),ya dentro de la consola se debe cambiar el directorio: c:\windows\system32\inetsrv


Microsoft Windows [Versión 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.

C:\Users\Administrador>cd \


C:\>cd Windows\system32\inetsrv


C:\Windows\System32\inetsrv>_



Una vez que no encontremos situados en esta carpeta aremos uso de la herramienta:  appcmd.exe
para realizar el respaldo.

Si se desea mas informaicon sobre el uso de este comando se puede visitar la siguiente dirección:
Comando appcmd.exe

Para ello usaremos el comando appcmd.exe add backup ["nombre del respaldo"]


C:\Windows\System32\inetsrv>appcmd.exe add backup "Respaldo 02062015"
Se agregó el objeto de BACKUP "Respaldo 02062015"


Una vez ejecutado el comando de forma existosa pasamos a comprobar la creacion:


C:\Windows\System32\inetsrv>appcmd.exe list backup
BACKUP "Respaldo 02062015"
BACKUP "CFGHISTORY_0000000120"
BACKUP "CFGHISTORY_0000000121"
BACKUP "CFGHISTORY_0000000122"
BACKUP "CFGHISTORY_0000000123"
BACKUP "CFGHISTORY_0000000124"
BACKUP "CFGHISTORY_0000000125"
BACKUP "CFGHISTORY_0000000126"
BACKUP "CFGHISTORY_0000000127"
BACKUP "CFGHISTORY_0000000128"
BACKUP "CFGHISTORY_0000000129"

C:\Windows\System32\inetsrv>


los archivos para respladar quedan en el subdirectorio BACKUP y dentro tendra un sub direcotrio con el nombre del respaldo.


C:\Windows\System32\inetsrv>cd backup

C:\Windows\System32\inetsrv\backup>dir
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 28E4-8D99

 Directorio de C:\Windows\System32\inetsrv\backup

02/06/2015  05:53 p.m.    <DIR>          .
02/06/2015  05:53 p.m.    <DIR>          ..
02/06/2015  05:53 p.m.    <DIR>          Respaldo 02062015
               0 archivos              0 bytes
               3 dirs  85,856,223,232 bytes libres

C:\Windows\System32\inetsrv\backup>cd "Respaldo 02062015"

C:\Windows\System32\inetsrv\backup\Respaldo 02062015>dir
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 28E4-8D99

 Directorio de C:\Windows\System32\inetsrv\backup\Respaldo 02062015

02/06/2015  05:53 p.m.    <DIR>          .
02/06/2015  05:53 p.m.    <DIR>          ..
20/03/2014  02:52 p.m.            25,094 administration.config
25/03/2015  02:13 p.m.            88,139 applicationHost.config
08/09/2011  01:22 a.m.           266,906 MBSchema.xml
01/06/2015  07:16 p.m.            10,515 MetaBase.xml
08/09/2011  01:22 a.m.               490 redirection.config
02/06/2015  05:53 p.m.    <DIR>          schema
               5 archivos        391,144 bytes
               3 dirs  85,849,747,456 bytes libres


C:\Windows\System32\inetsrv\backup\Respaldo 02062015>


Si llegamos a tener un contratiempo, el servidor de daña o tenemos la necesidad de restaurarlo simplemente copiaremos los archivos de los sitios a las carpetas en las rutas correspondientes y el de backup de configuración a la ruta señalada revisameos que se reconosca y ejecutamos el comando para correr el respaldo.


C:\Windows\System32\inetsrv>appcmd.exe list backup
BACKUP "Respaldo 02062015"
BACKUP "CFGHISTORY_0000000120"
BACKUP "CFGHISTORY_0000000121"
BACKUP "CFGHISTORY_0000000122"
BACKUP "CFGHISTORY_0000000123"
BACKUP "CFGHISTORY_0000000124"
BACKUP "CFGHISTORY_0000000125"
BACKUP "CFGHISTORY_0000000126"
BACKUP "CFGHISTORY_0000000127"
BACKUP "CFGHISTORY_0000000128"
BACKUP "CFGHISTORY_0000000129"

c:\Windows\System32\inetsrv>appcmd.exe restore backup "Respaldo 02062015"
Configuración restaurada de la copia de seguridad "Respaldo 02062015"

c:\Windows\System32\inetsrv>


Con eso revisamos que la carpeta que copiamos ha sido reconocida. ahora procederemos a iniciar el la restauracion del respaldo para ello usaremos el comando appcmd.exe add backup ["nombre del respaldo"]


c:\Windows\System32\inetsrv>
appcmd.exe restore backup "Respaldo 02062015"
Configuración restaurada de la copia de seguridad "Respaldo 02062015"


c:\Windows\System32\inetsrv>

Si el mensaje es satisfactorio hemos restaurado la configuración de nuestro IIS


miércoles, 3 de junio de 2015

Cifrado y descifrado simétrico con Rijndael (AES) utilizando C#/

Cascaron DataLayerIng Advanced Encryption Standard (AES), también conocido como Rijndael, es un algoritmo de cifrado por bloques que es parte del estándar de Estados Unidos y actualmente es uno de los algoritmos de cifrado mas populares de criptografia simétrica.

Este tipo de algoritmos se pueden usar tanto para cifrar cadenas como archivos empecemos por las cadenas:

Implementación sobre cadenas (Strings)


La Implementación de este Algoritmo requiere los namespaces:
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

Clave y Vector de Inicio


Estos Valores son los que determinan la encripcion del algoritmo, estos valores pueden ser especificados manualmente o de manera automática por le mismo FrameWork La implementación queda definida por el siguiente código:

Rijndael rijndael = Rijndael.Create();
byte[] key = rijndael.Key;
byte[] iv  = rijndael.IV;

Es posible forzar la generación de nuevas claves y números de vectores de inicio para para el algoritmo utilizando los metodos rijndael.GenerateKey() y rijndael.GenerateIV() respectivamente.

Si el usuario o programador desea insertar los datos  para estos valores se usaran las variables strKey y strIv

byte[] key = UTF8Encoding.UTF8.GetBytes(strKey);
byte[] iv  = UTF8Encoding.UTF8.GetBytes(strIv);

Especificando estos valores manualmente es necesario garantizar que sus longitudes sean válidas para el algoritmo.  En este caso se utilizará una longitud de clave de 32 bits y una longitud de vector de inicio de 16 bits.

Array.Resize(ref key, keySize);
Array.Resize(ref iv, ivSize);

Cifrado de cadenas de texto.


Para cifrar la información se requiere de los siguientes parámetros.

  1. Cadena de texto con los datos a cifrar.
  2. Clave.
  3. Vector de inicio.

El proceso retornará finalmente una cadena de texto con los datos cifrados; para ello se implementa la siguiente funcion.
///
        /// 
        /// Cifrado de Cadenas de Texto
        /// 
        /// Mensaje a Cifrar
        /// Valor de la llave
        /// Vector de Inicio
        /// 
        public static string encryptString(String plainMessage, byte[] Key, byte[] IV)
        {
            Rijndael RijndaelAlg = Rijndael.Create();
            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                         RijndaelAlg.CreateEncryptor(Key, IV),
                                                         CryptoStreamMode.Write);
            byte[] plainMessageBytes = UTF8Encoding.UTF8.GetBytes(plainMessage);
            cryptoStream.Write(plainMessageBytes, 0, plainMessageBytes.Length);
            cryptoStream.FlushFinalBlock();
            byte[] cipherMessageBytes = memoryStream.ToArray();
            memoryStream.Close();
            cryptoStream.Close();
            return Convert.ToBase64String(cipherMessageBytes);
        }

Descifrado de cadenas de texto.


El proceso inverso, el de descifrado, se realiza de manera antagónica.  Para hacerlo es necesario contar con los siguientes parámetros.

Cadena de texto con los datos cifrados.
Clave.
Vector de inicio.
El proceso retornará finalmente una cadena de texto con los datos descifrados.
///
        /// Descifrado de cadenas de texto
        /// 
        /// Mensaje Encriptado
        /// Valor de la llave
        /// Vector de Inicio
        /// 
        public static string decryptString(String encryptedMessage, byte[] Key, byte[] IV)
        {
            byte[] cipherTextBytes = Convert.FromBase64String(encryptedMessage);
            byte[] plainTextBytes = new byte[cipherTextBytes.Length];
            Rijndael RijndaelAlg = Rijndael.Create();
            MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                         RijndaelAlg.CreateDecryptor(Key, IV),
                                                         CryptoStreamMode.Read);
            int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
            memoryStream.Close();
            cryptoStream.Close();
            return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
        }

Implementación con Archivos

El cifrado y descifrado de mensajes en archivos se realiza de manera similar al expuesto anteriormente con cadenas, sin embargo varían los flujos (streams) utilizados para obtener y dirigir el flujo de la información.

///

        /// Encriptar un Archivo
        /// 
        /// Mensajea Cifrar        
        /// Nombre del archivo
        /// Valor de la llave
        /// Vector de Inicio
        public static void encryptToFile(String plainMessage,String filename, byte[] Key, byte[] IV)
        {
            FileStream fileStream = File.Open(filename, FileMode.OpenOrCreate);
            Rijndael RijndaelAlg = Rijndael.Create();
            CryptoStream cryptoStream = new CryptoStream(fileStream,
                                                         RijndaelAlg.CreateEncryptor(Key, IV),
                                                         CryptoStreamMode.Write);
            StreamWriter streamWriter = new StreamWriter(cryptoStream);
            streamWriter.WriteLine(plainMessage);
            streamWriter.Close();
            cryptoStream.Close();
            fileStream.Close();
        }
        /// 
        /// 
        /// 
        /// Nombre del archivo cifrado
        /// Valor de la llave
        /// Vector de Inicio
        /// Mensaje Encriptado
        public static string decryptFromFile(String filename, byte[] Key, byte[] IV)
        {
            FileStream fileStream = File.Open(filename, FileMode.OpenOrCreate);
            Rijndael RijndaelAlg = Rijndael.Create();
            CryptoStream cryptoStream = new CryptoStream(fileStream,
                                                         RijndaelAlg.CreateDecryptor(Key, IV),
                                                         CryptoStreamMode.Read);
            StreamReader streamReader = new StreamReader(cryptoStream);
            string plainMessage = streamReader.ReadLine();
            
            streamReader.Close();
            cryptoStream.Close();
            fileStream.Close();

            return plainMessage;
        }