4

モバイルアプリが有効な顧客によって使用されているかどうかを判断する便利な方法を実装する必要があります。私の顧客は、携帯電話を紛失した場合、間違いなくオペレーターに連絡してSIMカードをロックするだろうと私に言いました.

したがって、認証を SIM カードの有効性にバインドするのは自然なことのように思えます (正しい SIM が存在し、ロックされていない限り、アプリは動作します)。次に、紛失の場合、顧客は SIM カードをロックするだけで済みます (インターネット バンクは、トランザクションを承認するための SMS を携帯電話に送信するため)。

SIM カード関連のデータを読み取ろうとしましたが、一部の電話でのみ機能し、他の電話では機能しません (IMEI 番号の代わりに空の文字列が表示されることがあります)。

認証メカニズムを実装するにはどうすればよいですか。

  1. ユーザーにとって簡単 (ユーザーが新しいパスワードを生成/入力する必要がない)、
  2. 現在挿入されている SIM カードが有効かどうかの情報をアプリに提供します。
    1. アプリケーションの最初の起動時にそこにあった SIM と同じであり、
    2. ロックされていませんか?

不可能な場合、どのような認証の代替手段がありますか (SMS 確認付きの電子メール/パスワードと電話番号を除く) ?

更新 1 (2013 年 8 月 11 日 14:17 MSK):明らかな解決策の 1 つは、電話番号をログイン名として使用し、サーバーが生成した 6 桁の数字をパスワードとして使用することです。

次に、認証は次のように機能します。

  1. 最初の実行時に、ユーザーは自分の携帯電話番号を入力します。
  2. サーバーは、6 桁のパスワードを含むメッセージ (SMS) を送信します。
  3. ユーザーがそのパスワードを入力すると、アプリが動作を開始します。
  4. アプリは定期的にユーザーにパスワードを更新するように求めます (新しいパスワードは SMS 経由でも配信されます)。

このオプションについてどう思いますか?

どうにか改善できないでしょうか?

4

2 に答える 2

5

アプリを SIM プロパティでロックし、アプリのロックを解除するためにそれらのプロパティを提示する必要がある場合、それらのプロパティをアプリ内のどこに保存するか (ハードコード、データベース、ファイル、設定など) を考えたことはありますか? または、確認のためにサーバーに連絡することを考えていますか? いずれにせよ、セキュリティ上の欠陥の可能性がある複雑なソリューションになってしまう可能性があります。SIM シリアル番号は固有のものですが、同時に公開されているため、このプロパティに依存してアプリをロックすることはできません。

TelephonyManager クラスは、SIM プロパティにアクセスするためのゲートウェイです (このクラスは、さまざまな方法でユーザーのプライバシーも公開します)。現時点では、SIM で暗号化操作を実行するために公開されている android crypro API はありません。ただし、顧客はオペレーターに連絡できるため、オペレーターにアプリへの署名を依頼することを検討してください。その場合、SIMカードを安全な要素として使用する方法があるかもしれません. このスレッドで議論があります。試行回数が制限された PIN コード ベースは、アプリにアクセスするための簡単な認証を実装するもう 1 つの方法です。これは、SIM カードを使用せずにアプリケーション層で実装できます。

お役に立てれば。

于 2013-08-11T10:10:25.183 に答える
0

わかった。流れの大部分はすでに頭の中で設定されているようです。いくつかの具体的なことを追加しています:

1.登録

ユーザーは、SIM カードの側面に物理的に印刷されている SIM シリアル番号を明示的に読み取る必要があり、このシリアル番号をあなたに伝える必要があります (手動でオフラインでユーザーを登録している場合)。または、ユーザー自身がオンラインで登録することもできます。この特定の SIM シリアル番号を入力します (登録プロセスがオンラインでユーザー主導の場合)。これは一度だけの登録になります。

電話から SIM カードを取り出さずに SIM のシリアル番号を見つける方法がわかりません。あなたはそれをもっと探求することができます。

2. 認証

これで、ユーザーがアプリケーションを実行するたびに、SIM カードのシリアル番号、オペレーター コード、オペレーター名、オペレーターの国コードなどの SIM カード関連情報を読み取り、この情報を Web サーバーに通信して認証することができます。

これらの詳細を取得するには、TelephonyManagerの関数getSimOperatorName()getSimSerialNumbe()、を使用する必要があります。getSimCountryIso()

@rajesh はすでに IMEI にコメントしていないことに注意してください。SIMではなくデバイスを識別するために使用されるため、認証をSIMカード固有にしたい場合は役に立ちません。

3. チェック

認証に加えて、SIM カードの状態を確認するためのロジックを実装する必要があります (特定の時間間隔ごとに、またはアプリケーションが使用されているときのみ)。

getSimState()状態を読み取るには、TelephonyManager の関数を使用する必要があります。

SIM_STATE_NETWORK_LOCKED- SIM が通信事業者によってロックされていることを示します。(もちろん、SIM 紛失イベントの後にユーザーが SIM をロックするように報告したに違いない場合。 SIM_STATE_ABSENT- SIM カードが存在しないことを伝えます。

したがって、適切なメッセージをユーザーに表示して、アプリケーションを終了できます。

このアプローチは、要件に応じて変更して使用できます。お役に立てば幸いです。

于 2013-08-19T06:56:07.247 に答える