Отпечаток файла WAR Java

Я пишу JAR-библиотеку, которая может быть включена в любой WAR-файл, отправляя данные журнала на сервер (EDIT: это приложение для Log4j). Чтобы позже сгруппировать журналы, которые исходили из одной и той же версии приложения, но пришли с разных серверов, я хочу сгенерировать отпечаток пальца / контрольную сумму для WAR.

Я думал об использовании элементов classpath и размеров файлов - но просто не могу понять, как лучше.

Как бы вы это сделали?

4 ответа

Решение

Боюсь, что единственный приемлемый ответ: это невозможно без безответственных, мерзких взломов.

Вы можете найти, с некоторым отклонением для контейнеров, местоположение файла для JAR в WAR (может быть, разархивировано) следующим образом:

. AClassInTheJar.class.getProtectionDomain() getCodeSource() getLocation() GetPath()..;

Очевидно, что это предшествует дактилоскопии.

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

Если файл не подписан, вы все равно можете (умеренно) легко вычислить хеш, используя java.security.MessageDigest.

Почему бы вам не создать хеш-сумму MD5 из файла WAR, который реализован в Java SE:

byte[] warBytes;
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(warBytes);
byte[] hash = digest.digest();

Обратитесь к быстрой реализации MD5 в Java и Java SE API.

Другие вопросы по тегам