通过HttpClient从下载的文件生成MD5与原始MD5

时间:2017-08-31 13:37:01

标签: c# hash dotnet-httpclient

我们的一个内部/外部服务(B)正在查询字符串中生成带有加密数据的URL;这是为另一个服务(A)生成的。服务B处理此网址的请求。

我发现我无法生成相同的MD5,也不明白为什么。

以下是相关代码及其在整个流程中的位置。

服务A

  • 在SQL中存储二进制数据
  • 生成MD5并将其与其他信息一起传递给服务B以便接收链接
  • 然后通过电子邮件发送链接

服务B(链接生成)

  • 收到生成链接的请求
  • 存储提供的MD5和其他信息
  • 生成加密的网址并将其返回给服务A

服务B(回复链接请求)

  • URL已解密
  • 获取存储的信息,包括之前传递的MD5
  • 从服务A下载文件
  • 使用与之前相同的MD5算法生成下载的MD5
  • 将此MD5与之前传递的MD5进行比较
  • 他们不匹配

MD5代码

生成MD5的代码如下(服务B):

public static string Generate(this MemoryStream stream)
{
    if (!stream.CanSeek || !stream.CanRead)
        throw new NotSupportedException("Stream must support seek and read to use MD5.Generate()");

    using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
    {
        stream.Position = 0;
        return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", string.Empty).ToLower();
    }
}

代码下载文件并比较MD5

using (HttpClient client = new HttpClient())
{
    client.BaseAddress = new Uri(dcBaseUrl);
    HttpResponseMessage result = client.GetAsync("USDC/Package/" + request.PackageID).Result;

    if (result.StatusCode != HttpStatusCode.OK && result.StatusCode != HttpStatusCode.NotFound)
        throw new InvalidOperationException("Distribution Center threw an exception when trying to download package");

    downloadResponse.Stream =   (MemoryStream)result.Content.ReadAsStreamAsync().Result;
}

string fileMD5 = downloadResponse.Stream.Generate();

// This is ALWAYS false, getting different MD5 and do not know wht
if (!md5.Equals(fileMD5))
    throw new InvalidOperationException("md5 mismatch");

我怀疑这是我下载文件的方式,虽然我尝试了很多方法来获取内容,包括:

byte[] package = result.Content.ReadAsByteArrayAsync().Result;
downloadResponse.Stream.Write(package, 0, package.Length);
string fileMD5 = downloadResponse.Stream.Generate();

更新

将文件从两个位置保存到磁盘。文件是一样的:

enter image description here

0 个答案:

没有答案