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.
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.
Muchas gracias Reinaldo. Me alegro de que este código encaje con lo que necesitas.
un saludo y gracias otra vez.
‘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.
Reblogged this on Un sitio para mi.
Gracias por el Reblog
Muchas gracias por este código :). La verdad que no entiendo por qué el elnguaje no tiene una simple función llamada SHA1(cadena) o algo por el estilo.
Gracias a ti por el comentario UnboundDarkness.
Yo estoy contigo, todo esto tendría que en el framework.
Un saludo y gracias otra vez.
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.
gracias buen aporte !!
Gracias a ti por el comentario.
Un saludo
hey super amigo, me has salvado de una grande!!!, de casualidad no sabes donde consigo el codigo de un decodificador hash? para hacer el proceso inverso?
Hola Danny.
El hash no puede ser decodificado. ¿Para que necesitas hacer el proceso inverso?
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!
Bueno, siento no haber sido de más ayuda. Suerte con tu propósito.
Un saludo
gracias amigo, no hay problema,
Reblogueó esto en Intrudere's Weblog.
gracias por el codigo, ya he sacado 2 ejemplos de tu blog. Suerte y sigue asi!
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.
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
Como desencripto el SHA1?
Hola Ricky.
Tu pregunta ya esta respondida anteriormente: https://adeshoras.wordpress.com/2008/06/23/generando-un-hash-sha1-con-aspnet-y-c-de-forma-sencilla-y-simple/#comment-311
Un saludo