Почему хэш SHA256 не совпадает после загрузки и выгрузки файла? - PullRequest
0 голосов
/ 31 октября 2019

Я создаю функцию для приложения, чтобы сохранить файл на веб-сервере, сохраняя данные о файле на SQL Server. Я генерирую хэш SHA256 и сохраняю его как BINARY (32), а затем загружаю файл на сервер WebDav с помощью HTTPClient. Позже, когда я хочу просмотреть файл в приложении, я делаю запрос GET, загружаю файл и проверяю хеш SHA256 с сохраненным хешем. Он не совпадает :( Почему?

Я попытался проверить хэш на сервере и на локальной машине, и он тоже не совпадает. Я провел тонну исследований и убедился, что я не былНет хеширования имени файла (вы можете увидеть код ниже).

public static byte[] GetSHA256(string path) {
    using (var stream = File.OpenRead(path)) {
        using (var sha256 = SHA256.Create()) {
            return sha256.ComputeHash(stream);
        }
   }
}

Для загрузки файла:

public async Task<bool> Upload(string path, string name) {
    var storedHash = GetSHA256(path/name);
    //Store this hash in a database, omitted for brevity
    using (var file = File.OpenRead(path)) {
        var content = new MultipartFormDataContent();
        content.Headers.ContentType.Media = "multipart/form-data";
        content.Add(new StreamContent(file));
        var result = await HttpClient.PutAsync(uri, content);
  }
}

Для загрузки:

var result = await HttpClient.GetAsync(uri);
using (var stream = await result.Content.ReadAsStreamAsync()) {
    var fileInfo = new FileInfo("TestFile");
    using(var fileStream = fileInfo.Open(FileMode.CreateNew, FileAccess.ReadWrite, FileShare.Delete)) {
        await stream.CopyToAsync(fileStream);
    }
}
var downloadedFileHash = GetSHA256("TestFile");

//check if downloadedFileHash matches the storedHash by comparing byte[] length and content with for loop.

Iожидать, что хеш будет совпадать. Я знаю, что мне не хватает нескольких using операторов и другого кода, но я для краткости пропустил кучу.

РЕДАКТИРОВАТЬ: Хеши для загруженных файлов остаются прежними, поэтому проблемане загружает, а загружает. Я загружал одни и те же файлы несколько раз, но получаю разные хеш-коды для каждого. Но разные хеш-коды остаются постоянными.

1 Ответ

0 голосов
/ 31 октября 2019

Извините, вы все можете удалить этот вопрос, потому что я нашел проблему / ответ, но все еще не уверен, почему это происходит.

Оказывается, webdav по какой-то причине добавляет дополнительные заголовки в мой файл, см. : Информация заголовка записывается в файл при PUT-входе на сервер Webdav

Странная вещь. Вот я и столкнулся с этим постом. https://blogs.msdn.microsoft.com/robert_mcmurray/2011/10/18/sending-webdav-requests-in-net-revisited/

Переписал мой код, чтобы он был

public static async Task<HttpResponseMessage> Upload(string path, string name, FileStream file) {
    var method = new HttpMethod(@"PUT");
    var message = new HttpRequestMessage(method, path/name) {
        Content = new StreamContent(file)
    };

    return await HttpClient.SendAsync(message);
}

И это работает ... Но мне интересно, чем отличаются два метода загрузки.

...