Хеширование текстового файла в целях целостности - PullRequest
0 голосов
/ 05 июля 2018

У меня есть более общее требование отслеживать изменения в файлах активов, которые зафиксированы в исходном коде и развернуты внутри двоичных файлов, но сейчас я реализую его в контексте модульного тестирования и сталкиваюсь с потенциальной проблемой на будущее. Прежде чем задать вопрос TLDR, я покажу много контекстной информации.

Сценарий

Некоторые ресурсы приложения загружаются из файлов CSV, сохраненных в Git-репозитории через ClasspathResource [1], и они могут когда-нибудь измениться. Изменение происходит при фиксации, но для приложения во время выполнения изменение происходит в разных версиях приложения.

Мой тестовый раствор

Я реализовал следующий механизм, чтобы предупредить меня об изменениях в ресурсе:

@Before
public void setUp() throws Exception
{
    assertEquals("Resource file has changed. Make sure the test reflects the changes in the file and update the checksum", MD5_OF_FILE,
                 DigestUtils.md5Hex(new ClassPathResource("META-INF/resources/assets.csv").getInputStream()));

}

По сути, я хочу, чтобы мои модульные тесты не проходили до тех пор, пока я явно не закодирую контрольную сумму файла. Когда я запускаю md5sum assets.txt, я жестко кодирую результат в код, чтобы тесты знали, что они работают с фиксированной версией файла.

Задача

Я запускал тесты на своем собственном Windows-боксе и работал как чудо. Переходя на Linux, я обнаружил, что они не сработали Я сразу понял, что это может быть связано с окончаниями строк , которые я полностью забыл.

В конкретном случае Git настроен для фиксации файлов LF, но извлечение (в Windows) CRLF. Эта конфигурация подходит для работы с исходным кодом.

Так что мне нужно проверить, не изменился ли файл ресурса разумным способом, который позволяет блоку изменять / переинтерпретировать окончания строк. Это особенно верно для приложения времени выполнения, которое будет хранить хэш файла и сравнивать фактический файл активов (который мог измениться), выполняя корректирующие действия при различиях ==> перезагрузки активов.

TL; DR

Учитывая текстовый файл, из которого я могу извлечь и сохранить любой хэш (не только криптографический, я использовал MD5), как я могу сказать, что он изменился независимо от среды, в которой обрабатывается файл, какой может изменить окончания строки?

Примечание У меня есть требование не использовать систему управления версиями в самом активе (например, первая строка имеет инкрементную версию, поскольку разработчики не смогут корректно обновлять).

[1] Обертывание инструмента для пружинных рамок Class.getResourceAsStream

1 Ответ

0 голосов
/ 05 июля 2018

Решением может быть нормализация файла до выбранных окончаний строк, то есть всегда CRLF или всегда LF, а затем вычисление криптографического хэша для этого нормализованного содержимого.

например. вычислить md5sum | dos2unix file и использовать правильный Stream в коде, который нормализует файл на лету

...