2015-04-05 29 views
5

Bu soruyu kopyalamaya başlamadan önce, ne bildiğimi, diğer soruları okuduğumu ve bunun neden benim için çalışmadığını açıklayacağım.Yansıma ile java.lang.SecurityException

Buradaki amacım, .jar için sahip olduğum bir java tabanlı oyun yansıma uygulamaktır. Tutulma projemde onu harici bir kütüphane olarak ekliyorum. diğer sorular belirtildiği gibi

Ben çizgi Şimdi

Class clazz = Client.class; 

hatayı

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

alıyorum. Bu hatanın nedeni, farklı şekilde imzalanmış iki başvurulan kütüphanem var mı? (Belki de java'nın farklı sürümleriyle derlenmişler?).

Başvuru yaptığım yalnızca iki kitaplık, JRE sistemi (projem 1.7 üzerine kurulu) ve oyunun .jar'ı.

.jar, 1.6'da derlenmişse bu hata oluşuyor olabilir mi? Projemi JRE 1.6'yı kullanıyor muyum? Müşterinin hangi JRE sürümünün derlendiğini nasıl anlarım?

Teşekkürler!

Düzenleme: Sahip olduğum başka bir düşünce, belki de oyunun .jar dosyasının farklı imzalara sahip sınıflara sahip olması (belki de yansımayı durdurmak). Mümkün mü?

cevap

5

Takip edebileceğim şey şu.

Bu yukarıdaki özel durumuna neden sen

the/game/ReflectionStuff.class 

sahip

the/game/Client.class 

aşağıdaki (imzalı) oyun kavanozda ve (muhtemelen imzasız) yansıma kodunda var.

düzenlemek

sorun göstermek için küçük bir PoC altında bulun. Belirli bir paketten çağrılan birinci sınıf, aynı paketteki tüm sınıflar için aynı olması gereken işaretlenmiş anahtarı tanımlar.

public class Client { 
} 

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

javac -d bin/ Client.java ReflectionStuff.java 

imzalanması

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

işareti yalnızca oyun kavanoz

için bir anahtar oluşturmak

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

kavanoz dosyaları oluşturmak kodları derlemek

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

çağrı aynı paketin (varsayılan paketinden) den imzasız sınıf

java -cp SignedGame.jar;Reflection.jar ReflectionStuff 

sorun farklı Java paketleri içine sınıfları taşımak çözmek için.

+0

Kodum ve .jar aynı kaynaklardan olmadığından, jar/Client.class imzasını belirleme ve onu taklit etme/çoğaltmanın herhangi bir yolu var mı? – k9b

+2

@ k9b İmzalama anahtarının sahibi değilseniz, kopyalamanın bir yolu yoktur. Bu bir Jar dosyasının imzalanmasını engeller. – SubOptimal

+0

Bunu yapmanıza izin verildiyse, imzalanmış bir kavanozun paket özel sınıflarına erişebilir ve genişletebilirsiniz, bu da güvenli bir şey gibi görünmez. (Signer'ın perspektifinden, yani.) – biziclop