martes, septiembre 23, 2008

Guardar errores en un archivo de texto de forma encriptada

Siempre es buena practica llevar un registro de los errores que se presentan en cualquier aplicacion, creo que lo mas comun es colocar los errores en un archivo de texto, como una especie de log, o en su caso dentro de una base de datos para llevar un registro. Los habra mas sofisticados que pondra la informacion como un evento de windows.

Pero si no queremos que los usuarios de la aplicacion que estan de curiosos, vean y lean los errores que se producen en nuestra aplicacion, una forma practica es la de encriptar el archivo. El problema con esto es que si el archivo de texto se vuelve muy grande la encriptacion puede hacer lenta la aplicacion, ya que tienes que abrir el archivo desencriptar, colocar un mensaje, y volver a encriptar el archivo.

Siendo lo anterior un poco impractico decidi mejor colocar los mensajes encriptados dentro del archivo. Para lo cual modifique la clase que estoy utilizando para guardar los mensajes:

   1:      Public Shared Sub WriteError(ByVal errorMessage As String)
   2:          Try
   3:              Dim path As String = "error.txt"
   4:              If (Not File.Exists(System.Web.HttpContext.Current.Server.MapPath(path))) Then
   5:                  File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close()
   6:              End If
   7:              Using w As StreamWriter = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path))
   8:                  w.WriteLine(Constants.vbCrLf & "Error : ")
   9:                  w.WriteLine("{0}", DateTime.Now.ToString(CultureInfo.InvariantCulture))
  10:                  Dim err As String = "En linea: " & System.Web.HttpContext.Current.Request.Url.ToString() & ". Mensaje:" & errorMessage
  11:                  w.WriteLine(Encrypt(err, True))
  12:                  w.WriteLine("__________________________")
  13:                  w.Flush()
  14:                  w.Close()
  15:              End Using
  16:          Catch ex As Exception
  17:              WriteError(ex.Message)
  18:          End Try
  19:      End Sub


Si observan en la linea 11 puse la palabra Encrypt, es ahi donde estoy haciendo llamar otra funcion, importando en el archivo la libreria de .net de criptografia:

Imports System.Security.Cryptography


    Public Function Encrypt(ByVal toEncrypt As String, ByVal useHashing As Boolean) As String
        Dim keyArray As Byte()
        Dim toEncryptArray As Byte() = UTF8Encoding.UTF8.GetBytes(toEncrypt)
        Dim key As String = "MyKEY"
        If useHashing Then
            Dim hashmd5 As New MD5CryptoServiceProvider()
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key))
            hashmd5.Clear()
        Else
            keyArray = UTF8Encoding.UTF8.GetBytes(key)
        End If
        Dim tdes As New TripleDESCryptoServiceProvider()
        tdes.Key = keyArray
        tdes.Mode = CipherMode.ECB
        tdes.Padding = PaddingMode.PKCS7
        Dim cTransform As ICryptoTransform = tdes.CreateEncryptor()
        Dim resultArray As Byte() = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length)
        tdes.Clear()
        Return Convert.ToBase64String(resultArray, 0, resultArray.Length)
    End Function


Ahora ya tendremos nuestros mensajes encriptados. Si queremos desencriptar los mensajes solo tendremos que usar la siguiente funcion en algun lugar y hacerla llamar:



    Public Shared Function Decrypt(ByVal cipherString As String, ByVal useHashing As Boolean) As String
       Dim keyArray As Byte()
        Dim toEncryptArray As Byte() = Convert.FromBase64String(cipherString)
        Dim key As String = "MyKEY"
        If useHashing Then
            Dim hashmd5 As New MD5CryptoServiceProvider()
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key))
            hashmd5.Clear()
        Else
            keyArray = UTF8Encoding.UTF8.GetBytes(key)
        End If
        Dim tdes As New TripleDESCryptoServiceProvider()
        tdes.Key = keyArray
        tdes.Mode = CipherMode.ECB
        tdes.Padding = PaddingMode.PKCS7
        Dim cTransform As ICryptoTransform = tdes.CreateDecryptor()
        Dim resultArray As Byte() = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length)
        tdes.Clear()
        Return UTF8Encoding.UTF8.GetString(resultArray)
    End Function

Tal vez usar una forma de aspx que reciba el codigo encriptado:


<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="Bintech.WebForm1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        Forma de desencriptacion:<br />
        <asp:TextBox ID="TextBoxEncriptado" runat="server" Height="173px" TextMode="MultiLine" Width="308px"></asp:TextBox>
        <br />
        <asp:Button ID="Button1"
            runat="server" Text="Button" />
        <br />
        <asp:Label ID="LabelResult" runat="server"></asp:Label></div>
    </form>
