المصادقة الآمنة للمستخدم

لحماية نظام المصادقة على Android، ننصحك بالتوقّف عن استخدام نموذج يستند إلى كلمات المرور، خاصةً للحسابات الحساسة، مثل الحسابات المصرفية وحسابات البريد الإلكتروني للمستخدمين. يُرجى العِلم أنّ بعض التطبيقات التي يثبّتها المستخدمون قد لا تكون آمنة وقد تحاول التصيّد الاحتيالي.

بالإضافة إلى ذلك، لا تفترض أنّ المستخدمين المصرَّح لهم فقط هم مَن سيستخدمون الجهاز. تُعد سرقة الهواتف مشكلة شائعة، ويستهدف المهاجمون الأجهزة غير المقفلة للاستفادة بشكل مباشر من بيانات المستخدمين أو التطبيقات المالية. نقترح أن تنفّذ جميع التطبيقات الحسّاسة مهلة معقولة للمصادقة (15 دقيقة؟) مع التحقّق من الهوية باستخدام المقاييس الحيوية، وأن تطلب مصادقة إضافية قبل تنفيذ إجراءات حسّاسة، مثل تحويل الأموال.

مربّع حوار المصادقة بالمقاييس الحيوية

تقدّم مكتبة Biometrics مجموعة من الدوال لعرض طلب يطلب المصادقة بالمقاييس الحيوية، مثل التعرّف على الوجه أو بصمة الإصبع. ومع ذلك، يمكن ضبط طلبات المصادقة باستخدام المقاييس الحيوية للرجوع إلى 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);
    });
}

أفضل الممارسات

ننصحك بالبدء بدرس البرمجة لمعرفة المزيد عن المقاييس الحيوية.

استنادًا إلى حالات الاستخدام، يمكنك تنفيذ مربّع الحوار مع اتّخاذ إجراء صريح من المستخدم أو بدونه. لتجنُّب الاحتيال، ننصحك بإضافة مربّع حوار القياسات الحيوية مع اتّخاذ إجراء صريح من المستخدم لكل معاملة. ندرك أنّ إضافة المصادقة قد تؤدي إلى حدوث بعض المشاكل في تجربة المستخدم، ولكن نظرًا لطبيعة المعلومات التي يتم التعامل معها في المعاملات المصرفية، ولأنّ المصادقة بالمقاييس الحيوية أسهل من طرق المصادقة الأخرى، نعتقد أنّه من الضروري إضافة هذا المستوى من التنقّل.

مزيد من المعلومات حول مصادقة المقاييس الحيوية

مفاتيح المرور

تعتبر مفاتيح المرور بديلاً أكثر أمانًا وسهولة لكلمات المرور. تستخدم مفاتيح المرور تشفير المفتاح العام لتمكين المستخدمين من تسجيل الدخول إلى التطبيقات والمواقع الإلكترونية باستخدام آلية قفل الشاشة على أجهزتهم، مثل بصمة الإصبع أو تكنولوجيا التعرّف على الوجوه. ويعفي ذلك المستخدم من الحاجة إلى تذكُّر كلمات المرور وإدارتها، ويوفّر أمانًا محسّنًا بشكل كبير.

يمكن أن تستوفي مفاتيح المرور متطلبات المصادقة المتعدّدة العوامل في خطوة واحدة، ما يغني عن استخدام كلمة مرور ورموز صالحة لمرة واحدة، وبالتالي توفير حماية قوية ضد هجمات التصيّد الاحتيالي وتجنُّب المشاكل التي يواجهها المستخدمون عند استخدام كلمات المرور الصالحة لمرة واحدة المستندة إلى الرسائل القصيرة أو التطبيقات. بما أنّ مفاتيح المرور موحّدة، يتيح تنفيذها مرة واحدة تجربة بدون كلمات مرور على جميع أجهزة المستخدمين ومتصفّحاتهم وأنظمة التشغيل الخاصة بهم.

على أجهزة Android، تتوفّر مفاتيح المرور باستخدام مكتبة Credential Manager Jetpack التي توحّد طرق المصادقة الرئيسية، بما في ذلك مفاتيح المرور وكلمات المرور وتسجيل الدخول الموحّد (مثل "تسجيل الدخول باستخدام حساب Google").

كيف يساعد ذلك في الحدّ من الاحتيال؟

تحميك مفاتيح المرور من هجمات التصيّد الاحتيالي لأنّها تعمل على التطبيقات والمواقع الإلكترونية المسجَّلة فقط.

