אימות מאובטח של משתמשים

כדי להגן על מערכת האימות שלך ב-Android, מומלץ לשקול התרחקות מבוסס-סיסמה, במיוחד לחשבונות רגישים כמו המשתמשים שלך בנק וחשבונות אימייל. חשוב לזכור שבחלק מהאפליקציות שהמשתמשים מתקינים ייתכן שלא יהיה עם הכוונות הטובות ביותר שלכם, והם עלולים לנסות להטעות את המשתמשים שלכם.

כמו כן, אל תניח שרק משתמשים מורשים ישתמשו במכשיר. גניבת טלפון היא בעיה נפוצה, ותוקפים מטרגטים מכשירים לא נעולים כדי להרוויח ישירות מנתוני משתמשים או מאפליקציות פיננסיות. אנחנו ממליצים לכל האפליקציות הרגישות להטמיע תם פרק זמן סביר לאימות (15 דקות?) עם אימות ביומטרי לדרוש אימות נוסף לפני ביצוע פעולות רגישות כמו כסף העברות.

תיבת דו-שיח לאימות ביומטרי

בספרייה 'ביומטריה' יש קבוצה של פונקציות להצגת הנחיה אימות ביומטרי, כמו זיהוי פנים או זיהוי טביעת אצבע. אבל אפשר להגדיר שהנחיות ביומטריות יחזרו ל-LSKF, סיכונים ידועים לגלישת כתפיים. לאפליקציות רגישות, אנחנו ממליצים במקרה של זיהוי ביומטרי ללא צורך בקוד אימות, ולאחר מיושנות של ניסיונות ביומטריים המשתמשים יכולים להמתין, או להתחבר מחדש עם סיסמה או לאפס חשבונות. איפוס החשבון צריך לדרוש גורמים שלא ניתן לגשת אליהם בקלות במכשיר (שיטה מומלצת למטה).

איך הפעולות האלה עוזרות לצמצם הונאות וגניבת טלפונים

תרחיש לדוגמה ספציפי שיכול לעזור למנוע הונאה הוא לבקש אימות ביומטרי בתוך האפליקציה לפני העסקה. מתי המשתמשים אם רוצים לבצע עסקה פיננסית, תיבת הדו-שיח הביומטרית מוצגת לאמת שהוא אכן המשתמש המיועד שמבצע את העסקה. הזה שיטה מומלצת היא הגנה מפני תוקף שגונב מכשיר, ללא קשר התוקף יודע או לא יודע את ה-LSKF, כי הוא יצטרך לבדוק הבעלים של המכשיר.

לרמות אבטחה נוספות, אנחנו ממליצים למפתחי אפליקציות לבקש את סיווג 3 אימות ביומטרי ושימוש ב-CryptoObject לבנקאות עסקאות פיננסיות.

הטמעה

  1. חשוב לכלול את ספריית androidx.biometric.
  2. לכלול את תיבת הדו-שיח להתחברות ביומטרית בפעילות או בקטע שבו הלוגיקה שרוצים לאמת את המשתמש.

Kotlin


private var executor: Executor? = null
private var biometricPrompt: BiometricPrompt? = null
private var promptInfo: BiometricPrompt.PromptInfo? = null

fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_login)
  executor = ContextCompat.getMainExecutor(this)
  biometricPrompt = BiometricPrompt(this@MainActivity,
    executor, object : AuthenticationCallback() {
      fun onAuthenticationError(
        errorCode: Int,
        @NonNull errString: CharSequence
      ) {
        super.onAuthenticationError(errorCode, errString)
        Toast.makeText(
          getApplicationContext(),
          "Authentication error: $errString", Toast.LENGTH_SHORT
        )
          .show()
      }

      fun onAuthenticationSucceeded(
        @NonNull result: BiometricPrompt.AuthenticationResult?
      ) {
        super.onAuthenticationSucceeded(result)
        Toast.makeText(
          getApplicationContext(),
          "Authentication succeeded!", Toast.LENGTH_SHORT
        ).show()
      }

      fun onAuthenticationFailed() {
        super.onAuthenticationFailed()
        Toast.makeText(
          getApplicationContext(), "Authentication failed",
          Toast.LENGTH_SHORT
        )
          .show()
      }
    })
  promptInfo = Builder()
    .setTitle("Biometric login for my app")
    .setSubtitle("Log in using your biometric credential")
    .setNegativeButtonText("Use account password")
    .build()

  // Prompt appears when user clicks "Log in".
  // Consider integrating with the keystore to unlock cryptographic operations,
  // if needed by your app.
  val biometricLoginButton: Button = findViewById(R.id.biometric_login)
  biometricLoginButton.setOnClickListener { view ->
    biometricPrompt.authenticate(
      promptInfo
    )
  }
}

