Если JAR подписан подписью, может ли подпись защитить JAR? Если нет, то какова цель подписания?
Как указали другие, это не позволяет другим распространять свои копии вашего кода под вашим именем / брендом. Например, предположим, что вы пишете калькулятор и публикуете подписанный байт-код на github, тогда я не могу написать свой собственный байт-код и утверждение (не обнаружив, что это ложный код, если я не найду ключ, с которым он был подписан, что само по себе очень ... очень маловероятно) что это копия вашего калькулятора.
Но почему мы можем декомпилировать любой APK, даже если он защищен подписью платформы?
Потому что это не мешает нам декомпиляции. Мы можем получить исходный код из таких APK, но мы не можем поставить собственный произвольный код на место и заставить других поверить, что он такой же, как ваш.
Проще говоря, подпись является доказательством источника и подлинности кода, не более того.
Edit:
Почему мы не можем извлечь оригинальную подпись из APK? Почему это невозможно?
Поскольку подпись является хешем, генерируется с использованием криптографической хеш-функции и ключа, который хранится только у вас (так называемый закрытый ключ), и открытого ключа, который находится в свободном доступе. Поскольку этот закрытый ключ находится у вас и предполагается, что вы использовали мощную криптографическую хеш-функцию, человеку, пытающемуся выдать себя за этот ключ, потребуется много времени, чтобы найти этот ключ, напрямую попробовав все возможные хэши, что обычно является единственным возможный путь, если у вас нет умного обходного пути, чтобы найти ключ. Открытый ключ находится в открытом доступе и используется для проверки подлинности подписи.
Можем ли мы использовать этот механизм для защиты нашего JAR?
Зависит от того, что вы пытаетесь защитить. Если это олицетворение кем-то другим, то да, на какое-то время, если они каким-то образом не натыкаются на ключ. Очевидно, что против реинжиниринга это не годится