是否可以在不写入文件系统的情况下进行md5检查?

时间:2014-09-15 23:30:10

标签: c# md5 filestream memorystream

基本上我正在做以下事情:

  1. 将加密文件从网站下载到MemoryStream
  2. 解密文件
  3. 将解密后的文件写入文件系统
  4. 再次将其作为FileStream
  5. 重新读回内存
  6. 计算MD5并检查它。
  7. 将文件发送到打印机。
  8. 这是我的代码:

    private async void DownloadFileToBePrinted()
    {
    
        using (WebClient client = new WebClient())
        {
            var data = await client.DownloadDataTaskAsync(new Uri(Url));                
    
            using (var ms = new MemoryStream(data))
            {                    
                valid = DecodeFile(ms);
    
            }
        }
    }
    
    private bool DecodeFile(MemoryStream stream)
    {
        bool valid = true;
    
        try
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                stream.Position = 0;
                var str = reader.ReadToEnd();
    
                File.WriteAllBytes(FILE_TO_BE_PRINTED, this.Decode(str));
    
                using (var md5 = MD5.Create())
                {
                    using (var fs = File.OpenRead(FILE_TO_BE_PRINTED))
                    {
                        var hash = md5.ComputeHash(fs);
    
                        if (ByteToHex(hash) != FileDetails.MD5) // check against stored md5
                            valid = false;
                    }
                }
            }
        }
        catch(Exception ex)
        {
            valid = false;
        }
        return (valid);
    }
    

    这似乎有点低效,除了要求如果可以避免将文件写入文件系统这一事实。

    所以我想知道是否可以在不将文件写入文件系统的情况下执行此操作?如果是这样的话?

1 个答案:

答案 0 :(得分:1)

您可以在没有FileStream的情况下计算MD5,如下所示:

byte[] decoded = this.Decode(str);
var md5 = MD5.Create();
md5.ComputeHash(decoded);