Tính năng ký ứng dụng cho phép nhà phát triển xác định tác giả của ứng dụng và cập nhật ứng dụng mà không cần tạo các giao diện và quyền phức tạp. Mọi ứng dụng chạy trên nền tảng Android đều phải được nhà phát triển ký. Google Play hoặc trình cài đặt gói trên thiết bị Android sẽ từ chối các ứng dụng cố gắng cài đặt mà không được ký.
Trên Google Play, tính năng ký ứng dụng là cầu nối giữa niềm tin của Google với nhà phát triển và niềm tin của nhà phát triển với ứng dụng của họ. Nhà phát triển biết rằng ứng dụng của họ được cung cấp, chưa sửa đổi cho thiết bị Android; đồng thời, nhà phát triển có thể chịu trách nhiệm về hành vi của ứng dụng.
Trên Android, việc ký ứng dụng là bước đầu tiên để đặt ứng dụng vào Hộp cát ứng dụng. Chứng chỉ ứng dụng đã ký xác định mã nhận dạng người dùng nào được liên kết với ứng dụng nào; các ứng dụng khác nhau chạy theo các mã nhận dạng người dùng khác nhau. Tính năng ký ứng dụng đảm bảo rằng một ứng dụng không thể truy cập vào bất kỳ ứng dụng nào khác, ngoại trừ thông qua IPC được xác định rõ.
Khi một ứng dụng (tệp APK) được cài đặt trên thiết bị Android, Trình quản lý gói sẽ xác minh rằng APK đã được ký đúng cách bằng chứng chỉ có trong APK đó. Nếu chứng chỉ (hoặc chính xác hơn là khoá công khai trong chứng chỉ) khớp với khoá dùng để ký bất kỳ tệp APK nào khác trên thiết bị, thì tệp APK mới có thể chỉ định trong tệp kê khai rằng tệp này dùng chung UID với các tệp APK khác được ký tương tự.
Ứng dụng có thể được bên thứ ba (OEM, nhà mạng, thị trường thay thế) ký hoặc tự ký. Android cung cấp tính năng ký mã bằng chứng chỉ tự ký mà nhà phát triển có thể tạo mà không cần sự trợ giúp hoặc quyền bên ngoài. Ứng dụng không bắt buộc phải do một cơ quan trung ương ký. Android hiện không thực hiện quy trình xác minh CA cho chứng chỉ ứng dụng.
Các ứng dụng cũng có thể khai báo quyền bảo mật ở cấp độ bảo vệ chữ ký, chỉ hạn chế quyền truy cập vào các ứng dụng được ký bằng cùng một khoá, đồng thời duy trì UID và Hộp cát ứng dụng riêng biệt. Bạn có thể sử dụng tính năng UID dùng chung để tạo mối quan hệ chặt chẽ hơn với Hộp cát ứng dụng dùng chung, trong đó hai hoặc nhiều ứng dụng được ký bằng cùng một khoá nhà phát triển có thể khai báo UID dùng chung trong tệp kê khai của chúng.
Lược đồ ký APK
Android hỗ trợ 3 lược đồ ký ứng dụng:
- Lược đồ phiên bản 1: dựa trên tính năng ký JAR
- Giao thức v2: Giao thức chữ ký APK v2, được giới thiệu trong Android 7.0.
- Lược đồ v3: Lược đồ chữ ký APK v3, được giới thiệu trong Android 9.
Để có khả năng tương thích tối đa, hãy ký ứng dụng bằng tất cả các lược đồ, trước tiên là v1, sau đó là v2 và v3. Các thiết bị chạy Android 7.0 trở lên cài đặt ứng dụng được ký bằng lược đồ v2 trở lên nhanh hơn so với những ứng dụng chỉ được ký bằng lược đồ v1. Các nền tảng Android cũ bỏ qua chữ ký phiên bản 2 trở lên, do đó, cần ứng dụng chứa chữ ký phiên bản 1.
Ký JAR (lược đồ phiên bản 1)
Ký tệp APK đã là một phần của Android ngay từ đầu. Tệp này dựa trên JAR đã ký. Để biết thông tin chi tiết về cách sử dụng lược đồ này, hãy xem tài liệu của Android Studio về Ký ứng dụng.
Chữ ký phiên bản 1 không bảo vệ một số phần của tệp APK, chẳng hạn như siêu dữ liệu ZIP. Trình xác minh APK cần xử lý nhiều cấu trúc dữ liệu không đáng tin cậy (chưa được xác minh) rồi loại bỏ dữ liệu không thuộc phạm vi của chữ ký. Điều này tạo ra một bề mặt tấn công có kích thước lớn. Hơn nữa, trình xác minh APK phải giải nén tất cả các mục đã nén, làm tiêu tốn nhiều thời gian và bộ nhớ hơn. Để giải quyết các vấn đề này, Android 7.0 đã ra mắt Lược đồ chữ ký APK phiên bản 2.
Lược đồ chữ ký APK phiên bản 2 và 3 (lược đồ v2 trở lên)
Các thiết bị chạy Android 7.0 trở lên hỗ trợ lược đồ chữ ký APK phiên bản 2 (lược đồ v2) trở lên. (Lược đồ v2 đã được cập nhật lên v3 trong Android 9 để thêm thông tin bổ sung vào khối ký, nhưng vẫn hoạt động như cũ.) Nội dung của tệp APK được băm và ký, sau đó khối ký APK thu được sẽ được chèn vào tệp APK. Để biết thông tin chi tiết về cách áp dụng lược đồ v2 trở lên cho một ứng dụng, hãy xem bài viết Lược đồ chữ ký APK v2.
Trong quá trình xác thực, lược đồ v2 trở lên coi tệp APK là một blob và thực hiện việc kiểm tra chữ ký trên toàn bộ tệp. Mọi thay đổi đối với tệp APK, bao gồm cả các thay đổi đối với siêu dữ liệu ZIP, đều làm mất hiệu lực chữ ký APK. Hình thức xác minh APK này nhanh hơn đáng kể và cho phép phát hiện nhiều lớp sửa đổi trái phép hơn.
Định dạng mới có khả năng tương thích ngược, vì vậy, bạn có thể cài đặt các tệp APK được ký bằng định dạng chữ ký mới trên các thiết bị Android cũ (chỉ cần bỏ qua dữ liệu bổ sung được thêm vào tệp APK), miễn là các tệp APK này cũng được ký bằng phiên bản 1.
Hình 1. Quy trình xác minh chữ ký APK
Hàm băm toàn bộ tệp của APK được xác minh dựa trên chữ ký v2 trở lên được lưu trữ trong khối ký APK. Hàm băm bao gồm mọi thứ ngoại trừ khối ký APK, chứa chữ ký v2 trở lên. Mọi thay đổi đối với APK bên ngoài khối ký APK đều làm mất hiệu lực chữ ký v2 trở lên của APK. Các tệp APK bị xoá chữ ký v2 trở lên cũng bị từ chối vì chữ ký v1 của các tệp này chỉ định rằng tệp APK đã được ký bằng v2, khiến Android 7.0 trở lên từ chối xác minh tệp APK bằng chữ ký v1.
Để biết thông tin chi tiết về quy trình xác minh chữ ký APK, hãy xem phần Xác minh của Lược đồ chữ ký APK phiên bản 2.