Android 17 (API cấp 37) giới thiệu Lược đồ chữ ký APK v3.2, một lược đồ chữ ký kết hợp được thiết kế để hỗ trợ quá trình chuyển đổi của hệ sinh thái Android sang mật mã học hậu lượng tử (PQC).
Khi ngành triển khai các thuật toán PQC ở quy mô lớn, lược đồ phiên bản 3.2 sẽ cung cấp khả năng bảo vệ chuyên sâu. Bạn phải ký APK bằng cả thuật toán cổ điển (chẳng hạn như RSA hoặc ECDSA) và thuật toán PQC. Phương pháp kết hợp này sử dụng mật mã học cổ điển để bảo vệ APK của bạn trong khi chống lại các mối đe doạ từ máy tính lượng tử.
Mục đích và thông tin chi tiết
Lược đồ phiên bản 3.2 hoạt động như một cơ chế chuyển đổi tiêu chuẩn, phù hợp với ngành. Với phương pháp kết hợp này, bạn sẽ nhận được các lợi ích chống lại công nghệ lượng tử của PQC trong khi vẫn tiếp tục dựa vào tính bảo mật đã được chứng minh của các thuật toán chữ ký cổ điển. Sau khi các thuật toán PQC mới được tiêu chuẩn hoá đạt được độ hoàn thiện về hoạt động ở quy mô lớn, bạn có thể chuyển từ cấu hình kết hợp này sang một khoá ký PQC duy nhất. Nền tảng hỗ trợ lược đồ chữ ký v3.2 bắt đầu từ Android 17. Các phiên bản Android thấp hơn sẽ bỏ qua khối v3.2 và sử dụng các lược đồ trước đó để xác minh chữ ký.
Để duy trì tính bảo mật và ngăn chặn các cuộc tấn công hạ cấp trong quá trình chuyển đổi này, lược đồ v3.2 sẽ thực thi các hành vi sau:
- Tài liệu khoá mới: Để chuyển sang khối kết hợp, bạn cần tạo các khoá cổ điển và khoá PQC mới. Không sử dụng lại tài liệu khoá giữa các cấu hình kết hợp và không kết hợp.
- Xoay vòng ngầm: Nền tảng này coi khối kết hợp là một hoạt động xoay vòng khoá ngầm. Nền tảng sẽ thêm khoá cổ điển mới vào dòng ký hiện có của ứng dụng dưới dạng khoá gần cuối cùng và coi khoá PQC mới là danh tính ký hiện tại của ứng dụng.
- Dòng dõi được chia sẻ: Để thực thi thành công quy trình xoay vòng ngầm, cả khoá cổ điển mới và khoá PQC mới trong khối kết hợp phải có cùng dòng dõi ký. Bạn phải sao chép nhật ký ký hiện có của ứng dụng (cho dù là một khoá gốc duy nhất hay một dòng khoá đã xoay vòng trước đó) cho cả hai trình ký kết kết hợp mới. Nền tảng sử dụng dòng dõi dùng chung này để xác minh rằng thực thể chuyển ứng dụng sang lược đồ kết hợp là chủ sở hữu hợp pháp của danh tính ký hiện tại của ứng dụng.
- Hạn chế đối với một trình ký PQC: Trong lần triển khai PQC ban đầu, Android hạn chế rõ ràng việc sử dụng các thuật toán PQC đối với khối kết hợp v3.2. Nền tảng này không xác minh cấu hình PQC có một trình ký bằng các lược đồ chữ ký trước đó, chẳng hạn như v2, v3.0 hoặc v3.1.
- Chuyển đổi ngược lại: Khi chuyển đổi từ một khối kết hợp phiên bản 3.2 trở lại khối một người ký (có thể là người ký cổ điển hoặc người ký PQC khi được hỗ trợ trong một bản phát hành trong tương lai), nền tảng sẽ xác minh rằng cả khoá cổ điển và khoá PQC trong khối kết hợp đều có trong dòng ký mới và chứng thực cho người ký đơn mới.
Các phương pháp hay nhất để chuyển đổi
Để duy trì khả năng tương thích với các phiên bản Android thấp hơn và cung cấp một đường dẫn nâng cấp an toàn trong quá trình chuyển đổi sang quy trình ký PQC, các APK phải tiếp tục bao gồm một khối chữ ký v3.0 hoặc v3.1 tiêu chuẩn được ký bằng một khoá cổ điển duy nhất. Vì chỉ Android 17 (API cấp 37) trở lên mới hỗ trợ lược đồ kết hợp v3.2, nên yêu cầu này cho phép các thiết bị chạy phiên bản thấp hơn xác minh và cài đặt ứng dụng.
Cấu hình dự phòng cổ điển
Để cung cấp một mạng lưới an toàn trong quá trình chuyển đổi PQC, hãy triển khai cấu hình dự phòng cổ điển.
- Ứng dụng hiện có: Khoá ký hiện tại của ứng dụng (K0) đóng vai trò là nền tảng tự nhiên cho phương án dự phòng này.
- Ứng dụng mới: Tạo khoá ký cổ điển cơ sở, K0, cùng với các khoá kết hợp mới, C_K1 và PQC_K1, để thiết lập danh tính ban đầu.
Trong cả hai trường hợp, APK phải có một khối chữ ký tiêu chuẩn v3.0 hoặc v3.1 do khoá cổ điển K0 ký, cùng với khối kết hợp v3.2 do các khoá kết hợp mới C_K1 và PQC_K1 ký.
Trong quá trình triển khai ban đầu của lược đồ v3.2, dòng ký cho khối kết hợp sẽ cấp khả năng ROLLBACK cho K0. Nếu xảy ra vấn đề về việc triển khai, thì khả năng này cho phép ứng dụng quay lại chữ ký cổ điển mà không làm gián đoạn các bản cập nhật của người dùng. Sau khi có đủ dữ liệu thời gian chạy để xác nhận rằng việc triển khai kết hợp đã ổn định, bạn nên xoá chức năng ROLLBACK trong các bản cập nhật tiếp theo để bảo mật hoàn toàn các khoá mới.
Các yêu cầu về cấu hình dài hạn
Bạn phải duy trì cấu hình ký kết kết hợp này miễn là ứng dụng của bạn nhắm đến một bản phát hành nền tảng chỉ hỗ trợ lược đồ kết hợp. Ngay cả khi một phiên bản nền tảng hỗ trợ khoá PQC có một trình ký, bạn vẫn phải ký mọi APK nhắm đến một bản phát hành yêu cầu khối kết hợp v3.2 bằng cả hai khoá.
Khối lược đồ chữ ký APK phiên bản 3.2
Khối ký APK lưu trữ khối chữ ký v3.2 cùng với mọi khối chữ ký v2, v3.0 và v3.1.
Cấu trúc khối v3.2 tương tự như v3.0, nhưng sử dụng một mã nhận dạng khối mới, 0x70e1c89f, để báo hiệu rằng đó là một khối kết hợp. Một khối v3.2 hợp lệ phải chứa đúng hai trình ký.
Các thuật toán được hỗ trợ
Lược đồ v3.2 ban đầu hỗ trợ các thuật toán chữ ký PQC sau:
- ML-DSA-65
- ML-DSA-87
Những thuật toán này được ghép nối với các thuật toán chữ ký cổ điển tiêu chuẩn (chẳng hạn như các thuật toán được hỗ trợ trong phiên bản 3.0 và 3.1) để tạo thành khối kết hợp.
Định dạng
Khối ký APK lưu trữ khối Lược đồ chữ ký APK phiên bản 3.2 trong mã nhận dạng 0x70e1c89f.
Định dạng của khối v3.2 giống với v3.0, nhưng chuỗi cấp cao nhất của các phần tử trình ký phải chứa chính xác hai mục tiêu nhắm đến cùng một phiên bản SDK:
- chuỗi có tiền tố độ dài của trình ký có tiền tố độ dài:
- trình ký có tiền tố độ dài (Cổ điển)
- trình ký có tiền tố độ dài (PQC)
Mỗi trình ký đều sử dụng định dạng v3 tiêu chuẩn:
- dữ liệu đã ký có tiền tố chiều dài:
- chuỗi có tiền tố độ dài của các thông báo có tiền tố độ dài:
- mã nhận dạng thuật toán chữ ký (4 byte)
- digest (có tiền tố độ dài)
- chuỗi chứng chỉ có tiền tố độ dài:
- chứng chỉ X.509 có tiền tố độ dài (biểu mẫu ASN.1 DER)
- minSDK (uint32)
- maxSDK (uint32)
- chuỗi có tiền tố độ dài của các thuộc tính bổ sung có tiền tố độ dài:
- Mã nhận dạng (uint32)
- giá trị (độ dài thay đổi: độ dài của thuộc tính bổ sung – 4 byte)
- minSDK (uint32)
- maxSDK (uint32)
- chuỗi có tiền tố độ dài của các chữ ký có tiền tố độ dài:
- mã nhận dạng thuật toán chữ ký (4 byte)
- chữ ký có tiền tố độ dài trên dữ liệu đã ký
- khoá công khai có tiền tố chiều dài (
SubjectPublicKeyInfo, biểu mẫu ASN.1 DER)
Xác minh
Trên Android 17 (cấp độ API 37) trở lên, để xác minh chữ ký v3.2, nền tảng này sẽ xác minh cả đối tượng ký cổ điển và đối tượng ký PQC, xác nhận khả năng tương thích của chúng và kiểm tra dòng dõi xoay vòng ngầm ẩn. Trên các bản phát hành nền tảng Android 16 (API cấp 36) trở xuống, nền tảng này không xử lý khối chữ ký kết hợp này và thay vào đó sử dụng các lược đồ trước đó.
Quy trình tổng thể như sau:
- Tìm khối Lược đồ chữ ký APK phiên bản 3.2 (mã nhận dạng 0x70e1c89f).
- Xác minh rằng khối chứa chính xác hai người ký. Nếu có ít hơn hoặc nhiều hơn 2 số, thì quá trình xác minh sẽ không thành công.
- Xác minh rằng một trình ký sử dụng thuật toán chữ ký cổ điển và trình ký còn lại sử dụng thuật toán chữ ký PQC. Nếu cả hai đều là cổ điển hoặc cả hai đều là PQC, thì quá trình xác minh sẽ không thành công.
- Xác minh rằng cả hai trình ký đều nhắm đến chính xác cùng một dải SDK (
minSdkVersionvàmaxSdkVersion). - Đối với mỗi người ký, hãy thực hiện quy trình xác minh tiêu chuẩn phiên bản 3:
- Chọn mã nhận dạng thuật toán chữ ký được hỗ trợ mạnh nhất trong số các chữ ký.
- Xác minh chữ ký tương ứng từ chữ ký đối với dữ liệu đã ký bằng khoá công khai.
- Xác minh rằng
minSdkVersionvàmaxSdkVersiontrong dữ liệu đã ký khớp vớiminSdkVersionvàmaxSdkVersionchưa ký. - Phân tích cú pháp chứng chỉ và xác minh rằng chứng chỉ đầu tiên khớp với khoá công khai.
- Phân tích cú pháp các thuộc tính bổ sung để trích xuất cấu trúc proof-of-rotation.
- Xác minh nhật ký ký (proof-of-rotation):
- Kiểm tra để đảm bảo cả hai người ký đều có nhật ký ký trước đó giống hệt nhau.
- Độ dài dòng dõi phải khớp và tất cả các chứng chỉ cũng như cờ chức năng dẫn đến người ký hiện tại phải giống hệt nhau.
- Nếu nhật ký khớp nhau, hãy hợp nhất các dòng dõi: coi chứng chỉ của trình ký cổ điển là tiền thân của chứng chỉ của trình ký PQC, chỉ định trình ký PQC làm nút cuối hiện tại.
- Xác minh thông báo nội dung:
- Lặp lại thông qua bản đồ tóm tắt cho cả hai người ký.
- Xác minh rằng đối với mọi thuật toán tóm tắt khớp, các giá trị tóm tắt được tính toán đều giống nhau giữa các trình ký cổ điển và PQC.
- Sử dụng các giá trị nhận dạng khớp từ những người ký đã xác minh để xác minh tính toàn vẹn của nội dung APK (tương tự như v2 và v3).
- Nếu ứng dụng đã được cài đặt, hãy xác minh dòng dõi của bản cập nhật gói:
- Cập nhật từ một trình ký duy nhất: Nếu ứng dụng đã cài đặt được ký bằng một khoá cổ điển duy nhất, thì khoá đó phải có trong dòng ký của khối kết hợp mới dưới dạng một khoá tiền nhiệm cho các trình ký kết hợp.
- Cập nhật từ trình ký kết kết hợp để tiếp tục sử dụng trình ký kết kết hợp: Nếu ứng dụng đã cài đặt được ký bằng khối kết hợp v3.2, thì cả khoá cổ điển và khoá PQC trước đó đều phải vẫn là trình ký kết đang hoạt động hiện tại trong khối v3.2 của APK cập nhật, hoặc cả hai khoá đều phải có trong dòng ký mới chứng thực cho các khoá kết hợp mới được xoay vòng.
- Chuyển đổi từ trình ký kết hợp: Nếu ứng dụng đã cài đặt được ký bằng một khối kết hợp v3.2 và APK cập nhật chuyển đổi trở lại một trình ký đơn (PQC hoặc cổ điển), cả hai trình ký kết hợp trước đó phải có trong dòng ký của APK cập nhật và chứng thực cho khoá ký đơn mới.
- Đường dẫn cập nhật không hợp lệ: Nếu nhà phát triển cố gắng cập nhật một ứng dụng được ký kết kết hợp chỉ bằng một trong các khoá kết hợp làm một trình ký duy nhất mà không có quy trình xoay vòng thích hợp, thì quá trình cập nhật sẽ không thành công. Cả hai khoá đều phải được liên kết rõ ràng trong mọi quá trình chuyển đổi để ngăn chặn các cuộc tấn công hạ cấp.
- Nếu có bước nào không thành công, thì quá trình xác minh sẽ không thành công.
Biện pháp bảo vệ chống tước đoạt
Để ngăn chặn các cuộc tấn công hạ cấp đối với các lược đồ chữ ký thấp hơn, lược đồ v3.2 bao gồm việc loại bỏ các thuộc tính bảo vệ tương tự như các lần lặp lại lược đồ trước đó.
Công cụ ký sẽ ghi 2 thuộc tính bảo vệ chống xoá bỏ kết hợp cụ thể vào các thuộc tính bổ sung của khối chữ ký v3.0 và v3.1. Các thuộc tính này xác định ranh giới chính xác của phiên bản SDK mà trong đó phải có và được xác minh khối kết hợp v3.2:
- Thuộc tính phiên bản SDK tối thiểu (mã nhận dạng
0xbf940529): Giá trị của thuộc tính này quy định phiên bản SDK tối thiểu mà khối ký kết kết hợp hỗ trợ. - Thuộc tính phiên bản SDK tối đa (mã nhận dạng
0x9f06b79c): Giá trị của thuộc tính này quy định phiên bản SDK tối đa mà khối ký kết kết hợp hỗ trợ. Thuộc tính này cho phép bạn chuyển sang cấu hình một trình ký khi các bản phát hành nền tảng cao hơn không yêu cầu chữ ký kết hợp.
Nếu nền tảng bỏ qua quy trình xác minh v3.2 vì khối này bị thiếu hoặc phạm vi SDK của khối không áp dụng cho thiết bị, thì nền tảng sẽ xác minh APK dựa trên khối tiếp theo có mặt. Nếu khối trước đó chứa các thuộc tính bảo vệ việc loại bỏ này, thì nền tảng sẽ áp dụng các bước kiểm tra sau:
- Xác minh sự hiện diện và phạm vi: Nếu khối chữ ký v3.0 hoặc v3.1 chứa thuộc tính SDK tối thiểu (ID
0xbf940529, giá trị X) hoặc thuộc tính SDK tối đa (ID0x9f06b79c, giá trị Y), thì nền tảng yêu cầu khối kết hợp v3.2 phải có trong APK. Nền tảng này đọc khối kết hợp để xác minh rằng dải SDK được nhắm đến khớp với các ranh giới do những thuộc tính này chỉ định. Nếu thiếu khối v3.2 hoặc nếu các giá trị mục tiêu SDK tối thiểu và tối đa nội bộ không bằng X và Y, thì nền tảng sẽ từ chối quá trình cài đặt. - Thực thi trong phạm vi: Nếu phiên bản SDK của thiết bị nằm trong phạm vi hợp lệ do các thuộc tính này chỉ định (lớn hơn hoặc bằng X và nhỏ hơn hoặc bằng Y khi bạn cung cấp thuộc tính tối đa), thì nền tảng sẽ yêu cầu nghiêm ngặt khối kết hợp v3.2 để xác minh chữ ký. Nếu xác minh một khối v3.0 hoặc v3.1 trên một thiết bị trong phạm vi SDK mục tiêu này, nền tảng sẽ từ chối quá trình cài đặt vì khối v3.2 đã bị bỏ qua hoặc loại bỏ một cách độc hại.
Bằng cách thực thi các ranh giới này, nền tảng sẽ xác định thời điểm một APK phải chứa khối v3.2. Nếu khối đã bị xoá, nền tảng sẽ từ chối quá trình cài đặt để ngăn chặn cuộc tấn công hạ cấp.
Xác thực việc triển khai
Để kiểm thử việc triển khai lược đồ chữ ký phiên bản 3.2, hãy chạy các bài kiểm thử CTS HybridSignatureVerificationTest.java nằm trong cts/hostsidetests/appsecurity/src/android/appsecurity/cts/.
Các kiểm thử này bao gồm một bộ toàn diện các trường hợp, bao gồm cả quá trình cài đặt thành công, các bản cập nhật từ phiên bản chỉ có chế độ cổ điển, các quá trình chuyển đổi khôi phục bằng cách sử dụng khả năng ROLLBACK và các quy trình xác minh việc giảm thiểu các cuộc tấn công tước đoạt.