Java


private Executor executor;
private BiometricPrompt biometricPrompt;
private BiometricPrompt.PromptInfo promptInfo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    executor = ContextCompat.getMainExecutor(this);
    biometricPrompt = new BiometricPrompt(MainActivity.this,
            executor, new BiometricPrompt.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errorCode,
                @NonNull CharSequence errString) {
            super.onAuthenticationError(errorCode, errString);
            Toast.makeText(getApplicationContext(),
                "Authentication error: " + errString, Toast.LENGTH_SHORT)
                .show();
        }

        @Override
        public void onAuthenticationSucceeded(
                @NonNull BiometricPrompt.AuthenticationResult result) {
            super.onAuthenticationSucceeded(result);
            Toast.makeText(getApplicationContext(),
                "Authentication succeeded!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onAuthenticationFailed() {
            super.onAuthenticationFailed();
            Toast.makeText(getApplicationContext(), "Authentication failed",
                Toast.LENGTH_SHORT)
                .show();
        }
    });

    promptInfo = new BiometricPrompt.PromptInfo.Builder()
            .setTitle("Biometric login for my app")
            .setSubtitle("Log in using your biometric credential")
            .setNegativeButtonText("Use account password")
            .build();

    // Prompt appears when the user clicks "Log in".
    // Consider integrating with the keystore to unlock cryptographic operations,
    // if needed by your app.
    Button biometricLoginButton = findViewById(R.id.biometric_login);
    biometricLoginButton.setOnClickListener(view -> {
            biometricPrompt.authenticate(promptInfo);
    });
}

שיטות מומלצות

מומלץ להתחיל עם Codelab כדי לקבל מידע נוסף על נתונים ביומטריים.

בהתאם לתרחישים לדוגמה שלכם, תוכלו להטמיע את תיבת הדו-שיח עם או בלי לבצע פעולה מפורשת של המשתמש. כדי למנוע הונאה, אנחנו ממליצים להוסיף את המידע הביומטרי תיבת דו-שיח עם פעולה מפורשת מצד המשתמש לכל עסקה. אנחנו מבינים את זה הוספת אימות עלולה להקשות על חוויית המשתמש, אבל בשל אופי למידע שמטופל בעסקה של הבנק, והמידע הביומטרי הזה האימות חלק יותר משיטות אימות אחרות, אנחנו חושבים שנדרש כדי להוסיף את רמת הניווט הזו.

מידע נוסף על אימות ביומטרי

מפתחות גישה

הכניסה לחשבון באמצעות מפתחות גישה קלה ובטוחה יותר מאשר באמצעות סיסמה. שימוש במפתחות גישה קריפטוגרפיה של מפתח ציבורי שמאפשרת למשתמשים להיכנס לאפליקציות ולאתרים באמצעות מנגנון נעילת המסך במכשיר, למשל טביעת אצבע או זיהוי פנים וזיהוי אובייקטים. כך המשתמש לא צריך לזכור ולנהל סיסמאות, ומספקת אבטחה משופרת באופן משמעותי.

מפתחות גישה יכולים לעמוד בדרישות אימות רב-שלבי בשלב אחד, החלפת סיסמה וקודי OTP כדי לספק הגנה חזקה מפני התקפות פישינג ונמנעים מחוויית המשתמש הכואבת של הודעות SMS או אפליקציות חד פעמיות סיסמאות. מכיוון שמפתחות גישה הם סטנדרטיים, הטמעה יחידה מאפשרת ללא סיסמאות בקרב כל המשתמשים מכשירים, דפדפנים מערכות הפעלה.

