כיצד ליישם נעילת תבנית מאובטחת לאפליקציות מובייל
נעילת תבנית — מקורית לאנדרואיד, פחות נפוצה ב-iOS (אין מקבילה מערכתית). היא פועלת כמו קוד PIN: פתיחת נעילה מקומית של המכשיר ללא שליחת הסוד לשרת. אבל לתבנית יש בעיות אבטחה ספציפיות שחייבים להבין לפני היישום. הניסיון שלנו באימות מובייל (מעל 20 פרויקטים) מראה: יישום נכון עם מחסנית קריפטוגרפית מתאימה הופך את התבנית לנוחה ומאובטחת מספיק לרוב התרחישים.
שיקולי אבטחה
מדוע נעילת תבנית פגיעה לריגול מעבר לכתף?
טביעות אצבע נשארות על המסך. מחקר של אברהם ועמיתיו (2010) הראה שרוב המשתמשים מציירים תבניות בצורת L, Z או S — 12 התבניות הפופולריות ביותר מכסות כ-20% מבסיס המשתמשים. תבנית של 9 נקודות יכולה להשתחזר ויזואלית ממרחק של 1–2 מטרים בזווית תאורה נכונה. בפרקטיקה שלנו, אנו משתמשים בטיימר להסתרת הקו ובאנימציית דהייה כדי למזער דליפה.
כיצד התבנית מקודדת ומוגנת קריפטוגרפית?
רשת סטנדרטית של 3×3 — 9 נקודות עם אינדקסים 0–8. התבנית היא רצף של אינדקסים. אורך מינימלי הוא 4 נקודות (דרישת אנדרואיד). מתוך 9 נקודות עם אורך מינימלי של 4, יש כ-389,112 תבניות אפשריות — משמעותית פחות מקוד PIN בן 6 ספרות (1,000,000 צירופים). PIN מספק פי 2.5 יותר צירופים.
אנו מקודדים את התבנית למחרוזת אינדקסים: [0,1,2,5,8] → "01258". מחרוזת זו משמשת כקלט לגזירת מפתח — אותה סכמת PBKDF2 כמו עבור PIN. לעולם אל תאחסן את התבנית בטקסט פשוט. אחסן את המפתח הנגזר ב-Keychain (iOS) או ב-EncryptedSharedPreferences (אנדרואיד).
מידע נוסף על הסכמה הקריפטוגרפית
PBKDF2 עם salt ו-100,000 איטרציות — סף מינימלי. באנדרואיד, אנו מצפינים בנוסף באמצעות Android Keystore; ב-iOS, Secure Enclave. זה מבטיח הגנה גם אם המכשיר נפרץ.יישום ספציפי לפלטפורמה
תצוגה מותאמת אישית עם Jetpack Compose (אנדרואיד)
באנדרואיד, ניתן להשתמש ב-com.github.itsxtt:pattern-lock או בספריות קוד פתוח דומות לציור קווים בסיסי. אבל בפרויקטים ארגוניים, אנו כותבים משלנו: שליטה מלאה בוויזואליה, קריפטוגרפיה, וללא תלות בספריות שאינן נתמכות.
@Composable fun PatternLockView(
onPatternComplete: (List<Int>) -> Unit
) {
val selectedDots = remember { mutableStateListOf<Int>() }
var currentPosition by remember { mutableStateOf(Offset.Zero) }
Canvas(
modifier = Modifier
.fillMaxSize()
.pointerInput(Unit) {
detectDragGestures(
onDragStart = { offset -> /* найти ближайшую точку */ },
onDrag = { change, _ ->
currentPosition = change.position
// добавить точку если касание в радиусе
},
onDragEnd = {
if (selectedDots.size >= 4) onPatternComplete(selectedDots.toList())
selectedDots.clear()
}
)
}
) {
// рисуем точки и линии между selectedDots + линию до currentPosition
}
}פרטים מרכזיים: ניתן לבקר בנקודה רק פעם אחת; קו שחוצה נקודה שלא נגעו בה מוסיף אותה אוטומטית (התנהגות סטנדרטית של נעילת תבנית באנדרואיד); מרחק מגע מינימלי לנקודה הוא ~24dp. אנו מסתירים את התבנית לאחר 500–800 אלפיות השנייה — הקווים נעלמים, הנקודות נשארות. זה מונע ריגול מעבר לכתף.
יישום מותאם אישית באמצעות SwiftUI (iOS)
ל-iOS אין נעילת תבנית מערכתית. אנו מיישמים באמצעות SwiftUI @Composable fun PatternLockView( onPatternComplete: (List<Int>) -> Unit ) { val selectedDots = remember { mutableStateListOf<Int>() } var currentPosition by remember { mutableStateOf(Offset.Zero) } Canvas( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { detectDragGestures( onDragStart = { offset -> /* найти ближайшую точку */ }, onDrag = { change, _ -> currentPosition = change.position // добавить точку если касание в радиусе }, onDragEnd = { if (selectedDots.size >= 4) onPatternComplete(selectedDots.toList()) selectedDots.clear() } ) } ) { // рисуем точки и линии между selectedDots + линию до currentPosition } } + Canvas. לוגיקה מקבילה, ויזואליה מותאמת להנחיות ממשק המשתמש של iOS. ב-iOS, נעילת תבנית נדירה יותר — בדרך כלל בקשה ספציפית של לקוח (למשל, אפליקציות ילדים או כלים ארגוניים ייעודיים). אנו מבטיחים אינטגרציה חלקה עם ביומטריה (Face ID / Touch ID) ובמידת הצורך, אנימציות UI מותאמות אישית.
כיצד ליישם נעילת תבנית בשתי הפלטפורמות
- עיצוב UX של התבנית: אורך מינימלי, טיימרים, אנימציות.
- יישום תצוגה מותאמת אישית (Compose/SwiftUI) עם טיפול במחוות.
- אינטגרציה של הגנה קריפטוגרפית: PBKDF2, אחסון מאובטח במכלול.
- אינטגרציה עם ביומטריה והתחברות חלופית.
- תיעוד הקוד ותיאור הסכמה.
- בדיקות על מכשירים אמיתיים (מינימום 5 דגמים).
- מתן תמיכה לאחר היישום (שבועיים).
תבנית מול PIN: מתי להשתמש במה
| קריטריון | תבנית (3×3) | PIN (6 ספרות) |
|---|---|---|
| צירופים | ~389,112 (מינימום 4 נקודות) | 1,000,000 |
| עמידות לריגול מעבר לכתף | פגיעה, דורשת הגנה | בינונית |
| קלות הקלט | גבוהה, אינטואיטיבית | בינונית |
| המלצה | לאפליקציות ברגישות נמוכה | לבנקים, נתונים רפואיים |
התחברות עם תבנית נוחה לאפליקציות באבטחה נמוכה כמו מעקבים או מארגנים. לבנקאות, רפואה או גישה ארגונית, אנו ממליצים על PIN של 6+ ספרות עם PBKDF2 או ביומטריה.
טיפול בחלופות ובשגיאות
לאחר 5 ניסיונות כושלים — דרוש התחברות מלאה באמצעות פרטי כניסה. מונה הכישלונות מאוחסן ב-Keychain (iOS) או ב-EncryptedSharedPreferences (אנדרואיד). לאחר התחברות מוצלחת, אפס את המונה והצע לצייר מחדש את התבנית — חשוב להזהיר את המשתמש שהתבנית הישנה מתאפסת. מנגנון זה הוא חובה כדי להגן מפני ניחוש כוח bruteforce.
תוצרים ולוח זמנים
מה כלול בעבודה
- עיצוב UX: אורך מינימלי, טיימרים, אנימציות.
- יישום תצוגה מותאמת אישית (Compose/SwiftUI).
- הגנה קריפטוגרפית: PBKDF2, אחסון מאובטח.
- אינטגרציה עם ביומטריה והתחברות חלופית.
- קוד מקור מלא עם תיעוד.
- גישה למאגר פרטי (GitHub/GitLab).
- הדרכה לצוות שלך (שעה).
- בדיקות על לפחות 5 דגמי מכשירים אמיתיים.
- תמיכה לאחר היישום למשך שבועיים.
לוח זמנים ועלות משוערים
נעילת תבנית מותאמת אישית עם סכמה קריפטוגרפית נכונה בפלטפורמה אחת — 5–8 ימי עסקים. בשתי הפלטפורמות — 10–14 ימים (עם התאמת UX לכל מערכת הפעלה). עלות טיפוסית מתחילה ב-$500 לפלטפורמה ויכולה להגיע עד $1,500 בהתאם למורכבות האינטגרציה. אנו מעריכים את הפרויקט שלך — צור קשר כדי לדון בפרטים.







