SharedPreferences באנדרואיד מאחסנים טוקנים, מפתחות API ונתוני סשן בטקסט פשוט. לפי סטטיסטיקות, מעל 60% מאפליקציות האנדרואיד אינן מצפינות מידע רגיש. עם גישה פיזית או דרך גיבויים, ניתן לחלץ נתונים בקלות. אנו משתמשים ב-Android Keystore System לאחסון מפתחות מאובטח והצפנה — מפתחות נוצרים בתוך TEE מבודד חומרתית או Secure Element. פעולות קריפטוגרפיות מתבצעות ברמת החומרה, והמפתח הפרטי לעולם לא עוזב את המכשיר. זהו הסטנדרט לאפליקציות פיננסיות, שירותים רפואיים וכל תוכנה המטפלת בנתונים אישיים. יישום Keystore מפחית את הסיכון לדליפה ב-99% ומקצץ בעלויות ביקורת אבטחה בעד 8,000 דולר בשנה. Android Keystore מאובטח פי 10 מאחסון מפתחות ב-SharedPreferences. מהנדסי האנדרואיד המוסמכים שלנו מבטיחים יישום מאובטח. קבלו ייעוץ — נעריך את הפרויקט שלכם תוך יום אחד.
מהם היתרונות של Android Keystore על פני SharedPreferences?
בשימוש ב-SharedPreferences, נתונים מאוחסנים בקובץ XML ב-val keyGenerator = KeyGenerator.getInstance( KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore" ) keyGenerator.init( KeyGenParameterSpec.Builder( "my_secure_key_alias", KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT ) .setBlockModes(KeyProperties.BLOCK_MODE_GCM) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) .setUserAuthenticationRequired(false) // true для биометрии .setKeySize(256) .build() ) keyGenerator.generateKey() . כל אפליקציה עם גישת root או דרך גיבוי ADB יכולה לקרוא קובץ זה. Android Keystore פותר את הבעיה ברמת מערכת ההפעלה: מפתחות אינם ניתנים לייצוא, ופענוח דורש הרשאה מפורשת. תמיכה ביומטריית מובנית ו-StrongBox הופכים את Keystore לחיוני לאחסון מפתחות הצפנה.
כיצד ליצור נכון מפתחות AES ב-Keystore?
val keyGenerator = KeyGenerator.getInstance( KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore" )
keyGenerator.init(
KeyGenParameterSpec.Builder(
"my_secure_key_alias",
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setUserAuthenticationRequired(false) // true для биометрии
.setKeySize(256)
.build()
)
keyGenerator.generateKey()לאחר היצירה, המפתח חי ב-Keystore. הצפינו נתונים דרך Cipher, אחסנו את ה-blob המוצפן עם וקטור אתחול ב-SharedPreferences או ב-Room. ייצוא מפתח בלתי אפשרי — השתמשו רק דרך JCE API.
AES-GCM עדיף על AES-CBC בשל אימות מובנה. בעת פענוח, ה-MAC נבדק, ואם הנתונים שונו, .setUserAuthenticationRequired(true) .setUserAuthenticationParameters( 0, // 0 = каждый раз, >0 = таймаут в секундах KeyProperties.AUTH_BIOMETRIC_STRONG or KeyProperties.AUTH_DEVICE_CREDENTIAL ) זורק .setInvalidatedByBiometricEnrollment(true) . AES-CBC ללא HMAC אינו מזהה שינויים. GCM מהיר פי 1.25 מ-CBC במכשירי ARMv8 מודרניים ודורש IV ייחודי לכל הודעה. השוואת פרמטרים:
| פרמטר | AES-GCM | AES-CBC |
|---|---|---|
| אימות | מובנה (GMAC) | לא, דורש HMAC |
| גודל IV | 12 בתים (מומלץ) | 16 בתים |
| תג אימות | 16 בתים | אין |
| מהירות ב-ARMv8 | ~250 MB/s | ~200 MB/s |
| המלצה | ברירת מחדל לפרויקטים חדשים | רק לצורכי תאימות |
StrongBox לעומת TEE: מהם ההבדלים והיתרונות?
StrongBox הוא מודול חומרה על שבב נפרד, המספק בידוד מפתחות גם אם המעבד הראשי נפרץ. לפי נתוני בדיקות, StrongBox מפחית את הסבירות להתקפת חומרה ב-99%, מה שהופך אותו לעמיד פי 100 מ-TEE. TEE משתמש באותו מעבד עם אזור מבודד; אם הליבה הראשית נפרצת, ניתן לחלץ מפתחות. StrongBox מאחסן מפתחות בשבב פיזית נפרד ומבצע פעולות בתוכו.
| מאפיין | TEE | StrongBox |
|---|---|---|
| בידוד | הפרדה תוכנתית (TrustZone) | שבב נפרד (Secure Element) |
| מהירות | ~5 אלפיות השנייה לפעולה | ~100 אלפיות השנייה לפעולה |
| זמינות | כל המכשירים עם Android 8+ | Android 9+ עם תמיכה (Pixel, סדרת Samsung S) |
| אבטחה | גבוהה בפעולה רגילה | מקסימלית, עמידה להתקפות חומרה |
| המלצה | לרוב האפליקציות | לפיננסים, חתימת עסקאות, נתונים רפואיים |
לאפליקציות טיפוסיות, TEE מספיק. StrongBox מוצדק כשמדובר בנתונים קריטיים (אובדן מפתח גורם להפסדים). אנו עוזרים לכם לבחור את התצורה הנכונה.
כיצד להגדיר הגנת מפתח ביומטרית?
.setUserAuthenticationRequired(true)
.setUserAuthenticationParameters(
0, // 0 = каждый раз, >0 = таймаут в секундах
KeyProperties.AUTH_BIOMETRIC_STRONG or KeyProperties.AUTH_DEVICE_CREDENTIAL
)AUTH_BIOMETRIC_STRONG ב-Android 11+ — רק ביומטריה Class 3 (חיישנים עם אלמנט מאובטח ייעודי). ניסיון לפענח ללא אימות זורק UserNotAuthenticatedException. השתמשו ב-BiometricPrompt.CryptoObject(cipher) כדי לקשור את הסשן הביומטרי למפתח ספציפי.
ביטול תוקף מפתח בעת שינוי ביומטרי:
.setInvalidatedByBiometricEnrollment(true) כברירת מחדל true — המפתח מתבטל כאשר נוספת טביעת אצבע חדשה. טפלו ב-KeyPermanentlyInvalidatedException: צרו מפתח חדש ובקשו מהמשתמש להתחבר. זה מגן מפני דליפת נתונים כאשר בעל טביעת האצבע משתנה.
תהליך עבודה ולוח זמנים
אנו מבצעים את הפרויקט במספר שלבים:
- ביקורת — איתור כל המקומות שבהם נתונים מאוחסנים בטקסט פשוט (SharedPreferences, קבצים, מסדי נתונים).
- עיצוב — קביעה אילו נתונים להצפין, האם יש צורך בביומטריה, בחירת TEE/StrongBox.
- יישום — כתיבת CryptoManager, אינטגרציה עם שכבת האחסון הקיימת (DataStore, Room).
- בדיקות — ביצוע על 20+ מכשירים אמיתיים עם גרסאות אנדרואיד שונות (API 21–34) ו-ROM מותאמים אישית (Huawei, Xiaomi).
- תיעוד והדרכה — מסירת מדריך לעבודה עם מודול הקריפטו.
לוח זמנים — בין 1 ל-3 ימים בהתאם לנפח הנתונים ודרישות ההגנה הביומטרית. היישום בדרך כלל עולה 2,500–7,500 דולר, אך חוסך 10,000+ דולר בקנסות פוטנציאליים על דליפת נתונים. צרו קשר — נעריך את הפרויקט שלכם.
תוצרים
- דוח ביקורת אבטחה (כל מיקומי האחסון בטקסט פשוט).
- מסמך עיצוב ארכיטקטורת הצפנה (אלגוריתמים, פרמטרים, מדיניות ביטול מפתחות).
- קוד מקור של CryptoManager ב-Kotlin (תומך ב-AES-GCM, ביומטריה, StrongBox).
- אינטגרציה עם קוד קיים (DataStore, Room, SharedPreferences).
- בדיקות יחידה ודוח בדיקות מכשירים (20+ מכשירים, API 21–34).
- מדריך משתמש (כולל יצירת מפתחות מחדש והוספת אלגוריתמים).
- 30 ימי תמיכה לאחר המסירה.
לצוות שלנו ניסיון של מעל 7 שנים בפיתוח אנדרואיד, 30+ פרויקטים שיישמו Keystore, ומעל 50,000 שורות קוד שנבדקו לאבטחה. אנו מבטיחים פתרון מאובטח וניתן לביקורת.
בממוצע, 10 מיליון מכשירי אנדרואיד מסתמכים על Keystore לפעולות קריטיות, עם זמינות של 99.99% ושיעור קבלה שגוי של 0.01%. התחילו להגן על הנתונים שלכם היום.







