安全なユーザー認証

Android の認証システムを保護するために、 特にユーザーのアカウントのような機密性の高いアカウントの場合、パスワード ベースのモデルです。銀行 管理できるようになります。ユーザーがインストールしたアプリによっては、 ユーザーをフィッシングしようとすることがあります。

また、許可されたユーザーだけがデバイスを使用することを想定しないでください。スマートフォンの盗難 よく見られる問題であり、攻撃者はロック解除されたデバイスを標的にして直接利益を得ようとしている 金融アプリから保護できます機密情報を扱うすべてのアプリは、 合理的な認証タイムアウト(15 分?)を達成し、生体認証と 金銭など機密性の高い操作を行う前に追加の認証を要求する できます。

生体認証ダイアログ

生体認証ライブラリには、プロンプトを表示する関数のセットが用意されており、 顔認証や指紋認証などの生体認証。 ただし、生体認証プロンプトは LSKF にフォールバックするように構成できます。LSKF では、 ショルダー サーフィンのリスクに関する既知のリスクをご覧ください。機密性の高い情報を扱うアプリの場合は、 生体認証が PIN にフォールバックせず、生体認証の再試行をすべて完了した後に、 待機するか、パスワードで再ログインするか、アカウントをリセットできます。アカウントのリセット デバイスでアクセスしにくい要素を必要とする(ベスト プラクティス) をご覧ください)。

不正行為やスマートフォンの盗難の抑制にどのように役立つか

不正行為の防止に役立つユースケースの一つとして、 アプリ内での生体認証を取引前に行えます。ユーザーが 金融取引を行うには、生体認証ダイアログが表示され そのユーザーが本当に取引を行っているユーザーであることを確認します。この 攻撃者によるデバイスの窃取を防ぐことが ベストプラクティスとなります 攻撃者が 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 をご覧ください。

ユースケースに応じて、使用または使用せずにダイアログを実装できます。 許可します。不正行為を避けるため、生体認証と トランザクションごとに明示的なユーザー アクションを表示するダイアログ。私たちは 認証を追加すると UX に摩擦が生じる可能性がありますが、認証の性質上、 銀行取引で処理される情報と生体認証が 他の認証方法よりもスムーズです。 必要があります。

詳しくは、生体認証についての説明をご覧ください。

パスキー

パスキーは、パスワードに代わるより安全で簡単な方法です。パスキーの使用 ユーザーがアプリやウェブサイトにログインできるようにする公開鍵暗号 デバイスの画面ロック(指紋や顔など)を使用して認証を行う あります。ユーザーはパスワードを覚えたり管理したりする必要がなくなります。 セキュリティが大幅に向上します

パスキーは、1 つのステップで多要素認証の要件を満たすことができます。 パスワードと OTP コードの両方を置き換えて 攻撃に対する堅牢な保護を提供します フィッシング攻撃を回避し、SMS やアプリベースの 1 回限りのユーザー エクスペリエンスの課題を回避 できます。パスキーは標準化されているため、1 回の実装で すべてのユーザー環境でパスワードレス エクスペリエンスをデバイス、ブラウザ、 OS です。

Android では、認証情報マネージャー Jetpack を使用してパスキーがサポートされます 統合するライブラリであり、パスキー、パスキー、 フェデレーション ログイン([Google でログイン] など)の機能です。

不正行為の軽減にどのように役立つか

パスキーはご利用のデバイスでしか機能しないため、フィッシング攻撃から保護できます 登録済みのアプリとウェブサイトです。

パスキーのコア コンポーネントは暗号秘密鍵です。通常、この ノートパソコンやスマートフォンなどのお客様のデバイス上にのみ保管され、 認証情報プロバイダ(パスワード)によってネットワーク間で同期され、 Google パスワード マネージャーなど)にアクセスできます。対応する公開鍵のみが パスキーの作成時にオンライン サービスによって保存されるデータ。ログイン中、サービスは は、秘密鍵を使用して公開鍵からチャレンジに署名します。この操作でできるのは、 どのデバイスからも ユーザーがアクセスできるようになりますさらに、これを行うには、 デバイスまたは認証情報ストアのロックを解除して不正なログインを防ぐ (盗難されたスマートフォンなど)。

ロックが解除されたデバイスが盗まれた場合の不正アクセスを防ぐために、 有効な認証タイムアウト期間を設定する必要があります。「 デバイスを盗む攻撃者は、単にアプリ自体を 以前のユーザーがログインしていたからです代わりに、この認証情報は 間隔(例: 15 分ごと)で期限切れになり、ユーザーは 画面ロックの再認証による本人確認が必要になります。

