2015-04-05 66 views
5

在你複製這個問題之前,我會向你解釋我所知道的,我讀過的其他問題以及爲什麼這不適合我。帶反射的java.lang.SecurityException

我的目標是實現反射基於Java的遊戲,我有.jar。我將它作爲外部庫附加在我的eclipse項目中。

我正在上線

Class clazz = Client.class; 

現在的錯誤

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

在其他問題中提到。這個錯誤的原因是我有兩個被簽名不同的引用庫? (也許這意味着它們是用不同版本的java編譯的?)。

我參考的唯一兩個庫是JRE系統(我的項目基於1.7)和遊戲的jar。

這個錯誤是否會發生,也許如果.jar編譯1.6?我應該使用JRE 1.6重建我的項目嗎?我怎麼知道客戶端編譯的JRE版本?

謝謝!

編輯:我的另一個想法可能是遊戲本身的.jar文件具有不同簽名的類(可能會停止反射)。這可能嗎?

回答

5

我會假設以下。

你必須在(簽字)遊戲罐子下面

the/game/Client.class 

,並在您(可能是無符號)的反射代碼,你有

the/game/ReflectionStuff.class 

這將導致上述異常。

編輯

下面爲一個小的PoC來說明問題。從特定包中調用的第一個類定義了簽名密鑰,該密鑰對於同一個包中的所有類都必須是相同的。

public class Client { 
} 

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

編譯代碼

javac -d bin/ Client.java ReflectionStuff.java 

創建的jar文件

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 2015-04-07 08:53:20

+2

@ k9b如果您不擁有簽名密鑰,則無法將其複製。這會抵消Jar文件的簽名。 – SubOptimal 2015-04-07 08:58:59

+0

如果你被允許這樣做,你可以訪問和擴展簽名jar包的私有類,這聽起來不是一件安全的事情。 (從簽名者的角度來看,就是這樣)。 – biziclop 2015-04-07 09:26:12