ב-Android, אפשר להשתמש במפתחות גישה באמצעות Jetpack מנהל פרטי הכניסה שמרכזת את שיטות האימות העיקריות, כולל מפתחות גישה, סיסמאות וכניסה מאוחדת (כמו 'כניסה באמצעות חשבון Google').

איך הפעולות האלה עוזרות לצמצם הונאות

מפתחות גישה מגנים עליך מפני התקפות פישינג, כי הם פועלים רק אפליקציות ואתרים רשומים.

רכיב הליבה של מפתח גישה הוא מפתח פרטי קריפטוגרפי. בדרך כלל, המפתח הפרטי נמצא אך ורק במכשירים שלך, כמו מחשבים ניידים או טלפונים ניידים, והוא מסתנכרן ביניהם על ידי ספקי פרטי כניסה (שנקרא גם סיסמה) מנהלים), כמו מנהל הסיסמאות של Google. רק המפתח הציבורי התואם הוא נשמרות בשירות אונליין כשנוצר מפתח גישה. במהלך ההתחברות, משתמשת במפתח הפרטי כדי לחתום על אתגר מהמפתח הציבורי. זה יכול רק מאחד המכשירים שלכם. בנוסף, כדי שזה יקרה, צריך לבטל את הנעילה של המכשיר או את מאגר פרטי הכניסה, וכך למנוע כניסה לא מורשית לחשבון. (לדוגמה: מטלפון נגנב).

כדי למנוע גישה לא מורשית במקרה של גניבה של המכשיר, שנעילתו בוטלה, מפתחות הגישה צריכים להיות משולבים עם חלון זמן סביר לזמן קצוב לאימות. תוקף שגונב מכשיר לא אמור להיות מסוגל להשתמש באפליקציה כי המשתמש הקודם היה מחובר. במקום זאת, פרטי הכניסה יוסרו במרווחי זמן קבועים (למשל, כל 15 דקות), והמשתמשים לא יוכלו שנדרשות כדי לאמת את הזהות שלהם באמצעות אימות מחדש של נעילת המסך.

אם הטלפון שלך נגנב, מפתחות הגישה מגינים עליך כי הגנבים לא יכולים לגנוב את החשבון שלך סיסמאות לשימוש במכשירים אחרים – מפתחות הגישה הם ספציפיים למכשיר. אם משתמשים מנהל הסיסמאות של Google והטלפון שלך נגנב, יש לך אפשרות להתחבר לחשבון Google להיכנס לחשבון ממכשיר אחר (כמו מחשב) ולהתנתק מרחוק הטלפון נגנב. הפעולה הזו מגדירה את מנהל הסיסמאות של Google בטלפון שנגנב לא ניתן לשימוש, כולל מפתחות גישה שמורים.

במקרה הגרוע ביותר, אם המכשיר שנגנב לא ישוחזר, מפתחות הגישה סונכרן בחזרה למכשיר החדש על ידי ספק פרטי הכניסה שיצר וסונכרן את מפתח הגישה. לדוגמה, יכול להיות שהמשתמש בחר במנהל הסיסמאות של Google כדי ליצור את מפתח הגישה, כדי שתהיה לו גישה למפתח הגישה במכשיר חדש באמצעות כניסה לחשבון חזרה לחשבון Google שלו ולספק את נעילת המסך מהמכשיר הקודם במכשיר.

מידע נוסף זמין ב אבטחה של מפתחות גישה במאמר בנושא מנהל הסיסמאות של Google.

הטמעה

מפתחות גישה נתמכים במכשירים עם Android מגרסה 9 (API ברמה 28) ואילך. יש תמיכה בסיסמאות ובכניסה באמצעות חשבון Google החל מ-Android 4.4. שפת תרגום כדי להתחיל להשתמש במפתחות גישה:

  1. היעזרו בקוד Lab של מנהל פרטי הכניסה כדי להבין בפעם הראשונה איך להטמיע מפתחות גישה.
  2. מעיינים בהנחיות לעיצוב חוויית משתמש במפתחות גישה. במסמך הזה מוסבר על התהליכים המומלצים לתרחיש שלכם.
  3. במדריך הזה מוסבר איך בודקים את מנהל פרטי הכניסה.
  4. מתכננים את ההטמעה של מנהל פרטי הכניסה ומפתחות הגישה לאפליקציה. כדאי להוסיף תמיכה בקישורים לנכסים דיגיטליים.

