הצפנת דיסק מלאה היא תהליך של קידוד כל נתוני המשתמש במכשיר Android באמצעות מפתח מוצפן. אחרי שהמכשיר מוצפן, כל הנתונים שנוצרו על ידי המשתמש מוצפנים באופן אוטומטי לפני שהם נשמרים בדיסק, וכל הקריאות מפענחות את הנתונים באופן אוטומטי לפני שהן מחזירות אותם לתהליך הקריאה.
הצפנה מלאה של הדיסק נוספה ל-Android בגרסה 4.4, אבל בגרסה 5.0 נוספו התכונות החדשות הבאות:
- יצירה של הצפנה מהירה, שמצפינה רק בלוקים בשימוש במחיצה של הנתונים כדי למנוע זמן הפעלה ארוך בפעם הראשונה. נכון לעכשיו, רק מערכות הקבצים ext4 ו-f2fs תומכות בהצפנה מהירה.
- הוספנו את הדגל fstab
forceencrypt
להצפנה בהפעלה הראשונה. - נוספה תמיכה בדפוסים ובהצפנה ללא סיסמה.
- נוספה אחסון של מפתח ההצפנה שמבוסס על חומרה באמצעות יכולת החתימה של סביבת מחשוב אמינה (TEE) (למשל ב-TrustZone). פרטים נוספים זמינים במאמר אחסון המפתח המוצפן.
זהירות: מכשירי Android ששודרגו לגרסת 5.0 ולאחר מכן עברו הצפנה, אפשר להחזיר למצב ללא הצפנה באמצעות איפוס לנתוני היצרן. אי אפשר להחזיר למצב ללא הצפנה מכשירים חדשים עם Android 5.0 שהוצפנו בהפעלה הראשונה.
איך פועלת הצפנת הדיסק המלאה ב-Android
הצפנת הדיסק המלאה של Android מבוססת על dm-crypt
, שהיא תכונה של הליבה שפועלת בשכבת מכשיר הבלוק. לכן, ההצפנה פועלת עם Embedded MultiMediaCard (eMMC) ומכשירי פלאש דומים שמציגים את עצמם לליבה כמכשירי בלוק. אי אפשר לבצע הצפנה באמצעות YAFFS, שמדברת ישירות עם צ'יפ פלאש NAND גולמי.
אלגוריתם ההצפנה הוא תקן הצפנה מתקדם (AES) של 128 ביט עם שרשור של בלוקים מוצפנים (CBC) ו-ESSIV:SHA256. מפתח המאסטר מוצפן באמצעות AES של 128 ביט באמצעות קריאות לספריית OpenSSL. צריך להשתמש ב-128 ביט או יותר למפתח (אפשר להשתמש ב-256 ביט).
הערה: יצרני ציוד מקורי יכולים להשתמש ב-128 ביט או יותר כדי להצפין את מפתח המאסטר.
במהדורה 5.0 של Android יש ארבעה מצבי הצפנה:
- ברירת מחדל
- קוד אימות
- סיסמה
- קו ביטול נעילה
בהפעלה הראשונה, המכשיר יוצר מפתח ראשי של 128 ביט שנוצר באופן אקראי, ולאחר מכן מבצע עליו גיבוב באמצעות סיסמת ברירת מחדל ומלח ששמור. סיסמת ברירת המחדל היא: "default_password" עם זאת, על ה-hash שנוצר חותמים גם באמצעות TEE (כמו TrustZone), שבו נעשה שימוש ב-hash של החתימה כדי להצפין את מפתח המאסטר.
הסיסמה שמוגדרת כברירת מחדל מופיעה בקובץ cryptfs.cpp בפרויקט Android Open Source.
כשהמשתמש מגדיר את קוד האימות או את הסיסמה במכשיר, רק המפתח של 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
.
תהליכים
יש ארבעה תהליכים במכשיר מוצפן. המכשיר מוצפן רק פעם אחת, ואז מתבצע תהליך הפעלה רגיל.
- הצפנת מכשיר שלא היה מוצפן בעבר:
- הצפנת מכשיר חדש באמצעות
forceencrypt
: הצפנה חובה במהלך האתחול הראשון (החל מ-Android L). - הצפנת מכשיר קיים: הצפנה ביוזמת המשתמש (Android K וגרסאות קודמות).
- הצפנת מכשיר חדש באמצעות
- הפעלת מכשיר מוצפן:
- הפעלת מכשיר מוצפן ללא סיסמה: הפעלת מכשיר מוצפן שלא הוגדרה לו סיסמה (רלוונטי למכשירים עם Android מגרסה 5.0 ואילך).
- הפעלת מכשיר מוצפן באמצעות סיסמה: הפעלת מכשיר מוצפן שמוגדרת לו סיסמה.
בנוסף לתהליכים האלה, יכול להיות שהמכשיר לא יצליח להצפין את /data
.
בהמשך מוסבר בהרחבה על כל אחד מהתהליכים.
הצפנת מכשיר חדש באמצעות forceencrypt
זהו הפעלת האתחול הראשונה הרגילה במכשיר Android 5.0.
- זיהוי מערכת קבצים לא מוצפנת באמצעות הדגל
forceencrypt
/data
לא מוצפן, אבל צריך להצפין אותו כיforceencrypt
מחייב זאת. ביטול הטעינה של/data
. - התחלת ההצפנה של
/data
vold.decrypt = "trigger_encryption"
מפעיל אתinit.rc
, שגורם ל-vold
להצפין את/data
ללא סיסמה. (לא מוגדר אף מכשיר כי זה אמור להיות מכשיר חדש). - טעינה של tmpfs
vold
מחבר את tmpfs/data
(באמצעות אפשרויות tmpfs מ-ro.crypto.tmpfs_options
) ומגדיר את המאפייןvold.encrypt_progress
לערך 0.vold
מכין את tmpfs/data
להפעלה של מערכת מוצפנת ומגדיר את המאפייןvold.decrypt
לערך:trigger_restart_min_framework
- הצגת המסגרת כדי להציג את ההתקדמות
מכיוון שבמכשיר אין כמעט נתונים להצפנה, סרגל ההתקדמות לא יופיע לעיתים קרובות כי ההצפנה מתבצעת במהירות. למידע נוסף על ממשק המשתמש של ההתקדמות, ראו הצפנת מכשיר קיים.
- כשהנתונים ב-
/data
מוצפנים, מסירים את המסגרתvold
מגדיר אתvold.decrypt
לערךtrigger_default_encryption
, שמפעיל את השירותdefaultcrypto
. (הפעולה הזו מפעילה את התהליך שמתואר בהמשך, שבו מתבצעת התקנה של נתוני משתמש מוצפנים כברירת מחדל).trigger_default_encryption
בודק את סוג ההצפנה כדי לראות אם/data
מוצפן עם סיסמה או בלי סיסמה. מאחר שמכשירי Android 5.0 מוצפנים בהפעלה הראשונה, לא אמורה להיות מוגדרת סיסמה. לכן אנחנו מפענחים ומטעינים את/data
. - טעינה של
/data
לאחר מכן,
init
מחבר את/data
ל-tmpfs RAMDisk באמצעות פרמטרים שהוא מקבל מ-ro.crypto.tmpfs_options
, שמוגדר ב-init.rc
. - מסגרת התחלה
vold
מגדיר אתvold.decrypt
לערךtrigger_restart_framework
, וכך ממשיך תהליך האתחול הרגיל.
הצפנת מכשיר קיים
זה מה שקורה כשאתם מצפינים מכשיר Android K או קודם לכן, לא מוצפן, שהועתק לגרסה L.
התהליך הזה מופעל על ידי המשתמש, והוא נקרא 'הצפנה במקום' בקוד. כשמשתמש בוחר להצפין מכשיר, ממשק המשתמש מוודא שהסוללה טעונה במלואה שמתאם המתח מחובר כדי שיהיה מספיק חשמל כדי לסיים את תהליך ההצפנה.
אזהרה: אם המכשיר יתרוקן מהסוללה ויכבה לפני שההצפנה תסתיים, נתוני הקובץ יישארו במצב מוצפן חלקית. צריך לאפס את המכשיר להגדרות המקוריות, וכל הנתונים יאבדו.
כדי להפעיל הצפנה במקום, 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
מוצפן ללא סיסמהזיהוי של מכשיר Android מוצפן כי לא ניתן לטעון את
/data
ושהוגדר אחד מהדגליםencryptable
אוforceencrypt
.הפונקציה
vold
מגדירה את הערך שלvold.decrypt
בתורtrigger_default_encryption
, שמפעיל את השירותdefaultcrypto
.trigger_default_encryption
בודק את סוג ההצפנה כדי לראות אם/data
מוצפן עם סיסמה או בלי סיסמה. - פענוח /data
יצירת המכשיר
dm-crypt
מעל מכשיר הבלוק, כדי שהמכשיר יהיה מוכן לשימוש. - טעינה של /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
המוצפן, והמערכת מוכנה לשימוש.
הפעלת מכשיר מוצפן ללא הצפנת ברירת מחדל
זה מה שקורה כשמפעילים מכשיר מוצפן עם סיסמה מוגדרת. הסיסמה של המכשיר יכולה להיות קוד אימות, קו ביטול נעילה או סיסמה.
- זיהוי מכשיר מוצפן באמצעות סיסמה
זיהוי של מכשיר Android שהוצפן כי הדגל
ro.crypto.state = "encrypted"
vold
מגדיר אתvold.decrypt
כ-trigger_restart_min_framework
כי/data
מוצפן באמצעות סיסמה. - טעינה של 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
. כך המערכת מקבלת הודעה שהיא מופעלת בדיסק/data
של tmpfs ושצריך לקבל את סיסמת המשתמש.עם זאת, קודם כול צריך לוודא שהדיסק הוצפן כראוי. הפונקציה שולחת את הפקודה
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 לממשק המשתמש. - מסגרת להפסקה
בממשק המשתמש מוצגת גרפיקה של אתחול קריפטוגרפיה, ולאחר מכן מתבצעת קריאה ל-
vold
עם הפקודהcryptfs restart
.vold
מגדיר את המאפייןvold.decrypt
לערךtrigger_reset_main
, וכתוצאה מכךinit.rc
מבצע את הפעולהclass_reset main
. הפעולה הזו תפסיק את כל השירותים בכיתה הראשית, ותאפשר לבטל את הרכבת tmpfs/data
. - טעינה של
/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
מפעיל שוב את השירותים ב-classmain
, וגם מפעיל את השירותים ב-classlate_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) ורוטב (salt) בגודל 16 בייטים באופן אקראי.
- מחילים את scrypt על הסיסמה של המשתמש ועל המלח כדי ליצור מפתח ביניים 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
נכס | תיאור |
---|---|
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 עם האפשרויות ש-init צריכה להשתמש בהן כשטעינה את מערכת הקבצים /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