パスキーを利用すれば、スマートフォンが盗まれても、盗まれたユーザーの個人情報が パスワード(パスキーはデバイス固有のもの)です。以下をご使用の場合: Google パスワード マネージャーやスマートフォンが盗まれたら、Google 別のデバイス(パソコンなど)からアカウントを作成し、 盗まれたスマートフォン。盗まれたスマートフォン上の Google パスワード マネージャーが 利用できない状態になっている可能性があります。

最悪のシナリオとして、盗まれたデバイスを復元できないと、パスキーが悪用され、 作成および同期した認証情報プロバイダによって新しいデバイスに再度同期される 表示されます。たとえば、ユーザーが Google パスワード マネージャーを選択して パスキーを作成できます。また、署名することで新しいデバイスでパスキーにアクセスできます。 Google アカウントに再度アクセスし、以前のデバイスの画面ロックを ダウンロードします

詳しくは、 Google パスワード マネージャーでのパスキーのセキュリティに関する記事を参照してください。

実装

パスキーは、Android 9(API レベル 28)以降を搭載しているデバイスでサポートされています。 パスワードと「Google でログイン」は、Android 4.4 以降でサポートされています。宛先 パスキーの利用を開始する手順は次のとおりです。

  1. 認証情報マネージャーの Codelab に沿って、パスキーの実装方法に関する基礎知識を学びます。
  2. パスキーのユーザー エクスペリエンス設計ガイドラインを確認します。このドキュメントでは、ユースケースに推奨されるフローについて説明します。
  3. ガイドに沿って認証情報マネージャーについて学習する。
  4. アプリの認証情報マネージャーとパスキーの実装を計画します。デジタル アセット リンクのサポートの追加を計画します。

リソースを作成、登録、管理する方法について詳しくは、デベロッパー向けドキュメントをご覧ください。 パスキーで認証します。

アカウントの安全なリセット

ロック解除されたデバイスにアクセスできる不正な攻撃者(たとえば、 盗まれた場合など)は、機密性の高いアプリ、特にバンキング アプリや現金アプリにアクセスしようとします。 アプリに生体認証が実装されている場合、攻撃者はリセットを試みる ログインする必要がありますアカウントのリセットフローでは、API の制限を メールや SMS OTP など、デバイスから簡単にアクセスできる情報 リンクをリセットできます。

アプリのリセットに取り入れることができる一般的なベスト プラクティスは次のとおりです。 フロー:

  • 顔認識(OTP 以外)
  • セキュリティ保護用の質問
  • 知識要素(母親の旧姓、出生地、お気に入りなど) 曲)
  • ID 確認

SMS Retriever API

SMS Retriever API を使用すると、 自動的にダウンロードされます。こうすることで、ユーザーが 確認コードを手動で入力します。また、この API はユーザーに 危険性のある追加のアプリ権限(RECEIVE_SMSREAD_SMS。ただし、SMS を唯一のユーザー確認として デバイスへの不正なローカル アクセスから保護します。

不正行為の軽減にどのように役立つか

ユーザーによっては、SMS コードを唯一の認証要素として使用し、 不正行為の侵入口として利用されます

SMS Retriever API により、アプリは SMS コードを直接取得できるようになります。 不正行為に対して一定のレベルの保護を提供できます。

実装

SMS Retriever API の実装は、Android とサーバーの 2 つの部分に分かれています。

Android:(ガイド

  1. ユーザーの電話番号を取得します。
  2. SMS Retriever クライアントを起動します。
  3. 電話番号をサーバーに送信します。
  4. 確認メッセージを受信します。
  5. OTP をサーバーに送信します。

サーバー:(ガイド

  1. 確認メッセージを作成します。
  2. 確認メッセージを SMS で送信します。
  3. OTP が返却されたら、その OTP を確認します。

おすすめの方法

アプリが統合され、ユーザーの電話番号の確認が完了すると SMS Retriever API が OTP の取得を試みます成功すれば、それは強力な そのデバイスで SMS が自動的に受信されたことが通知されます。オンになっていない場合 ユーザーが OTP を手動で入力しなければならない場合、警告の兆候となる可能性があります。 不正行為の疑いがあることを意味します。

SMS はスペースから出るので、唯一のユーザー確認メカニズムとして SMS を使用しないでください。 (例: ロック解除されたデバイスを盗むなど)SIM 防止できます。可能な限り、生体認証システムを使用することをおすすめします。オン ユーザーの認証は、生体認証センサーが利用できない場合に、 現在のデバイスから簡単に取得できない要素が少なくとも 1 つ依存している。

詳細

ベスト プラクティスについて詳しくは、次のリソースをご覧ください。