Как рассчитать хэши SHA256 в файле подписи .SF JAR? - PullRequest
0 голосов
/ 08 ноября 2018

В настоящее время я пытаюсь написать подписавшего JAR как сторонний проект. В файле манифеста (.MF) я добавляю хэш SHA256 в кодировке Base64 для каждого файла следующим образом:

Name: com/sample/MySample.class
SHA-256-Digest: TRqPMBJdQrIg5jHsAaoT1Rp5fjFjB8z/c2I+AHs5rX8=

В файле подписи (.SF) я должен добавить еще один SHA256-хеш для каждого файла, но я не уверен, как он рассчитывается. В документах говорится, что это хеш SHA256 соответствующего блока манифеста, но хеширование строки от «Имя» до конца дайджеста не дает мне тот же результат, что и оригинальный файл jarsigner.exe. JDK.

Как рассчитать этот хеш?

Я пытался хэшировать различные вещи (например, перефразировать хэш, хэшировать весь блок, хэшировать только имя и хэш), но ничего не получалось. Есть какие-нибудь документы, описывающие лучше, что хэшировать?

1 Ответ

0 голосов
/ 21 февраля 2019

Сначала загрузите байты для кодирования в дайджесте сообщения. Вот как это можно сделать для файла (добавьте необходимые блоки try-catch-finally).

MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");

DigestInputStream digestIs = new DigestInputStream(new FileInputStream(fileToValidate), messageDigest);
OutputStream nullOutputStream = new NullOutputStream();

// Read all bytes for the DigestInputStream to see them
IOUtils.copy(digestIs, nullOutputStream);
digestIs.close()

Затем, как указано в документации, на которую вы ссылаетесь, хеш должен быть представлен в base64. Этот код преобразует переваренный byte[] в строку в кодировке base64:

String fileDigest = new String(Base64.encode(messageDigest.digest(), Base64.NO_WRAP));

Флаг NO_WRAP удаляет только лишние \n в конце строки.

...