מדוע כדאי להצפין את SharedPreferences?
לאחרונה, בפרויקט של לקוח, התגלתה פרצת אבטחה: אסימון האימות אוחסן בטקסט רגיל. לאחר פריצה דרך ADB (ניפוי באגים היה מופעל בגרסת ה-release), תוקפים השיגו גישה ל-10,000 אסימונים תוך מספר דקות. שכתבנו את האחסון ל-EncryptedSharedPreferences—זה סגר את וקטור התקיפה לחלוטין. 99% מהתקריות הדומות כוללות נתונים לא מוצפנים במכשיר.
אסימונים, הגדרות, מפתחות API—כל אלה חייבים להיות נעולים. גם אם האפליקציה לא משתמשת בביומטריה, הצפנה מגנה מפני גישה פיזית, גיבויים ותוכנות זדוניות. אנו מבטיחים סודיות נתונים באמצעות הצפנה דו-רמתית מ-Jetpack Security. במשך 5+ שנים, יישמנו הגנה ביותר מ-20 פרויקטים—אפס תקריות. ביקורת אבטחה תראה שהאפליקציה שלך עומדת ב-OWASP Mobile Top 10.
איך עובד EncryptedSharedPreferences?
האתחול דורש מפתח ראשי מ-Android Keystore. Google Tink מספק חוזק קריפטוגרפי: מפתחות מוצפנים עם AES256-SIV (הצפנה דטרמיניסטית לחיפוש), ערכים עם AES256-GCM. המפתח הראשי מאוחסן באחסון מגובה חומרה וקשור למכשיר.
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.setUserAuthenticationRequired(false) // true если нужна биометрия
.build()
val prefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)ה-API זהה ל-val masterKey = MasterKey.Builder(context) .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) .setUserAuthenticationRequired(false) // true если нужна биометрия .build() val prefs = EncryptedSharedPreferences.create( context, "secure_prefs", masterKey, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) הרגיל—SharedPreferences, putString, getString. אין צורך בקוד נוסף. עם זאת, יש ניואנסים: edit().apply() אינו נתמך, והקובץ קשור למכשיר.
| מדד | SharedPreferences רגיל | EncryptedSharedPreferences |
|---|---|---|
| אבטחה | נתונים בטקסט רגיל | נתונים מוצפנים (AES256) |
| ביצועים | ~0.1 אלפיות השנייה לקריאה | ~2–5 אלפיות השנייה לקריאה |
| גיבוי | מועתק במלואו | דורש החרגה מ-backup_rules.xml |
מה בדיוק מוצפן ואיך?
| סוג נתונים | לפני הצפנה | אחרי הצפנה |
|---|---|---|
| הגדרות | getAll() |
<string name="theme">dark</string> (AES256-SIV) |
| אסימונים | base64:... |
<string name="token">eyJ...J9</string> (AES256-GCM) |
קובץ ה-Secure Prefs מכיל blob לא קריא. גם עם גישה פיזית למכשיר, לא ניתן לפענח נתונים ללא המפתח הראשי מ-Keystore. מניסיוננו, גישה זו סוגרת 99% מהאיומים לאחסון נתוני סשן.
איך לבצע מיגרציה ללא אובדן נתונים?
מיגרציה מ-SharedPreferences רגיל היא משימה טיפוסית שאנו משלימים תוך 4–8 שעות. תוכנית שלב אחר שלב:
- קרא את כל המפתחות מהקובץ הישן באמצעות
base64:...(חריג למיגרציה; לאחר מכן שכתב לקריאות מפורשות). - כתוב כל מפתח לקובץ המוצפן החדש באמצעות
getAll(). - מחק את הקובץ הישן
edit().putString(). - החלף את כל קריאות ה-
context.deleteSharedPreferences("old_name")בקוד ב-getSharedPreferences. - הוסף
EncryptedSharedPreferences.createוהחרג את הקובץ המוצפן מ-Auto Backup.
חשוב: android:fullBackupContent="@xml/backup_rules" אינו נתמך ב-EncryptedSharedPreferences בסביבת ייצור—לאחר המיגרציה, שכתב את האיטרציה למפתחות מפורשים.
מהם המלכודות בשימוש ב-EncryptedSharedPreferences?
אם המכשיר מופעל מחדש וביומטריה מופעלת, ייתכן שעובדי רקע לא יקבלו גישה לנתונים. פתרון: הגדר במפורש getAll() והשתמש בסכימת setUserAuthenticationRequired(false). זה מבטיח גישה לאחר אתחול.
קובץ ההעדפות קשור ל-Keystore של המכשיר. לא ניתן להעתיקו למכשיר אחר—זה מגן מפני הוצאת נתונים. בגרסאות אלפא מוקדמות של Jetpack Security (לדוגמה, 1.1.0-alpha02), היה באג שגרם לאובדן נתונים בתנאים מסוימים—לקחנו זאת בחשבון ותמיד משתמשים בגרסאות יציבות.
כאשר המכשיר מאופס או ה-PIN משתנה, המפתח הראשי עלול להפוך לבלתי זמין. במקרה כזה, הנתונים המוצפנים אובדים ללא אפשרות שחזור. אנו ממליצים תמיד על תוכנית גיבוי—לדוגמה, אחסון אסימוני רענון בנפרד או שימוש בגיבוי ענן.
מתי EncryptedSharedPreferences אינו מספיק?
אם יש צורך בנתונים בעובד רקע ללא משתמש על המסך והמכשיר הופעל מחדש, יש צורך בשליטה ישירה על Android Keystore או שימוש ב-DEVICE_CREDENTIAL לנפחים גדולים. לכתיבת קבצים בזרימה (תמונות, לוגים), Jetpack Security EncryptedFile מתאים יותר. הוא אינו מוגבל בגודל ותומך בהצפנת זרימה.
מה כלול בעבודה ולוחות זמנים
- ייעוץ בנושא ארכיטקטורת אחסון נתונים.
- הגדרת מפתח ראשי (עם ביומטריה או בלעדיה).
- מיגרציה של כל ה-SharedPreferences הקיימים, תוך התחשבות ב-
EncryptedFileו-getAll(). - בדיקות על API 23+ (מעל 30 מכשירים).
- תיעוד והמלצות תחזוקה.
- חודש תמיכה לאחר השקת האפליקציה.
לוחות זמנים: החלפה פשוטה—4–8 שעות עם בדיקות. אם מעורבים Auto Backup ותצורה מורכבת, הוסף עוד כמה שעות. העלות מחושבת באופן אישי לאחר ניתוח הפרויקט שלך. צור קשר כדי לקבל הערכה.
יישמנו הגנת נתונים ליותר מ-20 אפליקציות אנדרואיד—אפס תקריות. קבל הערכת אבטחה לאפליקציה שלך—ההערכה אורכת יום אחד. צור קשר כדי להגן על נתוני המשתמשים שלך.







