Google cam kết thúc đẩy công bằng chủng tộc cho các cộng đồng Đen. Xem thế nào.
Trang này được dịch bởi Cloud Translation API.
Switch to English

Sơ đồ chữ ký APK v3

Android 9 hỗ trợ xoay phím APK , cung cấp cho ứng dụng khả năng thay đổi khóa ký của họ như là một phần của bản cập nhật APK. Để thực hiện xoay vòng, APK phải chỉ ra mức độ tin cậy giữa khóa ký mới và khóa cũ. Để hỗ trợ xoay khóa, chúng tôi đã cập nhật lược đồ chữ ký APK từ v2 lên v3 để cho phép các khóa mới và cũ được sử dụng. V3 thêm thông tin về các phiên bản SDK được hỗ trợ và cấu trúc bằng chứng xoay vòng vào khối ký APK.

Khối ký APK

Để duy trì khả năng tương thích ngược với định dạng APK v1, chữ ký APK v2 và v3 được lưu trữ bên trong Khối ký tên APK, được đặt ngay trước Thư mục trung tâm ZIP.

Định dạng Khối ký kết APK v3 giống với v2 . Chữ ký v3 của APK được lưu trữ dưới dạng cặp giá trị ID với ID 0xf05368c0.

Sơ đồ chữ ký APK Khối v3

Sơ đồ v3 được thiết kế rất giống với sơ đồ v2 . Nó có cùng định dạng chung và hỗ trợ cùng một ID thuật toán chữ ký , kích thước khóa và đường cong EC.

Tuy nhiên, lược đồ v3 thêm thông tin về các phiên bản SDK được hỗ trợ và cấu trúc bằng chứng xoay vòng.

định dạng

Khối sơ đồ chữ ký APK v3 được lưu trữ bên trong Khối ký tên APK theo ID 0xf05368c0 .

Định dạng của Khối Chữ ký APK v3 theo mẫu của v2:

  • trình tự tiền tố dài của signer tiền tố chiều dài:
    • signed data tiền tố dài:
      • chuỗi dài-tiền tố có độ dài tiền tố digests :
        • signature algorithm ID (4 byte)
        • digest (tiền tố dài)
      • chuỗi dài-tiền tố của X.509 certificates :
        • chiều dài-tiền tố X.509 certificate (theo mẫu DER ASN.1)
      • minSDK ( minSDK ) - người ký này nên được bỏ qua nếu phiên bản nền tảng nằm dưới con số này.
      • maxSDK ( maxSDK ) - người ký này nên được bỏ qua nếu phiên bản nền tảng cao hơn con số này.
      • chuỗi tiền tố có độ dài của additional attributes tiền tố độ dài:
        • ID (uint32)
        • value (độ dài biến: chiều dài của thuộc tính bổ sung - 4 byte)
        • ID - 0x3ba06f8c
        • value - Cấu trúc bằng chứng xoay
    • minSDK ( minSDK ) - trùng lặp giá trị minSDK trong phần dữ liệu đã ký - được sử dụng để bỏ qua xác minh chữ ký này nếu nền tảng hiện tại không nằm trong phạm vi. Phải khớp với giá trị dữ liệu đã ký.
    • maxSDK ( maxSDK ) - trùng lặp giá trị maxSDK trong phần dữ liệu đã ký - được sử dụng để bỏ qua xác minh chữ ký này nếu nền tảng hiện tại không nằm trong phạm vi. Phải khớp với giá trị dữ liệu đã ký.
    • trình tự tiền tố dài của signatures tiền tố dài:
      • signature algorithm ID (uint32)
      • signature tiền tố dài trên signed data
    • public key tiền tố dài (dạng SubjectPublicKeyInfo, ASN.1 DER)

Cấu trúc bằng chứng xoay vòng và tự tin

Cấu trúc xoay vòng bằng chứng cho phép các ứng dụng xoay chứng chỉ ký mà không bị chặn trên các ứng dụng khác mà chúng giao tiếp. Để thực hiện điều này, chữ ký ứng dụng chứa hai phần dữ liệu mới:

  • khẳng định cho các bên thứ ba rằng chứng chỉ ký của ứng dụng có thể được tin cậy ở bất cứ nơi nào người tiền nhiệm của nó được tin cậy
  • các ký hiệu cũ hơn của ứng dụng mà bản thân ứng dụng vẫn tin tưởng

