lunes, 17 de septiembre de 2012

[Tutorial] Guardar Contraseñas o ConnectionString en el codigo suele ser seguro?(parte 1)


Generalmente  cuando tenemos una aplicación en cualquier lenguaje de programacion lo que solemos hacer es guardar el password de ingreso a tal en el mismo codigo o en una base de datos, pero que sucede si decompilan nuestro ejecutable y obtienen ese password o la ConnectionString de nuestra DB?, un gran problema diria yo.
En este articulo vamos a exponer un metodo sencillo para ocultar esos datos y que al decompilar sea “casi” imposible obtener  los datos que ocultemos.
Un decompilador (del inglés "decompiler", a veces castellanizado descompilador) es un programa de ordenador que realiza la operación inversa a un compilador. Esto es, traducir código o información de bajo nivel de abstracción (sólo diseñado para ser leído por un ordenador, ej código máquina) a un lenguaje o medio de mayor nivel de abstracción (usualmente diseñado para ser leído por un humano, ej cualquier lenguaje de programación de alto nivel).
 ahora dos imágenes sencillas para ver un poco lo que digo, es para que entiendan al vistazo lo que digo.
 

Como vemos en la primer imagen del Visual Basic la variablle "pass" guarda la contraseña que nos daría acceso a nuestro "programa". En la segunda imagen de un decompilador (el único que encontré rapidamente) nos muestra donde esta remarcado la misma contraseña que escribimos en el visual basic, que loco no? pero así de fácil nos pueden sacar la ConnectionString de nuestra DB y de igual manera tener acceso a nuestro sistema de forma total perjudicándonos o perjudicando a quien vendimos nuestro producto.

en esta breve introduccion de lo que veremos, trataremos de guardar estos datos importante dentro de las secciones del archivo, y agregarle alguna rutina antidebug y algun otro mas.

viernes, 19 de agosto de 2011

[Code] Mini Reto Con un Amigo! Sucesión de Fibonacci

Bueno hace un tiempo nos retamos a quien hacia la funcion mas rapida para comprobar la Sucesión de fibonacci y bueno ahora pondre los codes de cada uno! ah por cierto algo de info de lo que hablamos Sucesión de Fibonacci..
Esta es De Mi amigo, Sub-Soul
Private Function IsFibonacciNumber(ByVal N As Long) As Boolean
        Dim X(2) As Long

        X(Chr(48)) = Chr(48)
        X(Chr(49)) = Chr(49)

        If X(Chr(50)) = X(Chr(48)) Or X(Chr(49)) Then IsFibonacciNumber = True
        If X(Chr(50)) <> N Then IsFibonacciNumber = False

        For X(Chr(50)) = Chr(48) To N

            X(Chr(50)) = X(Chr(48)) + X(Chr(49))
            X(Chr(48)) = X(Chr(49))
            X(Chr(49)) = X(Chr(50))

            If X(Chr(50)) = N Then IsFibonacciNumber = True : Exit For

            DoEvents()

        Next

    End Function
y esta funcion comprobando hasta el numero maximo de short en .NET 32.767 demora en comprobar 301 msec..

Y esta es mi funcion xD

Public Function EsFibonacci(ByVal viNum As Short) As Boolean
        Dim vdDoble(1) As Double

        Dim vbByt As Byte

        If Not viNum And &H7FFF Then 'solo hasta el mayor numero de short 32.767
            vdDoble(0) = 0

            vdDoble(1) = 1

            Do Until vdDoble(vbByt) >= viNum

                vdDoble(vbByt) = vdDoble(vbByt) + vdDoble(vbByt Xor 1)

                vbByt = vbByt Xor 1

            Loop

            If vdDoble(0) = viNum OrElse vdDoble(1) = viNum Then

                Return True

            End If
        End If
    End Function

Y esta funcion comprobada de la misma solo tarda 300 msec...lo hice de esta forma puesto a que en clases vimos compuertas logicas y me sirvio para usar bit nada mas...xor and y or como pueden ver xD :P esto es todo
Imprimir

miércoles, 3 de agosto de 2011

[Tutorial] Criptografia simétrica en .NET (I)




Holas a todos, estuve preparando un tutorial de unas clases propias del framework pero me levante soñando esto y que la verdad es importante y es la criptografía simétrica: 