المكوّن الأساسي لمفتاح المرور هو مفتاح تشفير خاص. عادةً، يكون هذا المفتاح الخاص متاحًا فقط على أجهزتك، مثل أجهزة الكمبيوتر المحمولة أو الهواتف الجوّالة، وتتم مزامنته على جميع الأجهزة من خلال مقدّمي بيانات الاعتماد (المعروفين أيضًا باسم مدراء كلمات المرور)، مثل "مدير كلمات المرور في Google". عند إنشاء مفتاح مرور، لا تحفظ الخدمة على الإنترنت سوى المفتاح العام المقابل. أثناء تسجيل الدخول، تستخدم الخدمة المفتاح الخاص لتوقيع تحدٍ من المفتاح العام. لا يمكن أن يكون مصدر هذا الرمز إلا أحد أجهزتك. بالإضافة إلى ذلك، يجب فتح قفل جهازك أو مخزن بيانات الاعتماد لمنع عمليات تسجيل الدخول غير المصرّح بها (على سبيل المثال، من هاتف مسروق).

لمنع الوصول غير المصرّح به في حال سرقة جهاز مفتوح القفل، يجب ربط مفاتيح المرور بفترة زمنية معقولة لانتهاء مهلة المصادقة. يجب ألا يتمكّن المهاجم الذي يسرق جهازًا من استخدام تطبيق ما لمجرّد أنّ المستخدم السابق كان قد سجّل الدخول إليه. بدلاً من ذلك، يجب أن تنتهي صلاحية بيانات الاعتماد على فترات منتظمة (مثل كل 15 دقيقة)، ويجب أن يُطلب من المستخدمين إثبات هويتهم من خلال إعادة المصادقة على قفل الشاشة.

في حال سرقة هاتفك، تحميك مفاتيح المرور لأنّ اللصوص لا يمكنهم سرقة كلمات المرور الخاصة بك لاستخدامها على أجهزة أخرى، فمفاتيح المرور خاصة بالجهاز. إذا كنت تستخدم "مدير كلمات المرور" من Google وتمت سرقة هاتفك، يمكنك تسجيل الدخول إلى حسابك على Google من جهاز آخر (مثل جهاز كمبيوتر) وتسجيل الخروج عن بُعد من الهاتف المسروق. يؤدي ذلك إلى عدم إمكانية استخدام "مدير كلمات المرور في Google" على الهاتف المسروق، بما في ذلك أي مفاتيح مرور محفوظة.

في أسوأ الحالات، إذا لم يتم استرداد الجهاز المسروق، ستتم إعادة مزامنة مفاتيح المرور مع الجهاز الجديد من خلال مقدّم خدمة بيانات الاعتماد الذي أنشأ مفتاح المرور وزمّنه. على سبيل المثال، قد يكون المستخدم قد اختار "مدير كلمات المرور في Google" لإنشاء مفتاح المرور، ويمكنه الوصول إلى مفتاح المرور على جهاز جديد من خلال تسجيل الدخول مرة أخرى إلى حسابه على Google وتقديم قفل الشاشة من الجهاز السابق.

يمكنك الاطّلاع على مزيد من المعلومات في مقالة أمان مفاتيح المرور في "مدير كلمات المرور في Google".

التنفيذ

تتوفّر مفاتيح المرور على الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android (المستوى 28 من واجهة برمجة التطبيقات) أو إصدار أحدث. تتوفّر ميزة "كلمات المرور" و"تسجيل الدخول باستخدام حساب Google" بدءًا من الإصدار 4.4 من نظام التشغيل Android. للبدء باستخدام مفاتيح المرور، اتّبِع الخطوات التالية:

  1. اتّبِع البرنامج التعليمي حول Credential Manager للتعرّف في البداية على كيفية تنفيذ مفاتيح المرور.
  2. راجِع إرشادات تصميم تجربة المستخدم مع مفاتيح المرور. يوضّح لك هذا المستند مسارات العمل المقترَحة لحالة الاستخدام.
  3. اطّلِع على "إدارة بيانات الاعتماد" من خلال اتّباع الدليل.
  4. خطِّط لتنفيذ "مدير بيانات الاعتماد" ومفاتيح المرور في تطبيقك، وخطِّط لإتاحة استخدام Digital Asset Links.

يمكنك الاطّلاع على مستندات المطوّرين لمعرفة المزيد من التفاصيل حول كيفية إنشاء مفاتيح المرور وتسجيلها والمصادقة باستخدامها.

إعادة ضبط الحساب بشكل آمن