Thuộc tính Proof-of-rotation trong phần dữ liệu đã ký bao gồm một danh sách liên kết đơn, với mỗi nút chứa chứng chỉ ký được sử dụng để ký các phiên bản trước của ứng dụng. Thuộc tính này có nghĩa là để chứa các cấu trúc dữ liệu bằng chứng xoay vòng và cấu trúc dữ liệu tự tin tưởng cũ. Danh sách được sắp xếp theo phiên bản với chứng chỉ ký cũ nhất tương ứng với nút gốc. Cấu trúc dữ liệu bằng chứng xoay được xây dựng bằng cách có chứng chỉ trong mỗi nút ký tên tiếp theo trong danh sách, và do đó triển khai từng khóa mới với bằng chứng rằng nó phải được tin cậy như (các) khóa cũ.

Cấu trúc dữ liệu tự tin cậy cũ-certs được xây dựng bằng cách thêm cờ vào mỗi nút cho biết tư cách thành viên và thuộc tính của nó trong tập hợp. Ví dụ: một cờ có thể xuất hiện chỉ ra rằng chứng chỉ ký tại một nút đã cho là đáng tin cậy để có được quyền chữ ký Android. Cờ này cho phép các ứng dụng khác được ký bởi chứng chỉ cũ vẫn được cấp giấy phép chữ ký được xác định bởi một ứng dụng được ký với chứng chỉ ký mới. Bởi vì toàn bộ thuộc tính Proof-of-rotation nằm trong phần dữ liệu đã ký của trường signer v3, nên nó được bảo vệ bởi khóa được sử dụng để ký apk có chứa.

Định dạng này loại trừ nhiều khóa ký và hội tụ các chứng chỉ ký tổ tiên khác nhau thành một (nhiều nút bắt đầu cho một nhóm chung).

định dạng

Bằng chứng xoay vòng được lưu trữ bên trong Khối Chữ ký APK v3 theo ID 0x3ba06f8c . Định dạng của nó là:

  • trình tự tiền tố dài của các levels tiền tố levels dài:
    • signed data tiền tố dài (bằng chứng nhận trước đó - nếu tồn tại)
      • chiều dài-tiền tố X.509 certificate (theo mẫu DER ASN.1)
      • signature algorithm ID (uint32) - thuật toán được sử dụng bởi cert ở cấp độ trước
    • flags (uint32) - các cờ cho biết liệu chứng chỉ này có nên nằm trong cấu trúc tự tin cũ hay không và cho hoạt động nào.
    • signature algorithm ID (uint32) - phải khớp với mã từ phần dữ liệu đã ký ở cấp độ tiếp theo.
    • signature tiền tố dài trên signed data ở trên

Nhiều chứng chỉ

Android hiện xử lý một APK được ký với nhiều chứng chỉ là có một danh tính ký duy nhất tách biệt với các certs bao gồm. Do đó, thuộc tính Proof-of-rotation trong phần dữ liệu đã ký tạo thành một biểu đồ chu kỳ có hướng, có thể được xem tốt hơn dưới dạng danh sách liên kết đơn, với mỗi bộ ký hiệu cho một phiên bản nhất định đại diện cho một nút. Điều này làm tăng thêm độ phức tạp cho cấu trúc bằng chứng xoay (phiên bản nhiều người ký bên dưới). Đặc biệt, đặt hàng trở thành một mối quan tâm. Hơn nữa, không còn có thể ký APK một cách độc lập, bởi vì cấu trúc bằng chứng xoay phải có các ký hiệu cũ ký vào bộ giấy mới, thay vì ký từng cái một. Ví dụ: APK được ký bởi khóa A muốn được ký bởi hai khóa B và C mới không thể có người ký B chỉ bao gồm chữ ký của A hoặc B, vì đó là một danh tính ký khác với B và C. Điều này sẽ có nghĩa là người ký phải phối hợp trước khi xây dựng một cấu trúc như vậy.

Nhiều người ký thuộc tính bằng chứng xoay

  • chuỗi tiền tố dài của sets tiền tố độ dài:
    • signed data (theo bộ trước - nếu tồn tại)
      • trình tự certificates độ dài
        • chiều dài-tiền tố X.509 certificate (theo mẫu DER ASN.1)
      • Trình tự signature algorithm IDs (uint32) - một cho mỗi chứng chỉ từ bộ trước đó, theo cùng một thứ tự.
    • flags (uint32) - các cờ cho biết tập hợp các certs này có nên nằm trong cấu trúc certs tự tin cậy cũ hay không và cho hoạt động nào.
    • trình tự tiền tố dài của signatures tiền tố dài:
      • signature algorithm ID (uint32) - phải khớp với mã từ phần dữ liệu đã ký
      • signature tiền tố dài trên signed data ở trên

Nhiều tổ tiên trong cấu trúc bằng chứng xoay

lược đồ v3 cũng không xử lý hai khóa khác nhau quay cùng một khóa ký cho cùng một ứng dụng. Điều này khác với trường hợp mua lại, nơi công ty mua lại muốn chuyển ứng dụng đã mua sang sử dụng khóa ký để chia sẻ quyền. Việc mua lại được xem như một trường hợp sử dụng được hỗ trợ bởi vì ứng dụng mới sẽ được phân biệt bằng tên gói của nó và có thể chứa cấu trúc bằng chứng xoay vòng của chính nó. Trường hợp không được hỗ trợ, của cùng một ứng dụng có hai đường dẫn khác nhau để đến cùng một chứng chỉ, phá vỡ rất nhiều giả định được đưa ra trong thiết kế xoay vòng phím.

xác minh

Trong Android 9 trở lên, APK có thể được xác minh theo sơ đồ APK Chữ ký v3, v2 hoặc sơ đồ v1. Các nền tảng cũ hơn bỏ qua chữ ký v3 và cố gắng xác minh chữ ký v2, sau đó v1.

Quy trình xác minh chữ ký APK

Hình 1. Quy trình xác minh chữ ký APK

Xác minh APK Chữ ký v3

  1. Xác định vị trí Khối ký APK và xác minh rằng:
    1. Hai trường kích thước của Khối ký kết APK chứa cùng một giá trị.
    2. ZIP Central Directory ngay lập tức được theo sau bởi ZIP End of Central Directory record.
    3. ZIP End of Central Directory không được theo sau bởi nhiều dữ liệu hơn.
  2. Xác định vị trí Khối chữ ký APK đầu tiên v3 Khối bên trong Khối ký APK. Nếu Khối v3 có mặt, hãy chuyển sang bước 3. Mặt khác, quay lại xác minh APK bằng sơ đồ v2 .
  3. Đối với mỗi signer trong Khối Chữ ký APK v3 với phiên bản SDK tối thiểu và tối đa nằm trong phạm vi của nền tảng hiện tại:
    1. Chọn signature algorithm ID được hỗ trợ mạnh nhất từ signatures . Thứ tự sức mạnh tùy thuộc vào từng phiên bản triển khai / nền tảng.
    2. Xác nhận signature tương ứng từ signatures đối với signed data bằng public key . (Bây giờ an toàn để phân tích signed data .)
    3. Xác minh các phiên bản SDK tối thiểu và tối đa trong dữ liệu đã ký khớp với các phiên bản được chỉ định cho signer .
    4. Xác minh rằng các danh sách đặt hàng của các ID thuật toán chữ ký trong digestssignatures là giống hệt nhau. (Điều này là để ngăn chặn tước / bổ sung chữ ký.)
    5. Tính toán tiêu hóa nội dung APK bằng thuật toán digest giống như thuật toán digest được sử dụng bởi thuật toán chữ ký.
    6. Xác minh rằng tiêu hóa tính là giống hệt nhau để tương ứng digest từ digests .
    7. Xác minh rằng SubjectPublicKeyInfo những người đầu tiên certificate của certificates là giống với public key .
    8. Nếu thuộc tính Proof-of-rotation tồn tại cho signer xác minh rằng cấu trúc là hợp lệ và signer này là chứng chỉ cuối cùng trong danh sách.
  4. Xác minh thành công nếu tìm thấy chính xác một signer trong phạm vi của nền tảng hiện tại và bước 3 đã thành công cho signer đó.

Thẩm định

Để kiểm tra xem thiết bị của bạn có hỗ trợ v3 đúng cách hay không, hãy chạy thử nghiệm PkgInstallSignatureVerificationTest.java CTS trong cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .