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