سيحاول مهاجم غير مصرَّح له الوصول إلى تطبيقات حساسة، خاصةً تطبيقات الخدمات المصرفية أو تطبيقات الأموال، إذا تمكّن من الوصول إلى جهاز غير مقفل (مثلما يحدث عند سرقة هاتف). إذا كان التطبيق يتيح إثبات الهوية باستخدام المقاييس الحيوية، سيحاول المهاجم إعادة ضبط الحساب للوصول إليه. من الضروري ألا يعتمد مسار إعادة ضبط الحساب على المعلومات التي يمكن الوصول إليها بسهولة على الجهاز، مثل روابط إعادة ضبط كلمة المرور التي يتم إرسالها إلى البريد الإلكتروني أو عبر رسالة SMS.

في ما يلي بعض أفضل الممارسات الشائعة التي يمكنك دمجها في مسار إعادة ضبط كلمة المرور في تطبيقك:

  • التعرّف على الوجه، بالإضافة إلى كلمة المرور لمرة واحدة
  • أسئلة الأمان
  • عامل المعرفة (مثل اسم الأم أو مدينة الميلاد أو الأغنية المفضّلة)
  • إثبات الهوية باستخدام مستند تعريف

SMS Retriever API

تتيح لك واجهة برمجة التطبيقات SMS Retriever API التأكّد من هوية المستخدم عبر الرسائل القصيرة في تطبيق Android تلقائيًا. بهذه الطريقة، لن يُطلب من المستخدم كتابة رموز التحقّق يدويًا. بالإضافة إلى ذلك، لا تطلب واجهة برمجة التطبيقات هذه من المستخدم أذونات إضافية للتطبيق قد تكون خطيرة، مثل RECEIVE_SMS أو READ_SMS. ومع ذلك، يجب عدم استخدام الرسائل القصيرة كطريقة وحيدة لتأكيد هوية المستخدم بهدف الحماية من الوصول غير المصرّح به إلى الجهاز.

كيف يساعد ذلك في الحدّ من الاحتيال؟

يستخدم بعض المستخدمين رموز الرسائل القصيرة SMS كعامل المصادقة الوحيد، ما يوفّر نقطة دخول سهلة لعمليات الاحتيال.

تسمح واجهة برمجة التطبيقات SMS Retriever API للتطبيق باسترداد رمز الرسالة القصيرة مباشرةً بدون تفاعل المستخدم، ويمكن أن توفّر مستوى من الحماية ضد الاحتيال.

التنفيذ

تتضمّن عملية تنفيذ واجهة برمجة التطبيقات SMS Retriever API جزأين: Android والخادم.

Android: (الدليل)

  1. الحصول على رقم هاتف المستخدم
  2. ابدأ تشغيل برنامج SMS Retriever API.
  3. أرسِل رقم الهاتف إلى الخادم.
  4. تلقّي رسائل تأكيد
  5. أرسِل كلمة المرور لمرة واحدة إلى الخادم.

الخادم: (دليل)

  1. إنشاء رسالة تأكيد
  2. أرسِل رسالة التحقّق عبر الرسائل القصيرة SMS.
  3. أثبِت ملكية رمز OTP عند إرجاعه.

أفضل الممارسات

بعد دمج التطبيق والتحقّق من رقم هاتف المستخدم باستخدام واجهة برمجة التطبيقات SMS Retriever API، يحاول التطبيق الحصول على كلمة المرور لمرة واحدة. في حال نجاح ذلك، ستكون هذه إشارة قوية إلى أنّه تم استلام رسالة SMS على الجهاز تلقائيًا. وإذا لم تنجح العملية واضطر المستخدم إلى كتابة كلمة المرور الصالحة لمرة واحدة يدويًا، قد يكون ذلك علامة تحذير على أنّ المستخدم قد يتعرّض لعملية احتيال.

يجب عدم استخدام الرسائل القصيرة كآلية وحيدة لإثبات هوية المستخدم لأنّها تتيح إمكانية تنفيذ هجمات محلية، مثل هجوم من شخص يسرق جهازًا غير مقفل، أو هجمات استنساخ بطاقة SIM. ننصحك باستخدام المقاييس الحيوية كلما أمكن ذلك. على الأجهزة التي لا تتوفّر فيها أجهزة استشعار المقاييس الحيوية، يجب أن تعتمد مصادقة المستخدم على عامل واحد على الأقل لا يمكن الحصول عليه بسهولة من الجهاز الحالي.

مزيد من المعلومات

للاطّلاع على مزيد من المعلومات حول أفضل الممارسات، يُرجى مراجعة المراجع التالية: