En el artículo de hoy aprenderemos a obtener el hash MD5 y SHA para una cadena de una forma muy sencilla mediante Visual Basic.NET. Comenzaremos observando el código que genera los valores:

Imports System.Text
Imports System.Security.Cryptography

Function generarMD5(ByVal sCadena As String) As String
  ' Objeto de codificación
  Dim ueCodigo As New UnicodeEncoding()
  ' Objeto para instanciar las codificación
  Dim Md5 As New MD5CryptoServiceProvider()

  ' Calcula el valor hash de la cadena recibida
  Dim bHash() As Byte = Md5.ComputeHash(ueCodigo.GetBytes(sCadena))

  ' Convierte el valor anterior en cadena y lo devuelve
  Return Convert.ToBase64String(bHash)
End Function

Function generarSHA(ByVal sCadena As String) As String
  ' Objeto de codificación
  Dim ueCodigo As New UnicodeEncoding()
  ' Objeto para instanciar las codificación
  Dim SHA As New SHA512Managed</code>

  ' Calcula el valor hash de la cadena recibida
  Dim bHash() As Byte = SHA.ComputeHash(ueCodigo.GetBytes(sCadena))

  ' Convierte el valor anterior en cadena y lo devuelve
  Return Convert.ToBase64String(bHash)
End Function

Como se puede observar, las dos funciones son prácticamente iguales y no tienen muchos misterios. Para realizar la codificación lo único que se hace, es utilizar un objeto UnicodeEncoding que se utilizará para descomponer en un array de bytes la cadena de la que quiere obtener su hash, para a continuación codificar dicho array.

Cabe recordar, que es importante incluir las librerías donde se encuentran tanto UnicodeEncoding como las funciones de hash, para ello nos remitimos a las primeras líneas del código anterior:

Imports System.Text
Imports System.Security.Cryptography

A modo de ejemplo, las dos funciones anteriores están implementadas en una sencilla aplicación llamada Hasher cuyo código fuente podréis descarga y analizar. También podéis encontrar la aplicación, en sus versiones tempranas en Codeplex.

Comparte este artículo con quien quieras
VB.NET: información de las unidades de disco
InfoBat 0.2

Discussion

  • Commenter's Avatar
    Judavi — 19 mayo, 2010 at 4:52

    Esta bueno el articulo, pero sería bueno si muestras un ejemplo de como usarlo.
    Si alguien dio con tu articulo es por que seguramente esta muy perdido y necesita más orientación

    • Commenter's Avatar
      Jose — 19 mayo, 2010 at 8:46

      Buenas 🙂

      El uso de las funciones creadas sería sencillo, por ejemplo si tenemos un String llamado sNombre y lo queremos codificar. Guardaremos el resultado en sCodif, con lo que nos quedaría el siguiente código:

      sCodif = generarMD5(sNombre)

      Respecto a las funciones que nos ofrece VB:

      • computeHash() básicamente lo que hace es transformar un array de bytes que recibe como entrada (por ello la conversión de la cadena en bytes) en otro codificado.
      • ToBase64String trasforma nuevamente el array en una cadena que podemos representar.

      Vamos a ver un ejemplo de uso en una aplicación. Imaginemos que tenemos una aplicación que guarda nombre de usuario y contraseñas. Para guardar las contraseñas utilizaremos una de las funciones. Ahora pensemos que alguien a introducido su contraseña y tras verificar que el usuario existe, las comprobamos pues sería algo así:

      if generarMD5(txtClave.text) = sClaveLeida then
      ...
      else
      Messagebox.Show("Clave incorrecta")
      end if

  • Commenter's Avatar
    Judavi — 19 mayo, 2010 at 4:52

    Muchas gracias por el aporte 🙂

  • Commenter's Avatar
    Mauro — 27 julio, 2010 at 1:00

    Muy bueno tu función.
    Ahora tengo una duda:
    Si quisiera usa una semilla (una cadena de texto) con el MD5 donde habitualmente se le agrega?

  • Commenter's Avatar
    SysFactory — 24 julio, 2011 at 19:03

    Hola el ego es algo jodido como dicen en mi pais
    me demore 2 dias buscando como se hace y decidi compartir con ustedes todo el proyecto que anque es facil se que no es igual para los que apenas comenzamos en esto ahi les va

    http://www.megaupload.com/?d=A9SN42A8
    saludos SysFactory mmontalvova@gmail.com

  • Commenter's Avatar
    Angel Benavides — 18 noviembre, 2019 at 18:03

    Excelente y muchas gracias. Con lo anterior se logro CODIFICAR la cadena de texto, cual seria el codigo para DECODIFICAR y me devuelva la misma cadena de texto

    • Commenter's Avatar
      jose — 18 noviembre, 2019 at 19:50

      Buenas Ángel,

      el concepto de hash MD5 y SHA es que no son reversibles. Ten en cuenta, que puedes escribir 1000 caracteres, que quedarán reducidos a unas pocas decenas. Podemos pensar en ellos, como un checksum, es decir, en su mayor parte serán únicos, pero no podemos saber cuál es la cadena origen. Es más, dos frases distintas, pueden producir un mismo hash. Es por ello que no hay código para decodificarlos.

      Por ejemplo, los podemos usar para almacenar claves. De forma que cuando el usuario se registre, su clave se almacena con SHA, y cuando el usuario vaya a hacer login, codificamos a SHA la clave que a introducido y la comparamos con la original. Esto nos aporta la capa de seguridad, de que si alguien ajeno accede a la base de datos, sabe los hash de las claves, pero no las claves, por lo que o prueba un ataque de fuerza bruta, o no tiene forma de conocerlas.

  • Commenter's Avatar
    Jose — 4 abril, 2021 at 21:35

    Esta genial. Me encanta la explicación.
    Soy novato en esto de la programación. Me encanta.
    Ahora me gustaría saber cómo puedo validar un usuario y su contraseña sobre Windows. Pero en local, sin usar ningún dominio. GRACIAS

Leave a Comment

Your email address will not be published. Required fields are marked *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.