Obtener el hash de un archivo

by Valeriano Tortola 7. marzo 2008 22:02

Esto es un ejemplo de como obtener distintos tipos de hash de un archivo,  me apoyaré en una de las nuevas características de C# 3.0, los métodos extensores, para tener más a mano esta funcionalidad. Como se puede ver en el código implementar nuevos métodos para la obtención de otros tipos de hash es sumamente sencillo.

Hay distintos tipos de hash, en este ejemplo he utilizado MD5y dos versiones de SHA, SHA-1 y SHA256. La necesidad y cualidades de cada uno nos dirán que usar en cada momento.

Estos métodos extienden la funcionalidad de la clase FileStream:

static class FileStreamExtensions
{
    public static String GetMd5Hash(this FileStream fs)
    {
        return getHash(fs, new MD5CryptoServiceProvider());
    }
 
    public static String GetSha1Hash(this FileStream fs)
    {
        return getHash(fs, new SHA1Managed());
    }
 
    public static String GetSha256Hash(this FileStream fs)
    {
        return getHash(fs, new SHA256Managed());
    }
 
    private static String getHash(FileStream fs, HashAlgorithm hash)
    {
        Int64 currentPos = fs.Position;
        try
        {
            fs.Seek(0, SeekOrigin.Begin);
            StringBuilder sb = new StringBuilder();
            foreach (Byte b in hash.ComputeHash(fs))
            {
                sb.Append(b.ToString("X2"));
            }
            return sb.ToString();
        }
        finally
        {
            fs.Seek(currentPos, SeekOrigin.Begin);
        }
    }
}

Cuando delcaremos el namespace de esta clase en nuestra unidad, podemos acceder a los métodos y obtener directamente el hash deseado de un tiro :D

static void Main(string[] args)
{
    FileStream fs = new FileStream(@"C:\mylife.mp3",FileMode.Open);
    Console.WriteLine(fs.GetMd5Hash());
    Console.WriteLine(fs.GetSha1Hash());
    Console.WriteLine(fs.GetSha256Hash());
    fs.Close();
    Console.ReadKey(true);
}

Si extendiesemos directamente la clase Stream tendriamos el problema de que a alguien se le podría ocurrir hacerlo sobre un NetworkStream... con lo que tendríamos una excepción ya que no todos los tipos de Stream soportan Seek ;)

Tags: ,

C# 3.0 | .NET 3.5

Comentarios

07/03/2008 22:09:13 #

trackback

Trackback from Pensando en asíncrono

Obtener el hash de un archivo

Pensando en asíncrono |

07/03/2008 22:09:39 #

trackback

Trackback from vtortola

Obtener el hash de un archivo

vtortola |

Comentarios no permitidos