במסמכי התיעוד למפתחים מוסבר איך יוצרים ונרשמים. לבצע אימות באמצעות מפתחות גישה.

איפוס מאובטח של החשבון

תוקף לא מורשה עם גישה למכשיר לא נעול (למשל, כאשר טלפון ינסה לגשת לאפליקציות רגישות, במיוחד אפליקציות של בנקאות או אפליקציות במזומן. אם באפליקציה מוטמע אימות ביומטרי, התוקף ינסה לאפס אותו לחשבון שאליו רוצים להיכנס. חיוני לתהליך איפוס החשבון לא להסתמך רק על מידע שנגיש בקלות במכשיר, כמו אימייל או SMS חד-פעמי איפוס קישורים.

הנה שיטות מומלצות נפוצות שאפשר לשלב באיפוס האפליקציה זרימה:

  • זיהוי פנים, בנוסף ל-OTP
  • שאלות אבטחה
  • גורם ידע (כמו שם נעורים של אם, עיר לידה או מקום מועדף שיר)
  • אימות באמצעות תעודה מזהה

ממשק API של SMS Retriever

ממשק ה-API של SMS Retriever מאפשר לבצע אימות משתמש מבוסס-SMS אפליקציית Android באופן אוטומטי. כך המשתמש לא יידרש להזין קודי אימות באופן ידני. כמו כן, ה-API לא מבקש מהמשתמש הרשאות לאפליקציות נוספות שעלולות להיות מסוכנות, כמו RECEIVE_SMS או READ_SMS. עם זאת, לא כדאי להשתמש ב-SMS כאימות המשתמש היחיד להגן מפני גישה מקומית לא מורשית למכשיר.

איך הפעולות האלה עוזרות לצמצם הונאות

חלק מהמשתמשים משתמשים בקודי SMS בתור גורם האימות היחיד שלהם, נקודת כניסה קלה למניעת הונאה.

ממשק ה-API של SMS Retriever מאפשר לאפליקציה לאחזר ישירות את קוד ה-SMS מבלי אינטראקציה עם המשתמשים, ויכול לספק רמה של הגנה מפני הונאה.

הטמעה

היישום של ממשק ה-API של SMS Retriever כולל שני חלקים: Android ושרת.

Android: (מדריך)

  1. משיגים את מספר הטלפון של המשתמש.
  2. מפעילים את הלקוח ל-SMSRetriever.
  3. שולחים את מספר הטלפון לשרת.
  4. לקבל הודעות אימות.
  5. שולחים את הסיסמה החד-פעמית (OTP) לשרת.

שרת: (מדריך)

  1. יוצרים הודעת אימות.
  2. שולחים את הודעת האימות ב-SMS.
  3. מאמתים את ה-OTP אחרי שהוא מוחזר.

שיטות מומלצות

לאחר אינטגרציה של האפליקציה ומתבצע אימות של מספר הטלפון של המשתמש ממשק ה-API של SMS Retriever, הוא מנסה לקבל את ה-OTP. אם היא מצליחה, אות לכך שהודעת ה-SMS התקבלה במכשיר באופן אוטומטי. אם לא ניתן הפעולה מצליחה והמשתמש צריך להקליד באופן ידני את הסיסמה החד-פעמית (OTP). זה יכול להיות סימן אזהרה לכך שהמשתמש חווה הונאה.

אין להשתמש ב-SMS כמנגנון האימות היחיד למשתמשים כי הוא יוצא מהחדר למתקפות מקומיות, כמו תוקף ששודד מכשיר לא נעול; או SIM במתקפות שכפול. מומלץ להשתמש בנתונים ביומטריים כשהדבר אפשרי. במצב מופעל שבהם אין חיישנים ביומטריים זמינים, עליך לאמת את המשתמש מסתמכים על גורם אחד לפחות שלא ניתן להשיג בקלות מהמכשיר הנוכחי.

מידע נוסף

למידע נוסף על שיטות מומלצות, כדאי לעיין במקורות המידע הבאים: