Android sử dụng khái niệm khóa mật mã được xác thực người dùng yêu cầu các thành phần sau:
- Nhà cung cấp dịch vụ và lưu trữ khóa mật mã. Lưu trữ các khóa mật mã và cung cấp các quy trình tiền điện tử tiêu chuẩn trên đầu các khóa đó. Android hỗ trợ Kho khóa và Keymaster được hỗ trợ bởi phần cứng cho các dịch vụ mật mã, bao gồm cả mật mã được hỗ trợ bởi phần cứng để lưu trữ khóa có thể bao gồm Môi trường thực thi tin cậy (TEE) hoặc Phần tử bảo mật (SE), chẳng hạn như Strongbox.
- Trình xác thực người dùng. Chứng thực sự hiện diện của người dùng và / hoặc xác thực thành công. Android hỗ trợ Gatekeeper để xác thực mã PIN / hình / mật khẩu và Fingerprint để xác thực bằng vân tay. Các thiết bị chạy Android 9 trở lên có thể sử dụng
BiometricPrompt
làm điểm tích hợp duy nhất cho vân tay và sinh trắc học bổ sung. Các thành phần này giao tiếp trạng thái xác thực của chúng với dịch vụ kho khóa thông qua một kênh đã được xác thực. ( Hệ thống Kho khóa Android ở cấp khung cũng được hỗ trợ bởi dịch vụ kho khóa.)
Các thành phần Gatekeeper, Fingerprint và Biometric hoạt động với Keystore và các thành phần khác để hỗ trợ việc sử dụng mã thông báo xác thực được hỗ trợ bởi phần cứng (AuthTokens).
Ghi danh
Vào lần khởi động đầu tiên của thiết bị sau khi khôi phục cài đặt gốc, tất cả các trình xác thực đều được chuẩn bị để nhận đăng ký thông tin xác thực từ người dùng. Người dùng ban đầu phải đăng ký mã PIN / hình / mật khẩu với Gatekeeper. Việc đăng ký ban đầu này tạo ra một mã định danh bảo mật người dùng (SID) 64-bit được tạo ngẫu nhiên, dùng làm mã nhận dạng cho người dùng và như một mã thông báo ràng buộc cho tài liệu mật mã của người dùng. SID của người dùng này được liên kết mật mã với mật khẩu của người dùng; xác thực thành công với Gatekeeper dẫn đến AuthTokens chứa SID người dùng cho mật khẩu đó.
Người dùng muốn thay đổi thông tin xác thực phải xuất trình thông tin xác thực hiện có. Nếu thông tin xác thực hiện có được xác minh thành công, SID của người dùng được liên kết với thông tin xác thực hiện có sẽ được chuyển sang thông tin xác thực mới, cho phép người dùng tiếp tục truy cập các khóa sau khi thay đổi thông tin đăng nhập. Nếu người dùng không xuất trình thông tin xác thực hiện có, thông tin xác thực mới được đăng ký với một SID Người dùng hoàn toàn ngẫu nhiên. Người dùng có thể truy cập thiết bị nhưng các khóa được tạo trong SID của người dùng cũ sẽ bị mất vĩnh viễn. Đây được gọi là một đăng ký không đáng tin cậy .
Trong các trường hợp bình thường, khung Android không cho phép đăng ký không đáng tin cậy, vì vậy hầu hết người dùng sẽ không bao giờ thấy chức năng này. Tuy nhiên, việc buộc đặt lại mật khẩu, do quản trị viên thiết bị hoặc kẻ tấn công, có thể khiến điều này xảy ra.
Xác thực
Sau khi người dùng đã thiết lập thông tin xác thực và nhận được SID người dùng, họ có thể bắt đầu xác thực, quá trình này bắt đầu khi người dùng cung cấp mã PIN, hình mở khóa, mật khẩu hoặc vân tay. Tất cả các thành phần TEE chia sẻ một khóa bí mật mà chúng sử dụng để xác thực thông điệp của nhau.

- Người dùng cung cấp một phương thức xác thực và dịch vụ liên quan thực hiện một yêu cầu đối với daemon được liên kết.
- Đối với mã PIN, hình mở khóa hoặc mật khẩu,
LockSettingsService
yêu cầugatekeeperd
. - Quy trình xác thực dựa trên sinh trắc học phụ thuộc vào phiên bản Android. Trên các thiết bị chạy Android 8.x trở xuống,
FingerprintService
thực hiện yêu cầu gửifingerprintd
). Trên các thiết bị chạy Android 9 trở lên,BiometricPrompt
đưa ra yêu cầu đối với daemon sinh trắc học thích hợp (ví dụ:fingerprintd
cho dấu vân tay hoặc khuônfaced
cho khuôn mặt) bằng cách sử dụng lớpBiometric Manager
thích hợp, chẳng hạn nhưFingerprintManager
hoặcFaceManager
. Bất kể phiên bản nào, xác thực sinh trắc học xảy ra không đồng bộ sau khi yêu cầu được gửi.
- Đối với mã PIN, hình mở khóa hoặc mật khẩu,
- Daemon gửi dữ liệu đến đối tác của nó, điều này tạo ra AuthToken:
- Để xác thực mã PIN / hình / mật khẩu,
gatekeeperd
sẽ gửi mã PIN, hình mở khóa hoặc băm mật khẩu đến Gatekeeper trong TEE. Nếu xác thực trong TEE thành công, Gatekeeper trong TEE sẽ gửi AuthToken chứa SID người dùng tương ứng (được ký bằng khóa AuthToken HMAC) tới đối tác của nó trong hệ điều hành Android. - Để xác thực bằng
fingerprintd
, Fingerd sẽ lắng nghe các sự kiện vân tay và gửi dữ liệu đến Vân tay trong TEE. Nếu xác thực trong TEE thành công, Vân tay trong TEE sẽ gửi AuthToken (được ký bằng khóa AuthToken HMAC) đến đối tác của nó trong hệ điều hành Android. - Đối với xác thực sinh trắc học khác, daemon sinh trắc học thích hợp sẽ lắng nghe sự kiện sinh trắc học và gửi nó đến thành phần TEE sinh trắc học thích hợp.
- Để xác thực mã PIN / hình / mật khẩu,
- Daemon nhận AuthToken đã ký và chuyển nó đến dịch vụ kho khóa thông qua một phần mở rộng cho giao diện Binder của dịch vụ kho khóa. (
gatekeeperd
cũng thông báo cho dịch vụ kho khóa khi thiết bị được khóa lại và khi mật khẩu thiết bị thay đổi.) - Dịch vụ kho khóa chuyển AuthTokens tới Keymaster và xác minh chúng bằng cách sử dụng khóa được chia sẻ với Gatekeeper và thành phần TEE sinh trắc học được hỗ trợ. Keymaster tin tưởng dấu thời gian trong mã thông báo là thời gian xác thực cuối cùng và căn cứ vào quyết định phát hành khóa (để cho phép ứng dụng sử dụng khóa) trên dấu thời gian.
Định dạng AuthToken
Để đảm bảo chia sẻ mã thông báo và khả năng tương thích giữa các ngôn ngữ và thành phần, định dạng AuthToken được mô tả trong hw_auth_token.h
. Định dạng là một giao thức tuần tự hóa đơn giản với các trường kích thước cố định.
Đồng ruộng | Loại hình | Yêu cầu | Sự mô tả |
---|---|---|---|
Phiên bản AuthToken | 1 byte | Đúng | Thẻ nhóm cho tất cả các trường bên dưới. |
Thách đấu | Số nguyên không dấu 64 bit | Không | Một số nguyên ngẫu nhiên để ngăn chặn các cuộc tấn công phát lại. Thường là ID của một hoạt động tiền điện tử được yêu cầu. Hiện đang được sử dụng bởi ủy quyền dấu vân tay giao dịch. Nếu có, AuthToken chỉ hợp lệ cho các hoạt động tiền điện tử có cùng thách thức. |
SID người dùng | Số nguyên không dấu 64 bit | Đúng | Mã định danh người dùng không tái tạo được gắn bằng mật mã với tất cả các khóa được liên kết với xác thực thiết bị. Để biết chi tiết, hãy xem Gatekeeper . |
ID xác thực (ASID) | Số nguyên không dấu 64 bit theo thứ tự mạng | Không | Số nhận dạng được sử dụng để liên kết với một chính sách xác thực cụ thể. Tất cả các trình xác thực đều có giá trị ASID riêng mà họ có thể thay đổi theo yêu cầu của riêng mình. |
Loại trình xác thực | Số nguyên không dấu 32 bit theo thứ tự mạng | Đúng |
|
Dấu thời gian | Số nguyên không dấu 64 bit theo thứ tự mạng | Đúng | Thời gian (tính bằng mili giây) kể từ lần khởi động hệ thống gần đây nhất. |
AuthToken HMAC (SHA-256) | Đốm màu 256-bit | Đúng | Đã khóa SHA-256 MAC của tất cả các trường ngoại trừ trường HMAC. |
Quy trình khởi động thiết bị
Trên mỗi lần khởi động thiết bị, khóa AuthToken HMAC phải được tạo và chia sẻ với tất cả các thành phần TEE (Gatekeeper, Keymaster và các ủy thác sinh trắc học được hỗ trợ). Do đó, để tăng cường bảo vệ chống lại các cuộc tấn công phát lại, khóa HMAC phải được tạo ngẫu nhiên mỗi khi thiết bị khởi động lại.
Giao thức để chia sẻ khóa HMAC này với tất cả các thành phần là một tính năng triển khai phụ thuộc vào nền tảng. Chìa khóa không bao giờ được cung cấp bên ngoài TEE. Nếu Hệ điều hành TEE thiếu cơ chế giao tiếp liên quá trình nội bộ (IPC) và cần chuyển dữ liệu qua Hệ điều hành không đáng tin cậy, thì việc truyền phải được thực hiện thông qua một giao thức trao đổi khóa an toàn.
Hệ điều hành Trusty , chạy bên cạnh Android, là một ví dụ về TEE, nhưng các TEE khác có thể được sử dụng thay thế. Trusty sử dụng hệ thống IPC nội bộ để liên lạc trực tiếp giữa Keymaster và Gatekeeper hoặc ủy thác sinh trắc học thích hợp. Khóa HMAC chỉ được giữ trong Keymaster; Vân tay và Người giữ cổng yêu cầu khóa từ Keymaster cho mỗi lần sử dụng và không lưu giữ hoặc lưu giá trị vào bộ nhớ cache.
Vì một số TEE thiếu cơ sở hạ tầng IPC, không có giao tiếp nào xảy ra giữa các applet trong TEE. Điều này cũng cho phép dịch vụ kho khóa nhanh chóng từ chối các yêu cầu bị ràng buộc không thành công vì nó có kiến thức về bảng xác thực trong hệ thống, tiết kiệm một IPC có thể tốn kém vào TEE.