הצפנת הדיסק במלואו היא תהליך של קידוד כל נתוני המשתמש במכשיר Android באמצעות מפתח מוצפן. אחרי שמצפינים מכשיר, כל הנתונים שנוצרו על ידי המשתמש מוצפנים באופן אוטומטי לפני שהם נשמרים בדיסק, וכל הקריאות מפענחות את הנתונים באופן אוטומטי לפני שהם מוחזרים לתהליך הקורא.
הצפנה מלאה של הדיסק הושקה ב-Android 4.4, אבל ב-Android 5.0 הושקו התכונות החדשות האלה:
- יצרו הצפנה מהירה, שמצפינה רק בלוקים בשימוש במחיצת הנתונים כדי למנוע אתחול ראשון ארוך. נכון לעכשיו, רק מערכות הקבצים ext4 ו-f2fs תומכות בהצפנה מהירה.
- נוסף
forceencrypt
הסימון fstab להצפנה בהפעלה הראשונה. - נוספה תמיכה בקווי פתיחת נעילה ובהצפנה ללא סיסמה.
- הוספנו אחסון של מפתח ההצפנה שמגובה בחומרה באמצעות יכולת החתימה של סביבת מחשוב אמינה (TEE) (למשל ב-TrustZone). פרטים נוספים זמינים במאמר בנושא אחסון המפתח המוצפן.
זהירות: מכשירים ששודרגו ל-Android 5.0 ואחר כך הוצפן, אפשר להחזיר למצב לא מוצפן באמצעות איפוס לנתוני היצרן. אי אפשר להחזיר למצב לא מוצפן מכשירי Android 5.0 חדשים שהוצפנו בהפעלה הראשונה.
איך פועלת הצפנה מלאה של הדיסק ב-Android
הצפנה מלאה של הדיסק ב-Android מבוססת על dm-crypt
, שהיא תכונה של ליבת המערכת שפועלת בשכבת מכשיר הבלוקים. לכן, ההצפנה פועלת עם Embedded MultiMediaCard (eMMC) ועם מכשירי פלאש דומים שמוצגים לליבת המערכת כמכשירי בלוק. אי אפשר להצפין את YAFFS, כי הוא מתקשר ישירות עם שבב NAND flash גולמי.
אלגוריתם ההצפנה הוא 128 Advanced Encryption Standard (AES) עם cipher-block chaining (CBC) ו-ESSIV:SHA256. מפתח המאסטר מוצפן באמצעות AES של 128 ביט דרך קריאות לספריית OpenSSL. חובה להשתמש במפתח באורך 128 ביט לפחות (אפשר גם 256 ביט).
הערה: יצרני ציוד מקורי יכולים להשתמש בהצפנה של 128 ביט ומעלה כדי להצפין את מפתח המאסטר.
בגרסה 5.0 של Android יש ארבעה סוגים של מצבי הצפנה:
- ברירת מחדל
- קוד אימות
- סיסמה
- קו ביטול נעילה
באתחול הראשון, המכשיר יוצר מפתח ראשי בן 128 ביט שנוצר באופן אקראי, ואז מבצע גיבוב שלו באמצעות סיסמת ברירת מחדל ומלח מאוחסן. סיסמת ברירת המחדל היא: default_password. עם זאת, הגיבוב שמתקבל נחתם גם באמצעות TEE (כמו TrustZone), שמשתמש בגיבוב של החתימה כדי להצפין את מפתח המאסטר.
אפשר למצוא את סיסמת ברירת המחדל שמוגדרת בקובץ cryptfs.cpp של פרויקט הקוד הפתוח של Android.
כשהמשתמש מגדיר קוד אימות, קו ביטול נעילה או סיסמה במכשיר, רק המפתח בן 128 הביטים מוצפן מחדש ונשמר. (כלומר, שינויים בקוד האימות, בסיסמה או בתבנית של המשתמש לא גורמים להצפנה מחדש של נתוני המשתמש). חשוב לזכור שמכשיר מנוהל עשוי להיות כפוף להגבלות על קוד אימות, קו ביטול נעילה או סיסמה.
ההצפנה מנוהלת על ידי init
ו-vold
.
init
קורא ל-vold
, ו-vold מגדיר מאפיינים להפעלת אירועים ב-init. חלקים אחרים במערכת בודקים גם את המאפיינים כדי לבצע משימות כמו דיווח על סטטוס, בקשת סיסמה או הצעה לאיפוס להגדרות המפעל במקרה של שגיאה חמורה. כדי להפעיל את תכונות ההצפנה ב-vold
, המערכת משתמשת בפקודות cryptfs
של כלי שורת הפקודה vdc
: checkpw
, restart
, enablecrypto
, changepw
, cryptocomplete
, verifypw
, setfield
, getfield
, mountdefaultencrypted
, getpwtype
, getpw
ו-clearpw
.
כדי להצפין, לפענח או למחוק את /data
, /data
אסור שהיא תהיה טעונה. עם זאת, כדי להציג ממשק משתמש כלשהו, המסגרת צריכה להתחיל לפעול, והיא דורשת את /data
כדי לפעול. כדי לפתור את הבעיה הזו, מערכת קבצים זמנית מותקנת ב-/data
.
כך מערכת Android יכולה להציג בקשה להזנת סיסמה, להראות את ההתקדמות או להציע מחיקת נתונים לפי הצורך. ההגבלה היא שכדי לעבור ממערכת הקבצים הזמנית למערכת הקבצים האמיתית /data
, המערכת צריכה לעצור כל תהליך עם קבצים פתוחים במערכת הקבצים הזמנית ולהפעיל מחדש את התהליכים האלה במערכת הקבצים האמיתית /data
. כדי לעשות את זה, כל השירותים צריכים להיות באחת משלוש קבוצות: core
, main
ו-late_start
.
-
core
: לא מכבים את המחשב אחרי ההפעלה. -
main
: מכבים את המחשב ומפעילים אותו מחדש אחרי שמזינים את הסיסמה לדיסק. -
late_start
: לא מתחיל עד ש-/data
מפוענח ומותקן.
כדי להפעיל את הפעולות האלה, המאפיין vold.decrypt
מוגדר למחרוזות שונות.
כדי להפסיק ולהפעיל מחדש שירותים, משתמשים בפקודות init
:
-
class_reset
: מפסיק שירות אבל מאפשר להפעיל אותו מחדש באמצעות class_start. -
class_start
: הפעלה מחדש של שירות. -
class_stop
: מפסיק שירות ומוסיף את הדגלSVC_DISABLED
. שירותים שהופסקו לא מגיבים ל-class_start
.
Flows
יש ארבעה תהליכים למכשיר מוצפן. מכשיר מוצפן רק פעם אחת ואז מתבצע תהליך אתחול רגיל.
- הצפנה של מכשיר שלא הוצפן בעבר:
- הצפנת מכשיר חדש באמצעות
forceencrypt
: הצפנה חובה בהפעלה הראשונה (החל מ-Android L). - הצפנה של מכשיר קיים: הצפנה שמתבצעת על ידי המשתמש (Android K ומטה).
- הצפנת מכשיר חדש באמצעות
- הפעלה של מכשיר מוצפן:
- הפעלה של מכשיר מוצפן ללא סיסמה: אתחול של מכשיר מוצפן שלא הוגדרה לו סיסמה (רלוונטי למכשירים עם Android בגרסה 5.0 ומעלה).
- הפעלה של מכשיר מוצפן עם סיסמה: אתחול של מכשיר מוצפן שהוגדרה לו סיסמה.
בנוסף לתהליכים האלה, יכול להיות שהמכשיר לא יצליח להצפין את /data
.
בהמשך מוסבר כל אחד מהתהליכים בפירוט.
הצפנת מכשיר חדש באמצעות forceencrypt
זוהי האתחול הראשון הרגיל של מכשיר Android 5.0.
- זיהוי מערכת קבצים לא מוצפנת באמצעות הדגל
forceencrypt
/data
לא מוצפן אבל צריך להיות מוצפן כיforceencrypt
מחייב זאת. ביטול ההצבה/data
. - התחלת ההצפנה
/data
vold.decrypt = "trigger_encryption"
triggersinit.rc
, which causesvold
to encrypt/data
with no password. (לא מוגדר כלום כי זה אמור להיות מכשיר חדש). - Mount tmpfs
vold
יוצר tmpfs/data
(באמצעות האפשרויות של tmpfs מ-ro.crypto.tmpfs_options
) ומגדיר את המאפייןvold.encrypt_progress
ל-0. vold
מכין את tmpfs/data
להפעלה של מערכת מוצפנת ומגדיר את המאפייןvold.decrypt
לערך:trigger_restart_min_framework
- הצגת מסגרת להצגת ההתקדמות
במכשיר כמעט אין נתונים להצפנה, ולכן סרגל ההתקדמות לא יופיע לעיתים קרובות כי ההצפנה מתבצעת במהירות. מידע נוסף על ממשק המשתמש של ההתקדמות מופיע במאמר בנושא הצפנת מכשיר קיים.
- When
/data
is encrypted, take down the framework
vold
מגדיר אתvold.decrypt
ל-trigger_default_encryption
, וכך מתחיל השירותdefaultcrypto
. (כך מתחיל התהליך שמתואר בהמשך להרכבת נתוני משתמש מוצפנים שמוגדרים כברירת מחדל). trigger_default_encryption
בודק את סוג ההצפנה כדי לראות אם/data
מוצפן עם סיסמה או בלי סיסמה. מכיוון שמכשירי Android 5.0 מוצפנים בהפעלה הראשונה, לא אמורה להיות סיסמה מוגדרת. לכן אנחנו מפענחים ומעלים את/data
. - Mount
/data
init
ואז טוען את/data
ב-RAMDisk של tmpfs באמצעות פרמטרים שהוא מקבל מ-ro.crypto.tmpfs_options
, שמוגדר ב-init.rc
. - הפעלת מסגרת
vold
מגדיר אתvold.decrypt
ל-trigger_restart_framework
, וממשיך בתהליך האתחול הרגיל.
הצפנה של מכשיר קיים
זה מה שקורה כשמצפינים מכשיר Android K או גרסה מוקדמת יותר שלא הוצפנה והועברה ל-L.
התהליך הזה מתחיל על ידי המשתמש והוא נקרא 'הצפנה במקום' בקוד. כשמשתמש בוחר להצפין מכשיר, ממשק המשתמש מוודא שהסוללה טעונה במלואה ומתאם ה-AC מחובר, כדי שיהיה מספיק חשמל להשלמת תהליך ההצפנה.
אזהרה: אם הסוללה של המכשיר מתרוקנת והוא נכבה לפני שההצפנה מסתיימת, נתוני הקובץ נשארים במצב מוצפן חלקי. המכשיר חייב לעבור איפוס להגדרות המקוריות וכל הנתונים לא נשמרים.
כדי להפעיל הצפנה במקום, vold
מתחיל לולאה לקריאת כל סקטור של מכשיר הבלוק האמיתי ואז כתיבה שלו למכשיר הבלוק המוצפן. vold
בודק אם סקטור נמצא בשימוש לפני שהוא קורא אותו וכותב בו, מה שהופך את ההצפנה למהירה הרבה יותר במכשיר חדש שיש בו מעט נתונים או שאין בו נתונים בכלל.
מצב המכשיר: מגדירים את ro.crypto.state = "unencrypted"
ומפעילים את טריגר on nonencrypted
init
כדי להמשיך בהפעלה.
- בדיקת הסיסמה
ממשק המשתמש קורא ל-
vold
עם הפקודהcryptfs enablecrypto inplace
, כאשרpasswd
היא הסיסמה של מסך הנעילה של המשתמש. - הסרת המסגרת
הפונקציה
vold
בודקת אם יש שגיאות, מחזירה -1 אם היא לא מצליחה להצפין, ומדפיסה סיבה ביומן. אם אפשר להצפין, המאפייןvold.decrypt
מוגדר לערךtrigger_shutdown_framework
. כתוצאה מכך,init.rc
מפסיק את השירותים בכיתותlate_start
ו-main
. - יצירת כותרת תחתונה עם הצפנה
- יצירת קובץ של נתיב הניווט
- הפעלה מחדש
- זיהוי קובץ של נתיב ניווט
- התחלת ההצפנה
/data
vold
ואז מגדיר את מיפוי ההצפנה, שיוצר מכשיר וירטואלי של בלוק הצפנה שממופה למכשיר הבלוקים האמיתי, אבל מצפין כל סקטור בזמן הכתיבה ומפענח כל סקטור בזמן הקריאה. vold
יוצר וכותב את המטא-נתונים של המטבעות הווירטואליים. - בזמן ההצפנה, טוענים את tmpfs
vold
יוצר tmpfs/data
(באמצעות האפשרויות של tmpfs מ-ro.crypto.tmpfs_options
) ומגדיר את המאפייןvold.encrypt_progress
ל-0. vold
מכין את tmpfs/data
להפעלה של מערכת מוצפנת ומגדיר את המאפייןvold.decrypt
לערך:trigger_restart_min_framework
- הצגת מסגרת להצגת ההתקדמות
trigger_restart_min_framework
גורם ל-init.rc
להתחיל את מחלקת השירותיםmain
. כשהמסגרת מזהה שהערך שלvold.encrypt_progress
הוא 0, היא מציגה את ממשק המשתמש של סרגל ההתקדמות, שמבצע שאילתה לגבי המאפיין הזה כל חמש שניות ומעדכן את סרגל ההתקדמות. לולאת ההצפנה מתעדכנתvold.encrypt_progress
בכל פעם שהיא מצפינה עוד אחוז מהמחיצה. - כש-
/data
מוצפן, מעדכנים את הכותרת התחתונה של ההצפנהכש-
/data
מוצפן בהצלחה,vold
מסיר את הסימוןENCRYPTION_IN_PROGRESS
במטא-נתונים.כשמבטלים את נעילת המכשיר, הסיסמה משמשת להצפנת המפתח הראשי, והכותרת התחתונה של ההצפנה מתעדכנת.
אם האתחול מחדש נכשל מסיבה כלשהי,
vold
מגדיר את המאפייןvold.encrypt_progress
לערךerror_reboot_failed
, ובממשק המשתמש תוצג הודעה שבה המשתמש מתבקש ללחוץ על לחצן כדי לבצע אתחול מחדש. לא צפוי שזה יקרה.
הפעלה של מכשיר מוצפן עם הצפנה שמוגדרת כברירת מחדל
זה מה שקורה כשמפעילים מכשיר מוצפן ללא סיסמה. מכשירי Android מגרסה 5.0 מוצפנים בהפעלה הראשונה, ולכן לא אמורה להיות סיסמה מוגדרת, וזהו מצב ההצפנה שמוגדרת כברירת מחדל.
- זיהוי של
/data
מוצפנים ללא סיסמההמערכת מזהה שהמכשיר מוצפן כי אי אפשר לטעון את
/data
ואחד מהדגליםencryptable
אוforceencrypt
מוגדר.
vold
מגדיר אתvold.decrypt
ל-trigger_default_encryption
, וכך מתחיל השירותdefaultcrypto
. trigger_default_encryption
בודקים את סוג ההצפנה כדי לראות אם/data
מוצפן עם סיסמה או בלי סיסמה. - Decrypt /data
יוצר את מכשיר
dm-crypt
מעל מכשיר החסימה, כך שהמכשיר מוכן לשימוש. - טעינת /data
vold
ואז מפעיל את המחיצה האמיתית/data
שפוענחה ואז מכין את המחיצה החדשה. הוא מגדיר את המאפייןvold.post_fs_data_done
ל-0 ואז מגדיר אתvold.decrypt
ל-trigger_post_fs_data
. בעקבות זאת, הפקודות שלpost-fs-data
מופעלות ב-init.rc
. הם יוצרים את כל הספריות או הקישורים הנדרשים ואז מגדירים אתvold.post_fs_data_done
ל-1.אחרי ש-
vold
מזהה את הערך 1 במאפיין הזה, הוא מגדיר את המאפייןvold.decrypt
לערך:trigger_restart_framework.
. כתוצאה מכך,init.rc
מתחיל להפעיל שירותים בכיתהmain
שוב, וגם מתחיל להפעיל שירותים בכיתהlate_start
בפעם הראשונה מאז האתחול. - הפעלת מסגרת
עכשיו המסגרת מפעילה את כל השירותים שלה באמצעות
/data
מפוענח, ומערכת מוכנה לשימוש.
הפעלה של מכשיר מוצפן ללא הצפנה שמוגדרת כברירת מחדל
זה מה שקורה כשמפעילים מכשיר מוצפן עם סיסמה מוגדרת. הסיסמה של המכשיר יכולה להיות קוד אימות, קו ביטול נעילה או סיסמה.
- זיהוי מכשיר מוצפן עם סיסמה
לזהות שמכשיר Android מוצפן כי הדגל
ro.crypto.state = "encrypted"
vold
מגדיר אתvold.decrypt
ל-trigger_restart_min_framework
כי/data
מוצפן באמצעות סיסמה. - Mount tmpfs
init
מגדיר חמישה מאפיינים לשמירת אפשרויות ההרכבה הראשוניות שצוינו עבור/data
עם פרמטרים שהועברו מ-init.rc
.vold
משתמש במאפיינים האלה כדי להגדיר את מיפוי ההצפנה:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(מספר הקסדצימלי בן 8 הספרות ב-ASCII, שלפניו מופיע 0x)
- הפעלת מסגרת להצגת בקשה להזנת סיסמה
המסגרת מתחילה לפעול ורואה שהערך של
vold.decrypt
מוגדר כ-trigger_restart_min_framework
. ההגדרה הזו מציינת למסגרת שהיא מופעלת בדיסק tmpfs/data
ושהיא צריכה לקבל את סיסמת המשתמש.אבל קודם צריך לוודא שהדיסק הוצפן בצורה תקינה. היא שולחת את הפקודה
cryptfs cryptocomplete
אלvold
. הפונקציהvold
מחזירה 0 אם ההצפנה הושלמה בהצלחה, -1 אם הייתה שגיאה פנימית או -2 אם ההצפנה לא הושלמה בהצלחה. vold
קובע את זה על ידי בדיקה של דגלCRYPTO_ENCRYPTION_IN_PROGRESS
במטא-נתונים של ההצפנה. אם היא מוגדרת, סימן שהייתה הפרעה לתהליך ההצפנה ואין נתונים שמישים במכשיר. אם הפקודהvold
מחזירה שגיאה, בממשק המשתמש תוצג הודעה למשתמש להפעיל מחדש את המכשיר ולאפס אותו להגדרות המקוריות, ויוצג למשתמש לחצן שאפשר ללחוץ עליו כדי לעשות זאת. - פענוח נתונים באמצעות סיסמה
אחרי ש-
cryptfs cryptocomplete
יסתיים בהצלחה, במסגרת יוצג ממשק משתמש עם בקשה להזין את הסיסמה של הדיסק. ממשק המשתמש בודק את הסיסמה על ידי שליחת הפקודהcryptfs checkpw
אלvold
. אם הסיסמה נכונה (הסיסמה נקבעת על ידי טעינה מוצלחת של/data
מפוענח במיקום זמני, ואז ביטול הטעינה שלו),vold
שומר את השם של התקן הבלוק המפוענח במאפייןro.crypto.fs_crypto_blkdev
ומחזיר סטטוס 0 לממשק המשתמש. אם הסיסמה שגויה, הפונקציה מחזירה -1 לממשק המשתמש. - Stop framework
ממשק המשתמש מציג גרפיקה של אתחול מוצפן ואז קורא ל-
vold
עם הפקודהcryptfs restart
. הקודvold
מגדיר את המאפייןvold.decrypt
לערךtrigger_reset_main
, וכתוצאה מכךinit.rc
מבצעclass_reset main
. הפעולה הזו מפסיקה את כל השירותים בכיתה הראשית, וכך מאפשרת לבטל את הטעינה של tmpfs/data
. - Mount
/data
לאחר מכן,
vold
מטמיע את מחיצת/data
האמיתית שפוענחה ומכין את המחיצה החדשה (יכול להיות שהיא אף פעם לא הוכנה אם היא הוצפנה באמצעות האפשרות 'ניקוי', שלא נתמכת בגרסה הראשונה). הוא מגדיר את המאפייןvold.post_fs_data_done
ל-0 ואז מגדיר אתvold.decrypt
ל-trigger_post_fs_data
. כתוצאה מכך,init.rc
מריץ את הפקודותpost-fs-data
שלו. הם יוצרים את הספריות או הקישורים הנדרשים ואז מגדירים אתvold.post_fs_data_done
ל-1. כש-vold
רואה את הערך 1 במאפיין הזה, הוא מגדיר את המאפייןvold.decrypt
לערךtrigger_restart_framework
. כתוצאה מכך,init.rc
יתחיל שוב את השירותים בכיתהmain
וגם יתחיל את השירותים בכיתהlate_start
בפעם הראשונה מאז האתחול. - התחלת המסגרת המלאה
עכשיו המסגרת מפעילה את כל השירותים שלה באמצעות מערכת הקבצים המפוענחת
/data
והמערכת מוכנה לשימוש.
נכשלה
יכולות להיות כמה סיבות לכך שמכשיר לא מצליח לפענח את הנתונים. המכשיר מתחיל עם סדרת השלבים הרגילה לאתחול:
- זיהוי מכשיר מוצפן באמצעות סיסמה
- טעינת tmpfs
- התחלת מסגרת להצגת בקשה להזנת סיסמה
אבל אחרי שהמסגרת נפתחת, יכול להיות שיתרחשו במכשיר כמה שגיאות:
- הסיסמה תואמת אבל אי אפשר לפענח את הנתונים
- המשתמש מזין סיסמה שגויה 30 פעמים
אם השגיאות האלה לא נפתרות, מבקשים מהמשתמש לאפס את המכשיר להגדרות המקוריות:
אם vold
מזהה שגיאה במהלך תהליך ההצפנה, ואם עדיין לא נמחקו נתונים והמסגרת פועלת, vold
מגדיר את המאפיין vold.encrypt_progress
לערך error_not_encrypted
.
בממשק המשתמש מוצגת למשתמש הנחיה להפעיל מחדש את המחשב והתראה על כך שתהליך ההצפנה לא התחיל אף פעם. אם השגיאה מתרחשת אחרי שהמסגרת פורקה, אבל לפני שממשק המשתמש של סרגל ההתקדמות מוצג, vold
מפעיל מחדש את המערכת. אם ההפעלה מחדש נכשלת, הפונקציה מגדירה את vold.encrypt_progress
ל-error_shutting_down
ומחזירה -1, אבל לא יהיה שום דבר שיקלוט את השגיאה. זה לא אמור לקרות.
אם vold
מזהה שגיאה במהלך תהליך ההצפנה, הוא מגדיר את vold.encrypt_progress
לערך error_partially_encrypted
ומחזיר את הערך -1. בממשק המשתמש תוצג הודעה שההצפנה נכשלה, ויוצג כפתור לאיפוס המכשיר להגדרות המקוריות.
אחסון המפתח המוצפן
המפתח המוצפן מאוחסן במטא-נתונים של ההצפנה. הגיבוי של החומרה מיושם באמצעות יכולת החתימה של סביבת מחשוב אמינה (TEE). בעבר, הצפנו את מפתח המאסטר באמצעות מפתח שנוצר על ידי החלת scrypt על הסיסמה של המשתמש והמלח המאוחסן. כדי שהמפתח יהיה עמיד בפני מתקפות מחוץ לקופסה, אנחנו מרחיבים את האלגוריתם הזה על ידי חתימה על המפתח שמתקבל באמצעות מפתח TEE מאוחסן. לאחר מכן, החתימה שמתקבלת הופכת למפתח באורך המתאים על ידי יישום נוסף של scrypt. לאחר מכן המפתח הזה משמש להצפנה ולפענוח של מפתח המאסטר. כדי לאחסן את המפתח הזה:
- יצירת מפתח רנדומלי להצפנת דיסק (DEK) באורך 16 בייט ומלח באורך 16 בייט.
- מחילים scrypt על סיסמת המשתמש ועל ה-salt כדי ליצור מפתח ביניים 1 (IK1) בגודל 32 בייט.
- מוסיפים אפסים ל-IK1 עד לגודל של המפתח הפרטי שקשור לחומרה (HBK). באופן ספציפי, הריפוד הוא: 00 || IK1 || 00..00; בייט אחד של אפס, 32 בייטים של IK1, 223 בייטים של אפס.
- חותמים על IK1 עם HBK כדי ליצור IK2 בגודל 256 בייט.
- מפעילים scrypt על IK2 ומלח (אותו מלח כמו בשלב 2) כדי ליצור IK3 בגודל 32 בייט.
- משתמשים ב-16 הבייטים הראשונים של IK3 כ-KEK וב-16 הבייטים האחרונים כ-IV.
- הצפנה של DEK באמצעות AES_CBC, עם מפתח KEK ווקטור אתחול IV.
שינוי הסיסמה
כשמשתמש בוחר לשנות או להסיר את הסיסמה שלו בהגדרות, ממשק המשתמש שולח את הפקודה cryptfs changepw
אל vold
, ו-vold
מצפין מחדש את מפתח הראשי של הדיסק באמצעות הסיסמה החדשה.
מאפייני הצפנה
vold
ו-init
מתקשרים ביניהם באמצעות הגדרת מאפיינים. הנה רשימה של מאפיינים זמינים להצפנה.
מאפייני נפח
נכס | תיאור |
---|---|
vold.decrypt trigger_encryption |
הצפנה של הכונן ללא סיסמה. |
vold.decrypt trigger_default_encryption |
בודקים את הכונן כדי לראות אם הוא מוצפן ללא סיסמה.
אם כן, מבטלים את ההצפנה ומעלים אותו. אחרת, מגדירים את vold.decrypt ל-trigger_restart_min_framework. |
vold.decrypt trigger_reset_main |
ההגדרה הזו מוגדרת על ידי vold כדי לכבות את ממשק המשתמש שמבקש את סיסמת הדיסק. |
vold.decrypt trigger_post_fs_data |
ההגדרה מתבצעת על ידי vold כדי להכין את /data עם הספריות הנדרשות וכו'. |
vold.decrypt trigger_restart_framework |
מוגדר על ידי vold כדי להפעיל את המסגרת האמיתית ואת כל השירותים. |
vold.decrypt trigger_shutdown_framework |
מוגדר על ידי vold כדי לכבות את המסגרת המלאה כדי להתחיל בהצפנה. |
vold.decrypt trigger_restart_min_framework |
הערך מוגדר על ידי vold כדי להפעיל את ממשק המשתמש של סרגל ההתקדמות להצפנה או כדי להציג בקשה להזנת סיסמה, בהתאם לערך של ro.crypto.state . |
vold.encrypt_progress |
כשמסגרת העבודה מתחילה לפעול, אם המאפיין הזה מוגדר, היא נכנסת למצב ממשק משתמש של סרגל התקדמות. |
vold.encrypt_progress 0 to 100 |
בממשק המשתמש של סרגל ההתקדמות צריך להופיע ערך האחוז שהוגדר. |
vold.encrypt_progress error_partially_encrypted |
בממשק המשתמש של סרגל ההתקדמות צריכה להופיע הודעה על כך שההצפנה נכשלה, וצריכה להיות למשתמש אפשרות לאפס את המכשיר להגדרות היצרן. |
vold.encrypt_progress error_reboot_failed |
בממשק המשתמש של סרגל ההתקדמות צריכה להופיע הודעה שההצפנה הושלמה, ולמשתמש צריך להיות לחצן להפעלה מחדש של המכשיר. השגיאה הזו לא אמורה לקרות. |
vold.encrypt_progress error_not_encrypted |
בממשק המשתמש של סרגל ההתקדמות צריכה להופיע הודעה שאומרת שהתרחשה שגיאה, שלא בוצע הצפנה של נתונים ולא אבדו נתונים, וצריך להיות לחצן שמאפשר למשתמש להפעיל מחדש את המערכת. |
vold.encrypt_progress error_shutting_down |
ממשק המשתמש של סרגל ההתקדמות לא פועל, ולכן לא ברור מי מגיב לשגיאה הזו. בכל מקרה, זה לא אמור לקרות. |
vold.post_fs_data_done 0 |
הוגדר על ידי vold ממש לפני ההגדרה של vold.decrypt לערך trigger_post_fs_data . |
vold.post_fs_data_done 1 |
מגדירים את התזכורת באמצעות init.rc או init.rc מיד אחרי שמסיימים את המשימה post-fs-data . |
מאפייני init
נכס | תיאור |
---|---|
ro.crypto.fs_crypto_blkdev |
מוגדר על ידי הפקודה vold checkpw לשימוש מאוחר יותר על ידי הפקודה vold restart . |
ro.crypto.state unencrypted |
ההגדרה נקבעה על ידי init כדי לציין שהמערכת הזו פועלת עם /data ro.crypto.state encrypted לא מוצפן. ההגדרה נקבעת על ידי init כדי לציין
שהמערכת הזו פועלת עם /data מוצפן. |
|
חמשת המאפיינים האלה מוגדרים על ידי init כשהוא מנסה לטעון את /data עם פרמטרים שמועברים מ-init.rc . vold משתמש בהם כדי להגדיר את מיפוי ההצפנה. |
ro.crypto.tmpfs_options |
המשתנה מוגדר על ידי init.rc עם האפשרויות שצריך להשתמש בהן כשמטעינים את מערכת הקבצים /data tmpfs. |
פעולות init
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