Возможно ли иметь SHA1-Digest в файле манифеста java без фактического использования ключа

В настоящее время мы используем jarsigner для подписи нашего jar. Затем мы отображаем некоторые значения SHA1-Digest для некоторых конкретных классов, чтобы доказать внешнему аудитору, что код не изменился между выпусками.

Мы полагаемся только на файл META-INF/xxx.SF для получения информации о дайджесте и никогда не используем файл блока подписи META-INF/xxx.DSA.

Поскольку в нашем коде нам нужен только расчет дайджеста, мне было интересно, возможно ли сгенерировать файл .SF с помощью какого-либо инструмента Java без фактического использования ключа.

Я прочитал http://docs.oracle.com/javase/6/docs/technotes/tools/windows/jarsigner.html, но похоже, что ключ обязателен.


person cbliard    schedule 14.02.2012    source источник


Ответы (2)


Это должно быть возможно. Файл MANIFEST.MF содержит SHA-1 в кодировке Base64 соответствующего файла класса.

Из вашего документа:

In the manifest file, the SHA digest value for each source file is the
digest (hash) of the binary data in the source file. In the .SF file,
on the other hand, the digest value for a given source file is the
hash of the three lines in the manifest file for the source file.

Итак, выполните итерацию по всем файлам классов, вычислите SHA-1, отформатируйте его так, как он отображается в MANIFEST.MF, затем хэшируйте его и отформатируйте, как он отображается в файле SF.

В вычислении нет ключа.

Пример: рассмотрите «jce1

Name: javax/crypto/KeyAgreement.class
SHA1-Digest: c2p0JimzpV0dG+NChGLl5cI7MuY=
<empty line>
2.jar» (или что-то еще, что вы правильно подписали). Это содержит

  1. MANIFEST.MF записи формы

    Name: javax/crypto/KeyAgreement.class
    SHA1-Digest: c2p0JimzpV0dG+NChGLl5cI7MuY=
    <empty line>
    
  2. которые являются Base64 (SHA1-1) «KeyAgreement.class» (путь не имеет значения). Обратите внимание на третью пустую строку. Окончания строк — CRLF (Windows).

  3. Запись META-INF/4JCEJARS.SF

    Name: javax/crypto/KeyAgreement.class
    SHA1-Digest: whGBXE+AvYO6wAoVCdnocOPIrsE=
    

который является хешем не файла, а трех строк выше.

person mgaert    schedule 14.02.2012
comment
То есть вы имеете в виду, что инструмента не существует, и я должен написать код для вычисления файла META-INF/4JCEJARS.SF во время упаковки? Кроме того, я просмотрел исходный код Java 6, и похоже, что jarsigner — единственный инструмент, который генерирует эти строки SHA1-Digest. - person cbliard; 14.02.2012
comment
Я не знаю такого инструмента. Как вы узнали, jarsigner выполняет только подписание плюс хеширование, а не только хеширование. Однако написать такой инструмент jarhash не должно быть слишком сложно. Конечно, это не обязательно должна быть Java. Мой тест для приведенного выше ответа был выполнен с использованием других инструментов командной строки, например, unzip.exe, base64.exe, hex2bin.exe и т. д. Небольшой пакетный сценарий также должен выполнить эту работу. Вы уверены, что вам нужно решение на Java? - person mgaert; 14.02.2012
comment
Правильно, мне не нужно решение Java. На самом деле я также использовал пару инструментов командной строки, чтобы проверить, как вычисляется дайджест, и посмотреть, смогу ли я легко вычислить то же самое значение. Не должно быть слишком сложно написать инструмент «jarhash». Большое спасибо! - person cbliard; 16.02.2012
comment
Вы добились какого-либо прогресса в этом? - person jj_; 01.08.2013
comment
Я тоже пытался изучить теорию, стоящую за этим, но прежде чем я смог программно добраться до нее, я застрял на шаге 2: нет проблем с вычислением действительного sha1-хэша для класса java, но тогда я могу' не придумать соответствующую действительную запись для файла .sf. Всякий раз, когда я пытаюсь вычислить хеш для этих 3 строк выше (включая возврат каретки), я получаю неправильный хэш sha1 (по сравнению с хешем из файла .sf в банке, которую я создаю с помощью команды jar и jarsigner). Кто-нибудь знает, как точно вычислить это? Погуглив, я обнаружил, что мнения о том, что именно хешировать, немного различаются! - person jj_; 01.08.2013
comment
Более подробно: (1) Хэшируйте файл MANIFEST.MF с помощью SHA1: результат C211815C4F80BD83BAC00A1509D9E870E3C8AEC1 (2) Превратите его в двоичный файл длиной 20. (3) Base64-кодируйте этот файл. Результат: whGBXE+AvYO6wAoVCdnocOPIrsE= - person mgaert; 21.08.2013
comment
К вашему сведению: файл MANIFEST.MF имеет длину 84 байта. Двоичное содержимое: 4E 61 6D 65 3A 20 6A 61 76 61 78 2F 63 72 79 70 74 6F 2F 4B 65 79 41 67 72 65 65 6D 65 6E 74 2E 63 6C 61 73 73 6C 61 73 73 2D 1 4 9 0A 413 53 67 65 73 74 3A 20 63 32 70 30 4A 69 6D 7A 70 56 30 64 47 2B 4E 43 68 47 4C 6C 35 63 49 37 4D 75 59 3D 0D 0A 0D 0A - person mgaert; 21.08.2013

Проверка подписи не пройдет...

Почему?

Проверка файла JAR -> Проверка подписи самого файла .SF.

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

Для получения дополнительной информации http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jarsigner.html

person Nik theGeeK    schedule 14.05.2014