Generando un hash sha1 con ASP.NET y C# de forma sencilla y simple.

SHA1 es un algoritmo criptográfico perteneciente a la familia de algoritmos criptográficos SHA (Secure Hash Algorithm o Algoritmo de Hash Seguro) de la Agencia Nacional de Seguridad de Estados Unidos y desarrollada por el NIST (National Institude of Standards and Technology).

El primero de estos algoritmos fue desarrollado en el año 93 y fue el SHA (ahora conocido como SHA-0), 4 años después, fue sustituido por el SHA1 y posteriormente han aparecido SHA-224, SHA-256, SHA-384 y SHA-512 y todos son conocidos como SHA-2.

En 1998, se encontró una vulnerabilidad en SHA-0 pero esta no afectaba a SHA1 del cual no se ha encontrado ningún ataque efectivo. En 2004, fueron publicados una serie de ataques sobre hash parecidos al que genera SHA-1 planteándose por lo tanto dudas sobre la seguridad que este aporta.

Por medio del SHA1, vamos a obtener un hash sobre un conjunto de datos. Un hash viene a ser un conjunto de datos obtenido en base a otros.

Este tipo de algoritmos, se usa para certificar que una secuencia de datos no ha sido alterada, ya que si se modifica el valor del hash, implica que esa información ha sido alterada.

SHA1 produce una salida de 160 bits de un mensaje que puede tener un tamaño máximo de 264 bits y se basa en principios similares a los usados por Ronald Rivest (del MIT) para desarrollar los algoritmos MD4 y MD5.

¿Cómo podemos obtener un hash mediante el SHA1?

Pues vamos a verlo, la verdad es que con c# es sencillo dado que el Framework (como siempre) nos proporcionan unas clases para realizar esto.

Lo único que tenemos que hacer es crear una instancia de la clase SHA1 y pasarle un array de bytes al método ComputeHash.
El código necesario es el siguiente:

public static string GetSHA1(string str)
{
SHA1 sha1 = SHA1Managed.Create();
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] stream = null;
StringBuilder sb = new StringBuilder();
stream = sha1.ComputeHash(encoding.GetBytes(str));
for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
return sb.ToString();
}

Y esto es todo amigos míos, como siempre, mi consejo es que os bajéis el código ya que así lo podéis testear con una prueba unitaria y ver cómo funciona en detalle.

Otros algoritmos criptográficos en A deshoras

Enlaces relacionados

Descargas (Download)

26 pensamientos en “Generando un hash sha1 con ASP.NET y C# de forma sencilla y simple.

  1. muchas gracias este codigo si que funciono bien, existen muchos similares pero este me entrego de verdad los datgos sha1.
    lo comprobe con resultados en paginas que tiene un algoritmo sha1 online y funciono.
    muchas gracias.
    difundire la palabra.

  2. ‘en vb.net lo hise asi:
    Public Function CreaSHA1(ByVal str As String) As String
    Dim sha1 As System.Security.Cryptography.SHA1 = System.Security.Cryptography.SHA1Managed.Create()
    Dim encoding As New System.Text.ASCIIEncoding()
    Dim stream As Byte() = Nothing
    Dim sb As New System.Text.StringBuilder()
    stream = sha1.ComputeHash(encoding.GetBytes(str))
    For i As Integer = 0 To stream.Length – 1
    sb.AppendFormat(“{0:x2}”, stream(i))
    Next
    Return sb.ToString()
    End Function

    • Muchas gracias por el aporte Reinaldo.

      la verdad es que estos modelos de colaboración son los que nos permiten continuar en el camino.

      gracias otra vez y recibe un cordial suludo.

    • Gracias a ti por el comentario UnboundDarkness.

      Yo estoy contigo, todo esto tendría que en el framework.

      Un saludo y gracias otra vez.

  3. Disculpa, porque se crea un objeto del tipo SHA1 pero se instancia con SHA1Managed…
    Me refiero a la linea SHA1 sha1 = SHA1Managed.Create();

    No deberia ser SHA1 sha1 = sha1.create(); o de esta forma SHA1Managed sha1 = sha1managed.create().

    Funciona perfecto, pero me queda esa duda. Gracias.

    • Hola Pedro.

      Básicamente hay que hacerlo así porque la clase SHA1 no tiene un constructor publico que nos permita instanciar el objeto. SHA1Managed, expone el metodo Create como metodo estático.

      Un método estático, se encuentra siempre en memoria así que supongo que lo que hara SHA1Managed es tener cierto control sobre los hash que crea ya que estará implementada como un Singleton.

      Todo esto del singleton te lo digo de memoria y con suposiciones, es decir, no tengo la certeza de que esto sea así.

      • Que tal Cesar, gracias por la respuesta. Le investigaré un poquito más tomando tu respuesta como guía, me parece interesante.

        Gracias por el código y muy buen blog, saludos.

      • Muchas gracias Pedro.

        Como te digo yo te lo he dicho un poco de memoria, si lo miras casi mejor.

        Gracias por seguir el blog.

      • amigo ps ando haciendo un codificador hash1, aquí hace unos meses ya habian desarrollado uno, pero no logro saber que cadenas eran las que estaban ingresando, necesito saber exactamente que era lo que estaban codificando para repetir el proceso mil y un veces mas jeje…

        pero si dices que es imposible tendre que preguntar que otra cosa puedo hacer para identificarlas…

        Gracias!

    • Me alegro mucho Matias Castro.

      La verdad es que ya no escribo demasiado sobre temas técnicos, pero sigo escribiendo (una vez al mes) sobre el mundo de la informática y la consultoría.

      No obstante si necesitas algo ya sabes.

      Un saludo y gracias por el comentario y me alegro mucho que esos dos códigos te hayan servido.

  4. Hola les envio el codigo para encryptar y desencryptar metedo md5. saludos.

    public static string EncryptionKey=”LLAVE”;
    public Security()
    {

    }

    private static byte[] DecryptBytes(byte[] DecryptBuffer)
    {
    TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();
    provider.Key = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(EncryptionKey));
    provider.Mode = CipherMode.ECB;
    return provider.CreateDecryptor().TransformFinalBlock(DecryptBuffer, 0, DecryptBuffer.Length);
    }
    public static byte[] DecryptBytes(string DecryptString)
    {
    return DecryptBytes(Convert.FromBase64String(DecryptString));
    }
    public static string DecryptString(string DecryptString)
    {
    try
    {
    return Encoding.ASCII.GetString(DecryptBytes(Convert.FromBase64String(DecryptString)));
    }
    catch
    {
    return “Error al tratar de desencryptar”;
    }
    }
    private static byte[] EncryptBytes(byte[] InputString)
    {
    TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();
    provider.Key = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(EncryptionKey));
    provider.Mode = CipherMode.ECB;
    ICryptoTransform transform = provider.CreateEncryptor();
    byte[] inputBuffer = InputString;
    return transform.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
    }
    public static byte[] EncryptBytes(string DecryptString)
    {
    return EncryptBytes(Encoding.ASCII.GetBytes(DecryptString));
    }
    public static string EncryptString(string InputString)
    {
    return Convert.ToBase64String(EncryptBytes(Encoding.ASCII.GetBytes(InputString)));
    }

    • Martín Alfson Martin Alfonso Rubio Romo muchas por leer este blog y muchas más por tu código

      Así da gusto!!!

      Un saludo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s