如何从HttpPostedFileBase文件中获得SHA1和MD5校验和

本文关键字:SHA1 MD5 校验和 HttpPostedFileBase 文件 | 更新日期: 2023-09-27 18:01:38

我想在MVC中获得上传文件的校验和。

当前我正在做这个

public ActionResult Index(HttpPostedFileBase file, string path)
{

    if (file != null)
    {
        string checksumMd5    = HashGenerator.GetChecksum(file.InputStream, HashGenerator.MD5);;
        string checksumSha1   = HashGenerator.GetChecksum(file.InputStream, HashGenerator.SHA1);
   //other logic follows....
    }

但是当我在控制台应用程序中执行并从文件路径读取文件时,

string path = @"C:'Users'anandv4'Desktop'Manifest-5977-681-673.txt";
var md5hash = HashGenerator.GetChecksum(path, HashGenerator.MD5);
var sha1 = HashGenerator.GetChecksum(path, HashGenerator.SHA1);

两者的值不同

生成哈希的代码:

public static string GetChecksum(string fileName, HashAlgorithm algorithm)
{
    using (var stream = new BufferedStream(File.OpenRead(fileName), 1000000))
    {
        return BitConverter.ToString(algorithm.ComputeHash(stream)).Replace("-", string.Empty);
    }
}
public static string GetChecksum(Stream stream, HashAlgorithm algorithm)
{
    using (stream)
    {
        return BitConverter.ToString(algorithm.ComputeHash(stream)).Replace("-", string.Empty);
    }
}
谁能告诉我这两者的区别是什么?最终,这两个方法都解析为GetChecksum方法

如何从HttpPostedFileBase文件中获得SHA1和MD5校验和

中的流。

如果要对流进行散列,需要在计算散列之前将流的当前位置设置为0。

file.InputStream.Seek(0, SeekOrigin.Begin);

对我来说,这是一个扩展方法的好地方,例如:

//compute hash using extension method:
string checksumMd5    = file.InputStream.GetMD5hash();

被类支持:

using System;
using System.IO;
public static class Extension_Methods
{
    public static string GetMD5hash(this Stream stream)
    {
        stream.Seek(0, SeekOrigin.Begin);
        using (var md5Instance = System.Security.Cryptography.MD5.Create())
        {
            var hashResult = md5Instance.ComputeHash(stream);
            stream.Seek(0, SeekOrigin.Begin);
            return BitConverter.ToString(hashResult).Replace("-", "").ToLowerInvariant();
        }
    }
}