2015-04-05 12 views
5

Trước khi bạn đi lặp lại câu hỏi này, tôi sẽ giải thích cho bạn những gì tôi biết, những gì tôi đã đọc các câu hỏi khác, và tại sao điều này không làm việc cho tôi.java.lang.SecurityException với sự phản ánh

Mục tiêu của tôi với điều này là để thực hiện phản ánh một trò chơi dựa trên java mà tôi có .jar cho. Tôi đính kèm nó như là một thư viện bên ngoài trong dự án nhật thực của tôi.

Tôi nhận được lỗi

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

trên dòng

Class clazz = Client.class; 

Bây giờ như đã đề cập trong câu hỏi khác. Lý do của lỗi này là tôi có hai thư viện được tham chiếu đã được ký khác nhau? (Có lẽ nghĩa là chúng được biên dịch với các phiên bản khác nhau của java?).

Chỉ có hai thư viện tôi tham chiếu là hệ thống JRE (dự án của tôi được xây dựng trên 1,7) và .jar của trò chơi.

Lỗi này có xảy ra nếu tệp .jar được biên dịch trên 1.6 không? Tôi có nên làm lại dự án của mình như sử dụng JRE 1.6 không? Làm cách nào tôi có thể cho biết phiên bản JRE mà khách hàng đã được biên dịch?

Cảm ơn!

Chỉnh sửa: Một ý nghĩ khác mà tôi có là tệp .jar của trò chơi có các lớp có chữ ký khác nhau (có lẽ để ngừng phản chiếu). Điều này có thể không?

Trả lời

5

Điều tôi cho là đang theo dõi.

Bạn có trong (đã ký) jar trò chơi sau

the/game/Client.class 

và trong mã (có thể là unsigned) phản ánh của bạn, bạn có

the/game/ReflectionStuff.class 

Điều này sẽ gây ra ngoại lệ trên.

chỉnh sửa

Tìm dưới một PoC nhỏ để chứng minh vấn đề. Lớp đầu tiên được gọi từ một gói cụ thể định nghĩa khóa đã ký phải giống với tất cả các lớp trong cùng một gói.

public class Client { 
} 

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

biên dịch mã

javac -d bin/ Client.java ReflectionStuff.java 

tạo các tập tin jar

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

tạo ra một chìa khóa cho việc ký kết

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

dấu chỉ các trò chơi jar

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

gọi lớp unsigned từ cùng một gói (gói mặc định)

java -cp SignedGame.jar;Reflection.jar ReflectionStuff 

Để giải quyết vấn đề di chuyển các lớp thành các gói Java khác nhau.

+0

Vì mã của tôi và .jar không phải từ cùng một nguồn là có cách nào để xác định chữ ký của jar/Client.class và bắt chước nó/sao chép nó? – k9b

+2

@ k9b Nếu bạn không sở hữu khóa ký tên, không có cách nào để sao chép nó. Điều này sẽ chống lại việc ký kết một tệp Jar. – SubOptimal

+0

Nếu bạn được phép thực hiện việc này, bạn có thể truy cập và mở rộng các lớp riêng tư của một lọ đã ký, điều này nghe có vẻ không an toàn. (Theo quan điểm của người ký, nghĩa là.) – biziclop

Các vấn đề liên quan