2015-04-05 4 views
5

Прежде чем вы повторите этот вопрос, я объясню вам, что я знаю, что я прочитал и другие вопросы, и почему это не работает для меня.java.lang.SecurityException с отражением

Моя цель - реализовать отражение игры на основе Java, для которой у меня есть .jar. Я прикрепляю его как внешнюю библиотеку в своем проекте eclipse.

Я получаю ошибку

java.lang.SecurityException: class "Client"'s signer information does not match signer information of other classes in the same package 

на линии

Class clazz = Client.class; 

Теперь, как уже упоминалось в других вопросах. Причиной этой ошибки является то, что у меня есть две ссылки на библиотеки, которые были подписаны по-разному? (Возможно, смысл их компилируется с разными версиями java?).

Только две библиотеки, на которые я ссылаюсь, являются системой JRE (мой проект построен на 1.7) и .jar игры.

Возможно, возникла бы эта ошибка, если бы .jar был скомпилирован на 1.6? Должен ли я переделать свой проект с использованием JRE 1.6? Как я могу определить, с чем была скомпилирована клиентская версия JRE?

Спасибо!

Редактировать: Еще одна мысль, которая у меня была, это, возможно, файл .jar самой игры имеет классы, которые имеют разные подписи (возможно, чтобы остановить отражение). Это возможно?

ответ

5

Я бы предположил следующее.

Вы имеете в (подпись) игры баночке следующий

the/game/Client.class 

и в коде (возможно без знака) отражения у вас есть

the/game/ReflectionStuff.class 

Это вызовет исключение выше.

редактировать

Найдите ниже небольшой РоС, чтобы продемонстрировать эту проблему. Первый класс, вызванный из определенного пакета, определяет подписанный ключ, который должен быть одинаковым для всех классов в одном пакете.

public class Client { 
} 

public class ReflectionStuff { 
    public static void main(String[] args) { 
     Class clazz = Client.class; 
    } 
} 

компилировать коды

javac -d bin/ Client.java ReflectionStuff.java 

создать опарник

mkdir bin 
jar cf Game.jar -C bin/ Client.class 
jar cf Reflection.jar -C bin/ ReflectionStuff.class 

генерировать ключ для подписания

keytool -genkey -alias signGame -keystore gamestore.jks -storepass passStore -keypass passGame -dname "CN=John Doe" 

знак только игра баночка

jarsigner -keystore gamestore.jks -storepass passStore -keypass passGame -signedjar SignedGame.jar Game.jar signGame 

вызов без знака класса из одного пакета (пакет по умолчанию)

java -cp SignedGame.jar;Reflection.jar ReflectionStuff 

Чтобы решить проблему перемещения классов в различных Java пакетов.

+0

Поскольку мой код и .jar не из тех же источников, есть ли способ определить подпись jar/Client.class и имитировать его/дублировать? – k9b

+2

@ k9b Если у вас нет ключа подписи, его невозможно скопировать. Это будет противодействовать подписанию файла Jar. – SubOptimal

+0

Если вам было разрешено это сделать, вы могли бы получить доступ и расширить пакетные частные классы подписанной банки, что не похоже на безопасную работу. (С точки зрения подписавшего, то есть.) – biziclop