La criptografía simétrica es un método criptográfico en el cual se usa una misma clave para cifrar y descifrar mensajes. Las dos partes que se comunican han de ponerse de acuerdo de antemano sobre la clave a usar. Una vez ambas tienen acceso a esta clave, el remitente cifra un mensaje usándola, lo envía al destinatario, y éste lo descifra con la misma.”
Para aquellos que migraron de “vb6” sabran que ya había por la internet muchos “módulos y clases” de varios algoritmos, pues ahora nuestro querido “.NET” ya nos proporciona unas clases echas para que nosotros “disfrutemos” de esto sin problemas jejeje.
Vamos a suponer un ejemplo para poder empezar con esto que a muchos estará interesado.

“Suponemos que Alejandro y Mauro quieren comunicarse por un canal y deciden utilizar la criptografía para evitar que puedan ver su comunicación.Alejandro le envía a Mauro la clave que van a utilizar para establecer el canal seguro.Alejandro cifra los datos que quiere enviar y Mauro los recibe y así mismo con la clave que Alejandro cifro los datos Mauro los va a descifrar para poder saber que es lo que le fue enviado.”
Con esto queda a destacar 3 puntos importantes en esto de la criptografía simétrica y es que ambas partes deben garantizar que los datos comunicados:
  • no puedan ser comprendidos por nadie que pueda estar escuchando: Confidencialidad.
  • no han sido modificados durante la transmisión: Integridad.
  • provienen realmente de quien provienen y no de nadie que haya suplantado la identidad de una de las dos partes: Autenticación.
La criptografía se utiliza para lograr estos objetivos, pero no nos centraremos en saber como funcionan los algoritmos de encriptación, solo a saber usarlos y evitar malas prácticas en ello.
1ª La encriptación simétrica o cifrado de clave secreta:
En la encriptación simétrica se utiliza una única clave secreta para cifrar y descifrar los datos. Son algoritmos muy rápidos, por eso se utilizan para grandes secuencias de datos.
Dentro de los algoritmos de encriptación simétrica podemos encontrar los siguientes:
  • DES ( Digital Encryption Standard )
  • 3DES ( Three DES o Triple DES )
  • IDEA ( International Data Encryption Algorithm )
  • AES ( Advanced Encryption Standard )
AES es de amplia aceptación a nivel mundial. Hoy en día es el más seguro y rápido.
Cualquiera de estos algoritmos utiliza los siguientes dos elementos los cuales debemos darle su importancia y no pasarlo por alto:
  • ·Vector de inicialización.-
No se puede encriptar sin él. Es de 16 bytes de longitud para el algoritmo de Rijndael. No es una 2ª llave, por lo tanto, no se trata de una dato que haya que esconder, únicamente hay que considerar que hay que usar el mismo IV para encriptar/desencriptar un mensaje concreto. Un error común es utilizar el mismo vector de inicialización en todas las encriptaciones. Utilizar siempre un mismo IV es equivalente en seguridad a no utilizar encriptación.
  • · Key o llave.-
Esta es la principal información para encriptar/descifrar en los algoritmos simétricos. Toda la seguridad de un sistema simétrico depende de dónde esté esta llave, cómo esté compuesta y quién tiene acceso. Éste es un dato que debe conocerse única y exclusivamente por los interlocutores de la comunicación. De otra forma, la seguridad en la comunicación se vería comprometida.
Consideraciones acerca de la clave
Cuanto más grande sea el tamaño de la llave, más difícil será obtenerla mediante un ataque por fuerza bruta. Para el algoritmo de AES, las claves pueden ser de 128, 192 y 256 bits de longitud. Por ejemplo, para una clave de 64 bits de longitud, a un ritmo de comprobación de 50 claves por segundo, podría llevar unos 11,6 billones de años en comprobar todos los valores posibles de la clave (unas 750 veces la edad de la tierra), aunque también hay que considerar que, comprobados la mitad de los valores posibles de la clave, existen un 50% de probabilidades de haberla encontrado ya. Por tanto, el éxito de un ataque por fuerza bruta o el nivel de seguridad que ofrece una clave, están sujetos a las leyes de la probabilidad y considerar que un atacante debería comprobar todos los valores posibles de una clave para poder encontrarla es una suposición demasiado optimista. No se puede afirmar categóricamente que una tercera parte que intercepte un mensaje cifrado simétricamente en un canal de comunicaciones inseguro no sea capaz nunca de encontrar la clave secreta. Entonces, la seguridad de un algoritmo simétrico debe basarse en utilizar una clave lo suficientemente bien formada como para que, independientemente del ritmo de comprobación de claves que un atacante pudiera mantener, cuando ésta sea descubierta, los datos que se protegen hayan quedado ya obsoletos.
Consideraciones acerca del vector de inicialización
En un esquema de cifrado por bloques (como AES), la secuencia de texto sin cifrar se parte en bloques para su procesamiento. Para una clave secreta determinada, un cifrado que no utilice un vector de inicialización codificará el mismo bloque de entrada de texto sin cifrar en el mismo bloque de salida de texto cifrado. Si hay bloques duplicados dentro la secuencia de texto a cifrar, habrá bloques duplicados en la secuencia de texto cifrado. Si el hacker sabe algo acerca de la estructura de un bloque del texto sin cifrar, puede utilizar esa información para descifrar el bloque de texto cifrado conocido y, posiblemente, recuperar la clave.
Para combatir este problema, la información del bloque anterior se mezcla en el proceso de cifrado del bloque siguiente (como vamos a ver ahora, en el modo de cifrado ECB – Electronic Code Book Mode no se hace eso). Así pues, el resultado de dos bloques idénticos de texto sin cifrar es distinto. Como esta técnica utiliza el bloque anterior para cifrar el bloque siguiente, se utiliza un IV para cifrar el primer bloque de datos. Con este sistema, los encabezados de los mensajes comunes que un hacker podría conocer no pueden utilizarse para aplicar técnicas de ingeniería inversa en una clave.
Consideraciones acerca del modo de cifrado
Los algoritmos de cifrado de bloque como DES o AES separan el mensaje en bloques de tamaño fijo para su procesamiento, por ejemplo 128 bits. La forma en que se gestionan estos bloques se denomina “modo de cifrado”. Los modos de cifrado que soporta .NET Framework son ECB, CBC, y CFB (es preferible usar CBC).
  • ECB – Electronic Code Book Mode: Las desventajas de este modo de cifrado son grandes, por lo que se usa cada vez menos (hace posible los ataques de diccionario).
  • CBC – Cipher Block Chaining Mode: Es una extensión de ECB que añade cierta seguridad (usa un vector de inicialización IV). Es el modo de cifrado por bloques más usado.
