הצפנת דיסק מלאה היא תהליך של קידוד כל נתוני המשתמש במכשיר Android באמצעות מפתח מוצפן. אחרי שהמכשיר מוצפן, כל הנתונים שנוצרו על ידי המשתמש מוצפנים באופן אוטומטי לפני שהם נשמרים בדיסק, וכל הקריאות מפענחות את הנתונים באופן אוטומטי לפני שהן מחזירות אותם לתהליך הקריאה.
ב-Android נוספה הצפנת דיסק מלא, אבל היא הושקה ב-Android 5.0. את התכונות החדשות הבאות:
- יצירה של הצפנה מהירה, שמצפינה רק בלוקים בשימוש במחיצה של הנתונים כדי למנוע זמן הפעלה ארוך בפעם הראשונה. נכון לעכשיו, רק מערכות הקבצים ext4 ו-f2fs תומכות בהצפנה מהירה.
- הוספת את
forceencrypt
סימון fstab להצפנה באתחול הראשון. - נוספה תמיכה בתבניות ובהצפנה ללא סיסמה.
- נוספה אחסון של מפתח ההצפנה שמבוסס על חומרה באמצעות יכולת החתימה של סביבת מחשוב אמינה (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 ביט או יותר כדי להצפין את מפתח המאסטר.
בגרסה Android 5.0 קיימים ארבעה סוגים של מצבי הצפנה:
- ברירת מחדל
- קוד אימות
- סיסמה
- קו ביטול נעילה
בהפעלה הראשונה, המכשיר יוצר מפתח מאסטר של 128 ביט שנוצר באופן אקראי ואז הוא מגבב אותו עם סיסמת ברירת מחדל ונתוני salt מאוחסן. סיסמת ברירת המחדל היא: "default_password" עם זאת, על ה-hash שנוצר חותמים גם באמצעות TEE (כמו TrustZone), שבו נעשה שימוש ב-hash של החתימה כדי להצפין את מפתח המאסטר.
הסיסמה שמוגדרת כברירת מחדל מופיעה בקובץ cryptfs.cpp בפרויקט Android Open Source.
כשהמשתמש מגדיר את קוד האימות או את הסיסמה במכשיר, רק המפתח של 128 הביט מוצפן מחדש ונשמר. (כלומר, שינויים בקוד האימות/בסיסמאות/בתבניות של המשתמשים לא גורמים להצפנה מחדש של נתוני המשתמש). שימו לב מכשיר מנוהל להיות כפוף להגבלות של קוד האימות, קו ביטול הנעילה או הסיסמה.
ההצפנה מנוהלת על ידי init
ו-vold
.
init
קורא ל-vold
, ו-vold מגדיר מאפיינים להפעלה
אירועים באתחול. חלקים אחרים במערכת
לבדוק גם את המאפיינים כדי לבצע משימות כמו סטטוס של דיווח, לבקש
או בקשה לאיפוס להגדרות המקוריות במקרה של שגיאה חמורה. כדי להפעיל את תכונות ההצפנה ב-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
ללא סיסמה. (לא מוגדר אף מכשיר כי זה אמור להיות מכשיר חדש). - Mount tmpfs
vold
טוען tmpfs/data
(באמצעות אפשרויות tmpfs מ-ro.crypto.tmpfs_options
) ומגדיר את המאפייןvold.encrypt_progress
כ-0.vold
מכין את קוד האימות/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
ב-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
יוצר וכותב את המטא-נתונים הקריפטוגרפיים. - בזמן ההצפנה, צריך לטעון את tmpf
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
. כשה-framework רואה הערך שלvold.encrypt_progress
מוגדר ל-0, וזה מציג את סרגל ההתקדמות ממשק משתמש, ששולח שאילתה לגבי המאפיין הזה כל 5 שניות ומעדכן סרגל התקדמות. לולאת ההצפנה מעדכנת את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
מוצפן עם סיסמה או בלי סיסמה. - פענוח /נתונים
יצירת המכשיר
dm-crypt
מעל מכשיר הבלוק, כדי שהמכשיר יהיה מוכן לשימוש. - טעינה /נתונים
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
בפעם הראשונה הזמן שעבר מאז האתחול. - התחלת מסגרת
עכשיו ה-framework מפעיל את כל השירותים שלה באמצעות
/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)
- איך להפעיל את ה-framework כדי לבקש סיסמה
המסגרת מופעלת ומבחינה ש-
vold.decrypt
מוגדר ל-trigger_restart_min_framework
. כך המערכת יודעת שהיא מופעלת בדיסק/data
של tmpfs ושצריך לקבל את סיסמת המשתמש.עם זאת, קודם כול צריך לוודא שהדיסק הוצפן כראוי. הוא שולח את הפקודה
cryptfs cryptocomplete
אלvold
. הפונקציהvold
מחזירה את הערך 0 אם ההצפנה הושלמה, את הערך -1 אם הייתה שגיאה פנימית או את הערך -2 אם ההצפנה לא הושלמה.vold
קובע זאת על ידי חיפוש הדגלCRYPTO_ENCRYPTION_IN_PROGRESS
במטא-נתונים של הקריפטו. אם הוא מוגדר, תהליך ההצפנה הופסק ואין במכשיר נתונים שאפשר להשתמש בהם. אם הפונקציהvold
מחזירה הודעת שגיאה, בממשק המשתמש תוצג הודעה למשתמש על כך שהוא צריך להפעיל מחדש את המכשיר ולאפס אותו להגדרות המקוריות, וגם לחצן שעליו המשתמש צריך ללחוץ כדי לעשות זאת. - פענוח נתונים באמצעות סיסמה
אחרי ביצוע של
cryptfs cryptocomplete
בהצלחה, ה-framework מציג ממשק משתמש שמבקש את סיסמת הדיסק. ממשק המשתמש בודק את הסיסמה על ידי שולח את הפקודה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
. הפעולה הזו תפסיק את כל השירותים במחלקה הראשית, וכך ניתן לנתק את הטעינה של/data
ה-tmpf. - טעינה של
/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
בפעם הראשונה מאז האתחול. - התחלת המסגרת המלאה
עכשיו ה-framework מפעיל את כל השירותים שלה באמצעות
/data
המפוענח והמערכת מוכנה לשימוש.
נכשלה
מכשיר שהפענוח שלו נכשל, עלול להיות לא תקין מכמה סיבות. המכשיר מתחיל בסדרת השלבים הרגילה לאתחול:
- זיהוי מכשיר מוצפן עם סיסמה
- טעינה של tmpfs
- הפעלת המסגרת להצגת בקשה להזנת סיסמה
אבל אחרי שהמסגרת נפתחת, יכולות להתרחש במכשיר כמה שגיאות:
- הסיסמה תואמת אבל לא ניתן לפענח את הנתונים
- המשתמש מזין סיסמה שגויה 30 פעמים
אם השגיאות האלה לא נפתרו, מבקשים מהמשתמש לאפס את הנתונים להגדרות המקוריות:
אם vold
מזהה שגיאה במהלך תהליך ההצפנה, ואם עדיין לא הושמדו נתונים והמסגרת פועלת, vold
מגדיר את המאפיין vold.encrypt_progress
לערך error_not_encrypted
.
בממשק המשתמש יוצג למשתמש הודעה עם בקשה להפעיל מחדש את המכשיר והתראה על כך שתהליך ההצפנה לא התחיל. אם השגיאה מתרחשת לאחר שה-framework הוסר, אבל
לפני שממשק המשתמש של סרגל ההתקדמות יופעל, המערכת תופעל מחדש על ידי vold
. אם ההפעלה מחדש נכשלת, הפונקציה מגדירה את vold.encrypt_progress
לערך error_shutting_down
ומחזירה את הערך -1, אבל לא תהיה אפשרות לזהות את השגיאה. זה לא אמור לקרות.
אם vold
מזהה שגיאה בתהליך ההצפנה, היא מגדירה
vold.encrypt_progress
עד error_partially_encrypted
ומחזירה את הערך 1-. לאחר מכן, ממשק המשתמש אמור להציג הודעה שבה כתוב שההצפנה
הפעולה נכשלה ולספק למשתמש לחצן לאיפוס המכשיר להגדרות המקוריות.
אחסון המפתח המוצפן
המפתח המוצפן מאוחסן במטא-נתונים של הקריפטו. כדי להטמיע את התמיכה בחומרה, משתמשים ביכולת החתימה של סביבת המחשוב המאובטחת (TEE). בעבר, הצפנו את מפתח המאסטר באמצעות מפתח שנוצר באמצעות הצפנת scrypt לסיסמה של המשתמש ולנתוני ה-salt המאוחסנים. כדי שהמפתח עמיד מפני התקפות מחוץ לאריזה, אנחנו מרחיבים את האלגוריתם הזה על ידי חתימה על המפתח שמתקבל באמצעות מפתח TEE שמור. לאחר מכן החתימה שמתקבלת הופכת ל באורך של עוד אפליקציה אחת של scrypt. המפתח הזה משמש להצפנה ולפענח את מפתח המאסטר. כדי לאחסן את המפתח הזה:
- יצירת מפתח להצפנת דיסק (DEK) ורנדום של 16 בייטים ומלח של 16 בייטים.
- מחילים את scrypt על הסיסמה של המשתמש ועל המלח כדי ליצור מפתח ביניים 1 (IK1) באורך 32 בייטים.
- הוספת אפסים ל-IK1 עד לגודל של המפתח הפרטי המקושר לחומרה (HBK). באופן ספציפי, אנחנו מוסיפים את הנתונים הבאים: 00 || IK1 || 00..00; בייט אחד של אפס, 32 בייטים של IK1, 223 בייטים של אפס.
- שלחו IK1 מרופד עם HBK כדי להפיק IK2 של 256 בייט.
- מחילים scrypt על IK2 ו-salt (אותו המלח כמו בשלב 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. |
התחלת פעולות
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