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

لحماية نظام المصادقة في 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);
    });
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

التنفيذ

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

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

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

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

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

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

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

واجهة برمجة التطبيقات SMS Retriever API

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

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

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

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

التنفيذ

هناك جزءان لتنفيذ واجهة برمجة تطبيقات SMS Retriever API: Android وServer.

Android: (الدليل)

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

الخادم: (guide)

  1. إنشاء رسالة تحقق.
  2. أرسل رسالة التحقق عن طريق SMS.
  3. تحقَّق من كلمة المرور الصالحة لمرة واحدة عند إرجاعها.

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

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

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

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

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