AES permite elegir la longitud de la clave y del bloque individualmente, en el rango de valores {128, 160, 192, 224 y 256 bits}. En realidad, dichas longitudes no tienen por qué coincidir, pero la Publicación oficial del algoritmo AES (FIPS 197) especifica que en AES, la longitud de bloque debe ser siempre 128 bits y que la de la clave puede ser 128, 192, o 256 bits (160 y 224 no son opciones soportadas).
Modos de relleno
La mayoría de los mensajes de texto a cifrar no contienen los bytes necesarios para rellenar totalmente los bloques. A menudo, no hay bytes suficientes para rellenar el último bloque. Cuando esto sucede, se agrega una cadena de relleno al texto. Por ejemplo, si la longitud del bloque es de 64 bits y el último bloque sólo contiene 40 bits, se agregan 24 bits de relleno. .NET Framework soporta dos modos de relleno:
  • Zeros: La cadena de relleno consta de bytes establecidos en cero.
  • PKCS7: La cadena de relleno PKCS #7 consta de una secuencia de bytes, en la que cada byte es igual al número total de bytes de relleno agregados.
Por ejemplo, para una longitud de bloque de 8 bytes, una longitud de datos de 9 bytes, un número de octetos de relleno igual a 7 bytes y los datos iguales a A1 A1 A1 A1 A1 A1 A1 A1 A1, quedaría:
  • Relleno de Zeros: A1 A1 A1 A1 A1 A1 A1 A1 A1 00 00 00 00 00 00 00
  • Relleno de PKCS7: A1 A1 A1 A1 A1 A1 A1 A1 A1 07 07 07 07 07 07 07

miércoles, 27 de julio de 2011

MZ-Tools 3.0 para Visual Basic

MZ-Tools es una herramienta cuyo objetivo es hacerte más fácil la programación en Visual Basic o Visual Basic.NET además de ser una herramienta totalmente freeware.

Esta herramienta te permitirá escribir código, buscar código, documentar tus aplicaciones, crear los formularios de forma mas sencilla...

Es un complemento que funciona para los entornos  Visual Studio 2010, 2008, 2005, Visual Studio .NET 2003, 2002 (lenguajes C#, VB.NET, Visual J# y C++), VB6, VB5 y VBA, MZ-Tools añade nuevos menús y barras de herramientas que proporcionan muchas funcionalidades.

Entre los beneficios que te puede ofrecer esta herramienta, podemos destacar:

  • Escribir código más deprisa.
  • Buscar código de una forma más ágil.
  • Diseñar los formularios de una forma mas rápida y sencilla.
  • Documentar tu código de una forma más rápida.
  • Asegura la calidad de tu código y tus aplicaciones.

Mas información en el Sitio Oficial

[Code]Simple Procedimiento para Enviar E-mail.

Hola como va todo?, bueno para comenzar con este blog voy a colocar un code sencillo pero efectivo para enviar mail,,!

Empezare explicando los parametros que es lo mas importante para saber como aplicarlo en cualquiera de nuestras aplicaciones .net!

Private Sub EnviarMail(ByVal mail As String, ByVal contraseña As String, _
                           ByVal asunto As String, ByVal destinatario As String, _
                           ByVal cuerpo As String, _
                           Optional ByVal File As String = Nothing, _
                           Optional ByVal smtp As String = "smtp.live.com", _
                           Optional ByVal puerto As Integer = 587, _
                           Optional ByVal BodyHtml As Boolean = False)

El primer parametro de nuestro procedimiento es "MAIL", el cual tenemos que ingresar el mail del remitente en este caso el nuestro(como esta preconfigurado para el smtp de hotmail, el mail debe ser corresponder a ese,,).

El segundo parametro es "CONTRASEÑA" el cual es nuestra contraseña correcta del mail ingresado anteriormente.El tercer parametro es el "ASUNTO"..mmm...Creo que esta claro lo que ahy que ingresar al igual que destinatario que seria el mail de quien recibira nuestro mail...El unico detalle que are sera del "Cuerpo" por defecto en los parametros opcionales solo recibe texto plano como cuerpo del mensaje pero podemos darle a TRUE para enriquecer nuestro mail con texto HTML!.

Parametro opcional "FILE" aqui ingresamos la ruta del archivo si queremos adjuntar un archivo...preferentemente que sean comprimidos o de archivos de textos porque como sabemos archivos executables es "DIFICIL" que el servidor nos reciba....otro detalle es que los servidores SMTP tiene un limite en tamaño de archivo para enviar...creo yo que hotmail es solo 20 MB es por eso que antes de pasar por parametro el archivo verifiquemos si no supera para no recibir un error!.

Bueno despues de mucho explicar dejo el code completo para que prueben y vean lo sencillo que es y que podemos integrarlos en cualquier sistema creado en .net..Un Abrazo y hasta otro momento!

Todo el codigo que aqui se coloque en este blog,,es para uso de aprendizaje y espero se respeto al autor!



''' <summary>
    ''' para enviar mail con el servidor de hotmail u Otro que queramos
    ''' </summary>
    ''' <param name="mail">Mail del Remitente</param>
    ''' <param name="contraseña">Contraseña Del Remitente</param>
    ''' <param name="asunto">Asunto Del Mail</param>
    ''' <param name="destinatario">Mail para quien va dirigido el mail</param>
    ''' <param name="cuerpo">Cuerpo Del Mensaje</param>
    ''' <param name="File">Archivo para Enviar Adjunto al Mail</param>
    ''' <param name="smtp">Para Editar el Servidor Smtp</param>
    ''' <param name="puerto">Puerto Del Servidor Smtp es Opcional si el servidor lo requiere</param>
    ''' <param name="BodyHtml">Por si queremos Incluir codigo Html a Nuestro Mail</param>
    ''' <remarks></remarks>
    Private Sub EnviarMail(ByVal mail As String, ByVal contraseña As String, _
                           ByVal asunto As String, ByVal destinatario As String, _
                           ByVal cuerpo As String, _
                           Optional ByVal File As String = Nothing, _
                           Optional ByVal smtp As String = "smtp.live.com", _
                           Optional ByVal puerto As Integer = 587, _
                           Optional ByVal BodyHtml As Boolean = False)


        Dim servidor As New System.Net.Mail.SmtpClient

        Dim mails As New System.Net.Mail.MailMessage

        Try
            If System.IO.Path.IsPathRooted(File) Then
                Dim FileAdjunto As New Net.Mail.Attachment(File)
                mails.Attachments.Add(FileAdjunto)
            End If
            With mails
                .From = New System.Net.Mail.MailAddress(mail, mail, System.Text.Encoding.UTF8)
                .Subject = asunto
                .SubjectEncoding = System.Text.Encoding.UTF8
                .To.Add(destinatario)
                .Body = cuerpo
                .BodyEncoding = System.Text.Encoding.UTF8
                .IsBodyHtml = BodyHtml
            End With
            With servidor
                .Host = smtp
                .Port = puerto
                .EnableSsl = True
                .Credentials = New System.Net.NetworkCredential(mail, contraseña)
                .Send(mails)

            End With
        Catch ex As System.Net.Mail.SmtpException
            MessageBox.Show(ex.ToString, "Envio De Mail", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try
    End Sub