Проверяем целостность скачанного файла в C#!
После загрузки архива полезно убедиться, что полученные байты совпадают с опубликованной контрольной суммой.
Пусть ожидаемый SHA-256 приходит из источника, отдельно от самого файла. Сначала проверим его формат и превратим шестнадцатеричную строку в байты:
if (expectedHex.Length != 64)
throw new ArgumentException("Неверный SHA-256");
byte[] expected = Convert.FromHexString(expectedHex);
Теперь expected содержит ровно 32 байта. Если строка нужной длины, но содержит не шестнадцатеричные символы, Convert.FromHexString выбросит FormatException. Так произвольный текст не пройдёт за корректный хеш.
Откроем файл потоком, чтобы не загружать весь архив в память:
await using var stream = File.OpenRead(path);
byte[] actual = await SHA256.HashDataAsync(stream);
HashDataAsync прочитает файл до конца и вернёт 32 байта. Для больших файлов потребление памяти остаётся небольшим, поскольку поток обрабатывается постепенно.
Сравним результат с ожидаемым значением:
bool valid = CryptographicOperations.FixedTimeEquals(actual, expected);
if (!valid) throw new InvalidDataException("SHA-256 не совпал");
➡️ C# Ready | #практика
После загрузки архива полезно убедиться, что полученные байты совпадают с опубликованной контрольной суммой.
Пусть ожидаемый SHA-256 приходит из источника, отдельно от самого файла. Сначала проверим его формат и превратим шестнадцатеричную строку в байты:
if (expectedHex.Length != 64)
throw new ArgumentException("Неверный SHA-256");
byte[] expected = Convert.FromHexString(expectedHex);
Теперь expected содержит ровно 32 байта. Если строка нужной длины, но содержит не шестнадцатеричные символы, Convert.FromHexString выбросит FormatException. Так произвольный текст не пройдёт за корректный хеш.
Откроем файл потоком, чтобы не загружать весь архив в память:
await using var stream = File.OpenRead(path);
byte[] actual = await SHA256.HashDataAsync(stream);
HashDataAsync прочитает файл до конца и вернёт 32 байта. Для больших файлов потребление памяти остаётся небольшим, поскольку поток обрабатывается постепенно.
Сравним результат с ожидаемым значением:
bool valid = CryptographicOperations.FixedTimeEquals(actual, expected);
if (!valid) throw new InvalidDataException("SHA-256 не совпал");
➡️ C# Ready | #практика