2015-04-05 13 views
5

Bevor du diese Frage duplizierst, erkläre ich dir, was ich weiß, was ich andere Fragen gelesen habe, und warum das für mich nicht funktioniert.java.lang.SecurityException mit Reflektion

Mein Ziel ist es, ein Java-basiertes Spiel zu implementieren, für das ich das .jar habe. Ich füge es als externe Bibliothek in mein Eclipse-Projekt ein.

Ich erhalte den Fehler

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

auf der Linie

Class clazz = Client.class; 

nun wie in anderen Fragen erwähnt. Der Grund für diesen Fehler ist, dass ich zwei referenzierte Bibliotheken habe, die unterschiedlich signiert wurden? (Vielleicht bedeutet, dass sie mit verschiedenen Java-Versionen kompiliert sind?).

Die einzigen zwei Bibliotheken, die ich referenziere, sind das JRE-System (mein Projekt ist auf 1.7 gebaut) und das .jar des Spiels.

Würde dieser Fehler vielleicht auftreten, wenn die .jar auf 1.6 kompiliert wurde? Soll ich mein Projekt als JRE 1.6 neu erstellen? Wie kann ich feststellen, mit welcher JRE-Version der Client kompiliert wurde?

Danke!

Edit: Ein weiterer Gedanke, den ich hatte, ist vielleicht die .jar-Datei des Spiels selbst hat Klassen, die verschiedene Signaturen haben (vielleicht um Reflexion zu stoppen). Ist das möglich?

Antwort

5

Was ich annehmen würde, folgt.

Sie haben in der (signiert) Spiel jar folgende

the/game/Client.class 

und in Ihrem (wahrscheinlich unsigned) Reflexion Code, den Sie haben

the/game/ReflectionStuff.class 

dies die Ausnahme oben führen würde.

bearbeiten

unter einem kleinen PoC finden, das Problem zu demonstrieren. Die erste Klasse, die von einem bestimmten Paket aufgerufen wird, definiert den signierten Schlüssel, der für alle Klassen in demselben Paket gleich sein muss.

public class Client { 
} 

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

kompilieren die Codes

javac -d bin/ Client.java ReflectionStuff.java 

erstellen, um die JAR-Dateien

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

einen Schlüssel für die Unterzeichnung erzeugen

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

Zeichen nur das Spiel jar

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

Aufruf der unsigned-Klasse aus dem gleichen Paket (Standardpaket)

java -cp SignedGame.jar;Reflection.jar ReflectionStuff 

das Problem bewegen, um die Klassen in verschiedene Java-Pakete zu lösen.

+0

Da mein Code und die .jar nicht aus den gleichen Quellen stammen, gibt es eine Möglichkeit, die Signatur der jar/Client.class zu ermitteln und sie nachzuahmen/zu duplizieren? – k9b

+2

@ k9b Wenn Sie den Signaturschlüssel nicht besitzen, können Sie ihn nicht kopieren. Dies würde dem Signieren einer Jar-Datei entgegenwirken. – SubOptimal

+0

Wenn Sie dies tun durften, können Sie private Paketklassen eines signierten Jars aufrufen und erweitern, was sich nicht wie eine sichere Sache anhört. (Aus der Perspektive des Unterzeichners.) – biziclop

Verwandte Themen