2010-08-02 7 views
20

Đây không phải là câu hỏi về cách ký một tệp .apk. Tôi muốn biết việc ký kết thực sự có nghĩa là gì và nó được thực hiện như thế nào.Làm thế nào để tệp .apk được ký

Bên trong tệp .apk có thư mục META-INF và bên trong có hai tệp.

Đầu tiên là CERT.SF chứa SHA1 băm cho các thành phần khác nhau và trông như thế này:

Name: res/layout/main.xml 
SHA1-Digest: Cox/T8fN1X9Hv4VqjH9YKqc/MsM= 

Name: AndroidManifest.xml 
SHA1-Digest: wZ418H9Aix1LNch3ci7c+cHyuZc= 

Name: resources.arsc 
SHA1-Digest: P+uoRrpFyVW6P3Wf+4vuR2ZSuXY= 

Name: classes.dex 
SHA1-Digest: cN3zXtGii9zuTOkBqDTLymeMZQI= 

Ngoài ra còn có một tập tin gọi CERT.RSA. Tôi cho rằng đó là chìa khóa công khai để xác minh chữ ký.

Câu hỏi của tôi là, chữ ký cho toàn bộ tệp .apk được lưu trữ ở đâu? Và những gì thực sự đã được ký kết? Nó có thể là một trong hai tập tin

  • .apk sử dụng như một đối tượng nhị phân đơn và điều này được ký
  • hoặc CERT.SF được ký kết, trong đó có băm cá nhân cho các thành phần khác nhau

Sẽ còn nhiều tốt hơn nếu bạn có thể chỉ cho tôi tài liệu về quá trình ký và xác minh chi tiết.

Trả lời

24

Trên thực tế đây không phải là một câu hỏi cụ thể Android nhưng một Java-in-chung câu hỏi tuy nhiên tôi gửi một câu trả lời nào ...

Trước hết: Chỉ có tập tin XXX.SF được ký kết; điều này có nghĩa là tất cả các tệp được đề cập trong tệp XXX.SF được ký "gián tiếp" vì XXX.SF chứa các tệp băm của chúng. Trong thực tế tất cả các tập tin không nằm trong "Meta-Inf" nên có băm ở đó! Toàn bộ lưu trữ .apk chưa được ký.

Tệp XXX.SF nhiều hơn hoặc ít hơn một bản sao của tệp MANIFEST.MF. Có một dòng "SHA1-Digest-Manifest" là hàm băm SHA-1 của bản thân "MANIFEST.MF"; các dòng "SHA1-Digest" không chứa các băm của các tệp nhưng các băm của các dòng tương ứng của cây trong tệp Manifest.MF giống như sau:

SHA1 ("Tên: tên tệp" + CR + LF + "SHA1 -Digest: "+ SHA1 (tệp_content) + CR + LF + CR + LF)

Định dạng tệp của XXX.DSA/.RSA giống như chữ ký email S/MIME (đối với nội dung XXX. SF) tuy nhiên dữ liệu không được mã hóa base64 và không sử dụng dòng tiêu đề/đoạn giới thiệu. "openssl smime -sign -outform DER" sẽ tạo ra định dạng này.

Có thể sử dụng nhiều chứng chỉ để ký một tệp ZIP. Trong trường hợp này, nhiều cặp (XXX.SF/.RSA, YYY.SF/.RSA, ...) sẽ tồn tại.

+0

Martin, tôi đang cố gắng sao chép bước cuối cùng (tạo tệp .RSA) bằng .NET. Dữ liệu đầu vào cần ký, tôi có nên xem đó là các mục nhập tệp trong tệp .SF (tức là 3 dòng) không? Dữ liệu này có nên được mã hóa dưới dạng UTF8 hoặc Unicode không? Tôi không thể tạo ra cùng một đầu ra (mặc dù) tương tự như công cụ jarsigner cho cùng một chứng chỉ/dữ liệu. Mọi gợi ý sẽ hữu ích! –