Mã hoá toàn bộ ổ đĩa là quá trình mã hoá tất cả dữ liệu người dùng trên thiết bị Android bằng khoá mã hoá. Sau khi thiết bị được mã hoá, tất cả dữ liệu do người dùng tạo sẽ tự động được mã hoá trước khi được ghi vào ổ đĩa và tất cả các thao tác đọc sẽ tự động giải mã dữ liệu trước khi trả về cho quy trình gọi.
Phương thức mã hoá toàn bộ đĩa được giới thiệu cho Android từ phiên bản 4.4, nhưng Android 5.0 đã giới thiệu những tính năng mới sau:
- Tạo quy trình mã hoá nhanh, chỉ mã hoá các khối đã dùng trên phân vùng dữ liệu để tránh lần khởi động đầu tiên mất nhiều thời gian. Hiện chỉ có hệ thống tệp ext4 và f2fs hỗ trợ tính năng mã hoá nhanh.
- Đã thêm cờ
forceencrypt
fstab để mã hoá trong lần khởi động đầu tiên. - Thêm tính năng hỗ trợ cho hình mở khoá và mã hoá mà không cần mật khẩu.
- Đã thêm bộ nhớ dựa trên phần cứng của khoá mã hoá bằng cách sử dụng khả năng ký của Môi trường thực thi đáng tin cậy (TEE) (chẳng hạn như trong TrustZone). Hãy xem phần Lưu trữ khoá đã mã hoá để biết thêm thông tin.
Thận trọng: Các thiết bị đã nâng cấp lên Android 5.0 rồi được mã hoá có thể được đưa về trạng thái chưa mã hoá bằng cách thiết lập lại dữ liệu ban đầu. Bạn không thể đưa các thiết bị Android 5.0 mới được mã hoá khi khởi động lần đầu về trạng thái chưa mã hoá.
Cách hoạt động của phương thức mã hoá toàn bộ đĩa trên Android
Phương thức mã hoá toàn bộ đĩa của Android dựa trên dm-crypt
, đây là một tính năng của nhân hoạt động ở lớp thiết bị khối. Do đó, quá trình mã hoá hoạt động với Embedded MultiMediaCard (eMMC) và các thiết bị flash tương tự tự nhận diện với nhân dưới dạng thiết bị khối. Không thể mã hoá bằng YAFFS vì YAFFS giao tiếp trực tiếp với chip flash NAND thô.
Thuật toán mã hoá là Tiêu chuẩn mã hoá nâng cao (AES) 128 bit với phương thức kết chuỗi khối mã hoá (CBC) và ESSIV:SHA256. Khoá chính được mã hoá bằng AES 128 bit thông qua các lệnh gọi đến thư viện OpenSSL. Bạn phải sử dụng 128 bit trở lên cho khoá (có thể dùng 256 bit).
Lưu ý: Các OEM có thể sử dụng 128 bit trở lên để mã hoá khoá chính.
Trong bản phát hành Android 5.0, có 4 loại trạng thái mã hoá:
- mặc định
- Mã PIN
- mật khẩu
- hình mở khóa
Khi khởi động lần đầu, thiết bị sẽ tạo một khoá chính 128 bit được tạo ngẫu nhiên, sau đó băm khoá này bằng mật khẩu mặc định và muối được lưu trữ. Mật khẩu mặc định là: "default_password". Tuy nhiên, hàm băm kết quả cũng được ký thông qua TEE (chẳng hạn như TrustZone), sử dụng hàm băm của chữ ký để mã hoá khoá chính.
Bạn có thể tìm thấy mật khẩu mặc định được xác định trong tệp cryptfs.cpp của Dự án nguồn mở Android.
Khi người dùng đặt mã PIN/mật khẩu hoặc mật khẩu trên thiết bị, chỉ khoá 128 bit được mã hoá lại và lưu trữ. (tức là các thay đổi về mã PIN/mật khẩu/hình mở khoá của người dùng KHÔNG gây ra quá trình mã hoá lại dữ liệu người dùng.) Xin lưu ý rằng thiết bị do tổ chức quản lý có thể phải tuân theo các quy định hạn chế về mã PIN, hình mở khoá hoặc mật khẩu.
Hoạt động mã hoá do init
và vold
quản lý.
init
gọi vold
và vold đặt các thuộc tính để kích hoạt các sự kiện trong init. Các phần khác của hệ thống cũng xem xét các thuộc tính để thực hiện những việc như báo cáo trạng thái, yêu cầu mật khẩu hoặc nhắc đặt lại về trạng thái ban đầu trong trường hợp xảy ra lỗi nghiêm trọng. Để gọi các tính năng mã hoá trong vold
, hệ thống sẽ sử dụng công cụ dòng lệnh vdc
với các lệnh cryptfs
: checkpw
, restart
, enablecrypto
, changepw
, cryptocomplete
, verifypw
, setfield
, getfield
, mountdefaultencrypted
, getpwtype
, getpw
và clearpw
.
Để mã hoá, giải mã hoặc xoá dữ liệu trên /data
, bạn không được gắn /data
. Tuy nhiên, để hiển thị giao diện người dùng (UI), khung này phải bắt đầu và khung này yêu cầu /data
chạy. Để giải quyết vấn đề này, một hệ thống tệp tạm thời được gắn trên /data
.
Điều này cho phép Android nhắc nhập mật khẩu, cho biết tiến trình hoặc đề xuất xoá dữ liệu khi cần. Hạn chế này là để chuyển từ hệ thống tệp tạm thời sang hệ thống tệp /data
thực, hệ thống phải dừng mọi quy trình có tệp đang mở trên hệ thống tệp tạm thời và khởi động lại các quy trình đó trên hệ thống tệp /data
thực. Để làm được việc này, tất cả các dịch vụ phải nằm trong một trong ba nhóm: core
, main
và late_start
.
core
: Không bao giờ tắt sau khi khởi động.main
: Tắt rồi khởi động lại sau khi nhập mật khẩu đĩa.late_start
: Không bắt đầu cho đến khi/data
được giải mã và gắn kết.
Để kích hoạt các thao tác này, thuộc tính vold.decrypt
được đặt thành các chuỗi khác nhau.
Để tắt và khởi động lại các dịch vụ, hãy dùng lệnh init
:
class_reset
: Dừng một dịch vụ nhưng cho phép khởi động lại bằng class_start.class_start
: Khởi động lại một dịch vụ.class_stop
: Dừng một dịch vụ và thêm cờSVC_DISABLED
. Các dịch vụ đã ngừng hoạt động sẽ không phản hồiclass_start
.
Flows
Có 4 quy trình cho một thiết bị được mã hoá. Thiết bị chỉ được mã hoá một lần rồi tuân theo quy trình khởi động thông thường.
- Mã hoá một thiết bị chưa được mã hoá trước đó:
- Mã hoá một thiết bị mới bằng
forceencrypt
: Mã hoá bắt buộc khi khởi động lần đầu (bắt đầu từ Android L). - Mã hoá một thiết bị hiện có: Mã hoá do người dùng khởi tạo (Android K trở xuống).
- Mã hoá một thiết bị mới bằng
- Khởi động một thiết bị được mã hoá:
- Khởi động một thiết bị được mã hoá mà không có mật khẩu: Khởi động một thiết bị được mã hoá mà không có mật khẩu đã đặt (phù hợp với các thiết bị chạy Android 5.0 trở lên).
- Khởi động một thiết bị được mã hoá bằng mật khẩu: Khởi động một thiết bị được mã hoá có mật khẩu đã đặt.
Ngoài các quy trình này, thiết bị cũng có thể không mã hoá được /data
.
Mỗi quy trình được giải thích chi tiết bên dưới.
Mã hoá thiết bị mới bằng forceencrypt
Đây là lần khởi động đầu tiên bình thường đối với thiết bị Android 5.0.
- Phát hiện hệ thống tệp chưa mã hoá bằng cờ
forceencrypt
/data
không được mã hoá nhưng cần được mã hoá vìforceencrypt
yêu cầu điều này. Huỷ gắn/data
. - Bắt đầu mã hoá
/data
vold.decrypt = "trigger_encryption"
kích hoạtinit.rc
, khiếnvold
mã hoá/data
mà không cần mật khẩu. (Không có thiết bị nào được thiết lập vì đây là thiết bị mới.) - Mount tmpfs
vold
gắn một tmpfs/data
(bằng cách sử dụng các lựa chọn tmpfs từro.crypto.tmpfs_options
) và đặt thuộc tínhvold.encrypt_progress
thành 0.vold
chuẩn bị tmpfs/data
để khởi động một hệ thống được mã hoá và đặt thuộc tínhvold.decrypt
thành:trigger_restart_min_framework
- Đưa khung lên để cho biết tiến trình
Vì thiết bị hầu như không có dữ liệu nào để mã hoá, nên thanh tiến trình sẽ không xuất hiện thường xuyên vì quá trình mã hoá diễn ra rất nhanh. Hãy xem phần Mã hoá thiết bị hiện có để biết thêm thông tin chi tiết về giao diện người dùng tiến trình.
- Khi
/data
được mã hoá, hãy gỡ bỏ khung nàyvold
đặtvold.decrypt
thànhtrigger_default_encryption
. Thao tác này sẽ khởi động dịch vụdefaultcrypto
. (Thao tác này sẽ bắt đầu quy trình bên dưới để gắn một userdata được mã hoá mặc định.)trigger_default_encryption
kiểm tra loại mã hoá để xem/data
có được mã hoá bằng mật khẩu hay không. Vì các thiết bị Android 5.0 được mã hoá khi khởi động lần đầu, nên không cần đặt mật khẩu; do đó, chúng ta sẽ giải mã và gắn/data
. - Lắp
/data
init
sau đó gắn/data
trên RAMDisk tmpfs bằng các tham số mà nó nhận được từro.crypto.tmpfs_options
, được đặt tronginit.rc
. - Khung bắt đầu
vold
đặtvold.decrypt
thànhtrigger_restart_framework
, tiếp tục quy trình khởi động thông thường.
Mã hoá một thiết bị hiện có
Đây là điều xảy ra khi bạn mã hoá một thiết bị Android K trở xuống chưa được mã hoá và đã được di chuyển sang L.
Quá trình này do người dùng bắt đầu và được gọi là "mã hoá tại chỗ" trong mã. Khi người dùng chọn mã hoá một thiết bị, giao diện người dùng sẽ đảm bảo pin được sạc đầy và bộ sạc nguồn AC được cắm để có đủ nguồn điện hoàn tất quy trình mã hoá.
Cảnh báo: Nếu thiết bị hết pin và tắt trước khi mã hoá xong, dữ liệu tệp sẽ ở trạng thái mã hoá một phần. Thiết bị phải được đặt lại về trạng thái ban đầu và mọi dữ liệu sẽ bị mất.
Để bật tính năng mã hoá tại chỗ, vold
sẽ bắt đầu một vòng lặp để đọc từng khu vực của thiết bị khối thực rồi ghi khu vực đó vào thiết bị khối mã hoá. vold
kiểm tra xem một thành phần có đang được sử dụng hay không trước khi đọc và ghi thành phần đó, nhờ đó, quá trình mã hoá diễn ra nhanh hơn nhiều trên một thiết bị mới có ít hoặc không có dữ liệu.
Trạng thái của thiết bị: Đặt ro.crypto.state = "unencrypted"
và thực thi trình kích hoạt on nonencrypted
init
để tiếp tục khởi động.
- Kiểm tra mật khẩu
Giao diện người dùng gọi
vold
bằng lệnhcryptfs enablecrypto inplace
, trong đópasswd
là mật khẩu màn hình khoá của người dùng. - Gỡ bỏ khung hình
vold
kiểm tra lỗi, trả về -1 nếu không mã hoá được và in lý do vào nhật ký. Nếu có thể mã hoá, thì nó sẽ đặt thuộc tínhvold.decrypt
thànhtrigger_shutdown_framework
. Điều này khiếninit.rc
dừng các dịch vụ trong các lớplate_start
vàmain
. - Tạo chân trang về tiền mã hoá
- Tạo tệp đường dẫn
- Khởi động lại
- Phát hiện tệp breadcrumb
- Bắt đầu mã hoá
/data
vold
sau đó thiết lập ánh xạ mã hoá, tạo một thiết bị khối mã hoá ảo ánh xạ vào thiết bị khối thực nhưng mã hoá từng khu vực khi được ghi và giải mã từng khu vực khi được đọc. Sau đó,vold
sẽ tạo và ghi siêu dữ liệu về tiền mã hoá. - Trong khi mã hoá, hãy gắn tmpfs
vold
gắn một tmpfs/data
(bằng cách sử dụng các tuỳ chọn tmpfs từro.crypto.tmpfs_options
) và đặt thuộc tínhvold.encrypt_progress
thành 0.vold
chuẩn bị tmpfs/data
để khởi động một hệ thống được mã hoá và đặt thuộc tínhvold.decrypt
thành:trigger_restart_min_framework
- Đưa khung lên để cho biết tiến trình
trigger_restart_min_framework
khiếninit.rc
bắt đầu lớpmain
của các dịch vụ. Khi thấyvold.encrypt_progress
được đặt thành 0, khung sẽ hiển thị giao diện người dùng thanh tiến trình, giao diện này sẽ truy vấn thuộc tính đó 5 giây một lần và cập nhật thanh tiến trình. Vòng lặp mã hoá sẽ cập nhậtvold.encrypt_progress
mỗi khi mã hoá thêm một phần trăm phân vùng. - Khi
/data
được mã hoá, hãy cập nhật chân trang mã hoáKhi
/data
được mã hoá thành công,vold
sẽ xoá cờENCRYPTION_IN_PROGRESS
trong siêu dữ liệu.Khi thiết bị được mở khoá thành công, mật khẩu sẽ được dùng để mã hoá khoá chính và phần chân trang mã hoá sẽ được cập nhật.
Nếu quá trình khởi động lại không thành công vì một lý do nào đó,
vold
sẽ đặt thuộc tínhvold.encrypt_progress
thànherror_reboot_failed
và giao diện người dùng sẽ hiển thị một thông báo yêu cầu người dùng nhấn nút để khởi động lại. Điều này không bao giờ xảy ra.
Khởi động một thiết bị được mã hoá bằng chế độ mã hoá mặc định
Đây là những gì xảy ra khi bạn khởi động một thiết bị đã mã hoá mà không có mật khẩu. Vì các thiết bị Android 5.0 được mã hoá khi khởi động lần đầu, nên không có mật khẩu đã đặt và do đó, đây là trạng thái mã hoá mặc định.
- Phát hiện
/data
đã mã hoá mà không có mật khẩuPhát hiện thấy thiết bị Android được mã hoá vì không thể gắn
/data
và một trong các cờencryptable
hoặcforceencrypt
được đặt.vold
đặtvold.decrypt
thànhtrigger_default_encryption
, thao tác này sẽ khởi động dịch vụdefaultcrypto
.trigger_default_encryption
kiểm tra loại mã hoá để xem/data
có được mã hoá bằng mật khẩu hay không. - Giải mã /data
Tạo thiết bị
dm-crypt
trên thiết bị khối để thiết bị sẵn sàng sử dụng. - Gắn /data
vold
sau đó gắn phân vùng/data
thực đã giải mã và chuẩn bị phân vùng mới. Thao tác này đặt thuộc tínhvold.post_fs_data_done
thành 0, sau đó đặtvold.decrypt
thànhtrigger_post_fs_data
. Điều này khiếninit.rc
chạy các lệnhpost-fs-data
. Chúng tạo mọi thư mục hoặc đường liên kết cần thiết, rồi đặtvold.post_fs_data_done
thành 1.Sau khi
vold
thấy số 1 trong thuộc tính đó, nó sẽ đặt thuộc tínhvold.decrypt
thành:trigger_restart_framework.
Thao tác này khiếninit.rc
bắt đầu lại các dịch vụ trong lớpmain
và cũng bắt đầu các dịch vụ trong lớplate_start
lần đầu tiên kể từ khi khởi động. - Khung bắt đầu
Giờ đây, khung này sẽ khởi động tất cả các dịch vụ bằng
/data
đã giải mã và hệ thống đã sẵn sàng để sử dụng.
Khởi động thiết bị được mã hoá mà không có chế độ mã hoá mặc định
Đây là những gì xảy ra khi bạn khởi động một thiết bị đã mã hoá có mật khẩu đã đặt. Mật khẩu của thiết bị có thể là mã PIN, hình mở khoá hoặc mật khẩu.
- Phát hiện thiết bị được mã hoá bằng mật khẩu
Phát hiện thấy thiết bị Android được mã hoá vì cờ
ro.crypto.state = "encrypted"
vold
đặtvold.decrypt
thànhtrigger_restart_min_framework
vì/data
được mã hoá bằng mật khẩu. - Mount tmpfs
init
đặt 5 thuộc tính để lưu các lựa chọn gắn ban đầu được cung cấp cho/data
bằng các tham số được truyền từinit.rc
.vold
sử dụng các thuộc tính này để thiết lập mối liên kết mã hoá:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(Số thập lục phân gồm 8 chữ số theo bảng mã ASCII, bắt đầu bằng 0x)
- Khung bắt đầu để nhắc nhập mật khẩu
Khung này khởi động và nhận thấy
vold.decrypt
được đặt thànhtrigger_restart_min_framework
. Điều này cho biết khung đang khởi động trên đĩa tmpfs/data
và cần lấy mật khẩu người dùng.Tuy nhiên, trước tiên, hệ thống cần đảm bảo rằng ổ đĩa đã được mã hoá đúng cách. Thao tác này sẽ gửi lệnh
cryptfs cryptocomplete
đếnvold
.vold
trả về 0 nếu quá trình mã hoá hoàn tất thành công, -1 nếu xảy ra lỗi nội bộ hoặc -2 nếu quá trình mã hoá không hoàn tất thành công.vold
xác định điều này bằng cách tìm cờCRYPTO_ENCRYPTION_IN_PROGRESS
trong siêu dữ liệu mã hoá. Nếu bạn đặt chính sách này, thì quá trình mã hoá đã bị gián đoạn và không có dữ liệu nào có thể sử dụng trên thiết bị. Nếuvold
trả về lỗi, thì giao diện người dùng sẽ hiển thị thông báo cho người dùng để khởi động lại và đặt lại thiết bị về trạng thái ban đầu, đồng thời cung cấp cho người dùng một nút để nhấn vào nhằm thực hiện việc này. - Giải mã dữ liệu bằng mật khẩu
Sau khi
cryptfs cryptocomplete
thành công, khung sẽ hiển thị một giao diện người dùng yêu cầu mật khẩu ổ đĩa. Giao diện người dùng kiểm tra mật khẩu bằng cách gửi lệnhcryptfs checkpw
đếnvold
. Nếu mật khẩu chính xác (được xác định bằng cách gắn thành công/data
đã giải mã tại một vị trí tạm thời, sau đó huỷ gắn),vold
sẽ lưu tên của thiết bị khối đã giải mã trong thuộc tínhro.crypto.fs_crypto_blkdev
và trả về trạng thái 0 cho giao diện người dùng. Nếu mật khẩu không chính xác, hệ thống sẽ trả về -1 cho giao diện người dùng. - Khung dừng
Giao diện người dùng hiển thị một hình ảnh khởi động mã hoá rồi gọi
vold
bằng lệnhcryptfs restart
.vold
đặt thuộc tínhvold.decrypt
thànhtrigger_reset_main
, khiếninit.rc
thực hiệnclass_reset main
. Thao tác này sẽ dừng tất cả các dịch vụ trong lớp chính, cho phép huỷ gắn/data
tmpfs. - Lắp
/data
vold
sau đó sẽ gắn phân vùng/data
thực đã giải mã và chuẩn bị phân vùng mới (có thể chưa bao giờ được chuẩn bị nếu phân vùng đó được mã hoá bằng lựa chọn xoá dữ liệu, không được hỗ trợ trong bản phát hành đầu tiên). Thao tác này đặt thuộc tínhvold.post_fs_data_done
thành 0, sau đó đặtvold.decrypt
thànhtrigger_post_fs_data
. Điều này khiếninit.rc
chạy các lệnhpost-fs-data
. Chúng tạo mọi thư mục hoặc đường liên kết cần thiết, rồi đặtvold.post_fs_data_done
thành 1. Khivold
thấy số 1 trong thuộc tính đó, nó sẽ đặt thuộc tínhvold.decrypt
thànhtrigger_restart_framework
. Điều này khiếninit.rc
bắt đầu lại các dịch vụ trong lớpmain
và cũng bắt đầu các dịch vụ trong lớplate_start
lần đầu tiên kể từ khi khởi động. - Bắt đầu khuôn khổ đầy đủ
Giờ đây, khung sẽ khởi động tất cả các dịch vụ bằng hệ thống tệp
/data
đã giải mã và hệ thống đã sẵn sàng để sử dụng.
Lỗi
Thiết bị không giải mã được có thể gặp trục trặc vì một số lý do. Thiết bị bắt đầu bằng một loạt các bước thông thường để khởi động:
- Phát hiện thiết bị được mã hoá bằng mật khẩu
- Gắn tmpfs
- Khung khởi động để nhắc nhập mật khẩu
Nhưng sau khi khung mở, thiết bị có thể gặp phải một số lỗi:
- Mật khẩu khớp nhưng không giải mã được dữ liệu
- Người dùng nhập sai mật khẩu 30 lần
Nếu những lỗi này không được khắc phục, hãy nhắc người dùng xoá dữ liệu về trạng thái ban đầu:
Nếu vold
phát hiện thấy lỗi trong quá trình mã hoá và nếu chưa có dữ liệu nào bị huỷ cũng như khung đang hoạt động, thì vold
sẽ đặt thuộc tính vold.encrypt_progress
thành error_not_encrypted
.
Giao diện người dùng nhắc người dùng khởi động lại và cảnh báo họ rằng quy trình mã hoá chưa bao giờ bắt đầu. Nếu lỗi xảy ra sau khi khung hình bị huỷ nhưng trước khi giao diện người dùng thanh tiến trình xuất hiện, vold
sẽ khởi động lại hệ thống. Nếu quá trình khởi động lại không thành công, hệ thống sẽ đặt vold.encrypt_progress
thành error_shutting_down
và trả về -1; nhưng sẽ không có gì để phát hiện lỗi. Điều này không được phép xảy ra.
Nếu vold
phát hiện thấy lỗi trong quá trình mã hoá, thì hàm này sẽ đặt vold.encrypt_progress
thành error_partially_encrypted
và trả về -1. Sau đó, giao diện người dùng sẽ hiển thị thông báo cho biết quá trình mã hoá không thành công và cung cấp một nút để người dùng đặt lại thiết bị về trạng thái ban đầu.
Lưu trữ khoá đã mã hoá
Khoá đã mã hoá được lưu trữ trong siêu dữ liệu mã hoá. Tính năng hỗ trợ phần cứng được triển khai bằng cách sử dụng khả năng ký của Môi trường thực thi đáng tin cậy (TEE). Trước đây, chúng tôi mã hoá khoá chính bằng một khoá được tạo bằng cách áp dụng scrypt cho mật khẩu của người dùng và muối đã lưu trữ. Để khoá có khả năng chống lại các cuộc tấn công bên ngoài, chúng tôi mở rộng thuật toán này bằng cách ký khoá kết quả bằng một khoá TEE đã lưu trữ. Sau đó, chữ ký thu được sẽ được chuyển thành một khoá có độ dài phù hợp bằng cách áp dụng thêm một lần nữa scrypt. Sau đó, khoá này được dùng để mã hoá và giải mã khoá chính. Cách lưu trữ khoá này:
- Tạo khoá mã hoá đĩa (DEK) 16 byte và muối 16 byte ngẫu nhiên.
- Áp dụng scrypt cho mật khẩu người dùng và chuỗi ngẫu nhiên để tạo khoá trung gian 1 (IK1) có kích thước 32 byte.
- Thêm các byte có giá trị 0 vào IK1 cho đến khi đạt kích thước của khoá riêng tư được liên kết với phần cứng (HBK). Cụ thể, chúng tôi thêm phần đệm như sau: 00 || IK1 || 00..00; một byte 0, 32 byte IK1, 223 byte 0.
- Ký IK1 được đệm bằng HBK để tạo IK2 có kích thước 256 byte.
- Áp dụng scrypt cho IK2 và salt (cùng salt như bước 2) để tạo IK3 có kích thước 32 byte.
- Sử dụng 16 byte đầu tiên của IK3 làm KEK và 16 byte cuối cùng làm IV.
- Mã hoá DEK bằng AES_CBC, với khoá KEK và vectơ khởi tạo IV.
Đổi mật khẩu
Khi người dùng chọn thay đổi hoặc xoá mật khẩu trong phần cài đặt, giao diện người dùng sẽ gửi lệnh cryptfs changepw
đến vold
và vold
mã hoá lại khoá chính của ổ đĩa bằng mật khẩu mới.
Thuộc tính mã hoá
vold
và init
giao tiếp với nhau bằng cách thiết lập các thuộc tính. Sau đây là danh sách các thuộc tính có sẵn để mã hoá.
Thuộc tính Vold
Thuộc tính | Mô tả |
---|---|
vold.decrypt trigger_encryption |
Mã hoá ổ đĩa mà không cần mật khẩu. |
vold.decrypt trigger_default_encryption |
Kiểm tra ổ đĩa để xem ổ đĩa đó có được mã hoá mà không có mật khẩu hay không.
Nếu có, hãy giải mã và gắn kết nó, nếu không, hãy đặt vold.decrypt thành trigger_restart_min_framework. |
vold.decrypt trigger_reset_main |
Do vold đặt để tắt giao diện người dùng yêu cầu mật khẩu ổ đĩa. |
vold.decrypt trigger_post_fs_data |
Được vold đặt để chuẩn bị /data với các thư mục cần thiết, v.v. |
vold.decrypt trigger_restart_framework |
Do vold đặt để khởi động khung thực và tất cả các dịch vụ. |
vold.decrypt trigger_shutdown_framework |
Do vold đặt để tắt toàn bộ khung nhằm bắt đầu mã hoá. |
vold.decrypt trigger_restart_min_framework |
Do vold đặt để bắt đầu giao diện người dùng thanh tiến trình cho quá trình mã hoá hoặc lời nhắc nhập mật khẩu, tuỳ thuộc vào giá trị của ro.crypto.state . |
vold.encrypt_progress |
Khi khung khởi động, nếu bạn đặt thuộc tính này, hãy chuyển sang chế độ giao diện người dùng thanh tiến trình. |
vold.encrypt_progress 0 to 100 |
Giao diện người dùng thanh tiến trình phải hiển thị giá trị phần trăm đã đặt. |
vold.encrypt_progress error_partially_encrypted |
Giao diện người dùng thanh tiến trình phải hiển thị thông báo cho biết quá trình mã hoá không thành công và cung cấp cho người dùng lựa chọn khôi phục thiết bị về trạng thái ban đầu. |
vold.encrypt_progress error_reboot_failed |
Giao diện người dùng thanh tiến trình sẽ hiển thị thông báo cho biết quá trình mã hoá đã hoàn tất và cung cấp cho người dùng một nút để khởi động lại thiết bị. Lỗi này không được phép xảy ra. |
vold.encrypt_progress error_not_encrypted |
Giao diện người dùng thanh tiến trình sẽ hiển thị một thông báo cho biết đã xảy ra lỗi, không có dữ liệu nào bị mã hoá hoặc mất và cung cấp cho người dùng một nút để khởi động lại hệ thống. |
vold.encrypt_progress error_shutting_down |
Giao diện người dùng thanh tiến trình không chạy, vì vậy, không rõ ai sẽ phản hồi lỗi này. Và dù sao thì điều đó cũng không bao giờ xảy ra. |
vold.post_fs_data_done 0 |
Do vold đặt ngay trước khi đặt vold.decrypt thành trigger_post_fs_data . |
vold.post_fs_data_done 1 |
Đặt theo init.rc hoặc init.rc ngay sau khi hoàn thành việc cần làm post-fs-data . |
thuộc tính init
Thuộc tính | Mô tả |
---|---|
ro.crypto.fs_crypto_blkdev |
Được đặt bằng lệnh vold checkpw để sau này dùng bằng lệnh vold restart . |
ro.crypto.state unencrypted |
Do init đặt để cho biết hệ thống này đang chạy bằng /data ro.crypto.state encrypted chưa mã hoá. Do init đặt để cho biết hệ thống này đang chạy với /data được mã hoá. |
|
init sẽ đặt 5 thuộc tính này khi cố gắng gắn /data bằng các tham số được truyền từ init.rc . vold sử dụng các thông tin này để thiết lập mối liên kết tiền mã hoá. |
ro.crypto.tmpfs_options |
Được thiết lập bằng init.rc với các lựa chọn mà init nên sử dụng khi gắn hệ thống tệp tmpfs /data . |
init actions
on post-fs-data on nonencrypted on property:vold.decrypt=trigger_reset_main on property:vold.decrypt=trigger_post_fs_data on property:vold.decrypt=trigger_restart_min_framework on property:vold.decrypt=trigger_restart_framework on property:vold.decrypt=trigger_shutdown_framework on property:vold.decrypt=trigger_encryption on property:vold.decrypt=trigger_default_encryption