</body>
</html>

Y agregar un evento al boton:







    Protected Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       LabelResult.Text = Decrypt(TextBoxEncriptado.Text, False)
    End Sub


Listo!

¿Donde desea publicar su sitio web?

Aqui dejo un extraño error que me tope con Visual Studio 2005 a la hora de publicar un sitio web. Primero un poco de antecedentes, generalmente publico los sitios web a niver raiz del servidor, es asi,  que siempre modifico las preferencias de publicacion del proyecto en el cual estoy trabajando y elimino la carpeta virtual que coloca por defecto visual studio:

 

20080917z

De esta manera siempre que pruebo un sitio solo tengo que colocar el url http://localhost, en ocasiones coloco un puerto especifico para el servidor de desarrollo y el de publicacion se queda con el estandar 80.

Esto siempre me ha resultado. El detalle fue que en esta ocasion el servidor de publicacion debe llevar una carpeta virtual.

Para empezar la talacha de apuntar a una carpeta virtual en el codigo, particularmente para los archivos de javascript y de estilos. Y realizar cambios no esperados. En fin que regrese la configuracion a la anterior:

20080917c

Con lo anterior pude seguir trabajando sin problemas para hacer depuracion del sitio. Una vez que habia terminado se me ocurrio publica la aplicacion al servidor local:

 

20080917b

¿Donde deseo publicar? en localhost por supuesto. Le di “publish” y:

 

20080917a

Que, ¿Que?. Como que no puedo publicar mi sitio de forma local.

Si analizamos el mensaje, me esta diciendo que debo publicar en un sitio diferente al de la aplicacion web, pero lo cierto es que en ningun momento coloque que localhost es donde se encuentra mi aplicacion web, es mas en realidad, siendo estricto se encuentra en una carpeta llamada d:\dev.

Por otra parte cuando se depura la aplicacion y se lanza el servidor de pruebas de visual studio, en ningun momento se coloca localhost, solo se coloca la carpeta virtual y a lo mas un puerto , que en mi caso era diferente al 80.

Sin embargo, al parecer se guarda algun registro en algun lugar y se conserva localhost, donde se guarda el registro, no lo investigue, la verdad es que me apuraba, poder publicar el sitio para demostrarlo.

Una busqueda rapida por Google, mencionaban que ese error se debia colocar a que yo estaba colocando el sitio en el mismo url, que lo cambiara por el de un sitio remoto, gran ayuda. Le di vueltas al asunto, y se me ocurrio prender la paloma de IIS Server como servidor de publicacion y colocar cualquier cosa que no fuera localhost:

 

20080917d

Cambie de nuevo la opcion de usar Visual Studio Dev Server para seguir trabajando como normalmente lo hago,:

 

20080917e

Como pueden apreciar el servidor de IIS no lo estoy utilizando, pero sin embargo si parece haber sido cambiado el parametro en algun lugar.

Vuelvo a intentar publicar:

 

20080917b

Y esta vez sin errores!

Listo!

lunes, septiembre 22, 2008

Monitoreo de los Salarios en IT en Mexico

La revista Software Guru esta invitando a todo programador, desarrollador, administrador o cualquiera que sea el ambito, pero involucrado en el area de la industria del software a participar en su encuesta de este 2008, los resultados apareceran en la revista en la edicion de noviembre.

Ademas de ser una muy buena revista de software, me parece muy interesante conocer este tipo de indicadores.

Puedes llenar la encuesta en:

www.sg.com.mx/component/option,com_trivia/task,view/trivia_id,3.

Listo!

martes, septiembre 02, 2008

Google chrome: La solución para Ajax?

Google anunció el lanzamiento de un nuevo browser, el cual esta destinado a solucionar, por sobretodo los problemas de memoria para las aplicaciones web que usan de forma extensiva ajax.

download-google-chrome

Aqui en llanura.com, creemos que viene a refrescar el nicho de mercado de los navegadores de forma muy positiva. Sí, como se comenta en el webcomic de presentacion, este nuevo navegador permitira tener una maquina virtual de Javascript, las posibilidades para tener mejores aplicaciones web son muchas.

Por lo menos para el desarrollador promedio, tener la ventaja de no estarse preocupando por apuntadores de memoria y cosas por el estilo.

Me parece muy interesante que esten usando Webkit para el core de desarrollo del navegador, y V8 para la maquina virtual.

Recomiendo mucho la revision de la informacion que se presenta en la pagina oficial del blog de google, y esperar el lanzamiento de la pagina de descarga, que al parecer sera www.gchrome.com www.google.com/chrome .

Listo!