web-dev-qa-db-ja.com

携帯電話クライアント->デバイスに基づくサーバー認証

モバイルアプリケーション(Android、iOS)と、アプリケーションからのリクエストを処理するサーバーがあります。

SSL、パスワード、ランダムトークンを使用してユーザーを認証する標準認証を簡単に実行できます。

ただし、モバイルデバイスとユーザーを認証する方法はわかりません。ユーザーが他のデバイスを使用できないようにする必要があります(非常に正当な理由があるため)。

問題は、ユーザーが協力しないことを期待しなければならないことです。それどころか、彼はおそらく別のデバイスを使用しようとするでしょうが、私は彼を止めなければなりません。

SIMカードがこの問題の鍵だと思います。ただし、SIMカード自体に変更を加えることはできません(SIMに特別なSIMアプレットをインストールすることはできません)。すべてのSIMカードが提供する機能のみを使用できます。

可能な解決策はありますか?

2
vojta

Androidでは APIs を提供して、秘密鍵の素材をアプリに公開せずに保存および操作します(多くの場合、ハードウェアサポートを使用)。鍵を生成し、それを使用してサーバーへの認証を行うことができます。

キーはエクスポート不可としてマークできますが、ハードウェアで制限が適用されているかどうか、およびキーがバックアップに含まれるかどうかはわかりません。

IOSにもキーチェーンがありますが、キーは通常アプリからアクセスできるため、ルート化されたデバイスにコピーされる場合があります。

1
billc.cn

モバイルアプリ->サーバーシナリオでは、次のIDごとにアプローチするのが好きです

  1. ユーザーID-サーバーとの初期トランザクションを試行しているユーザー
  2. アプリケーションID-ユーザーがトランザクションを実行するために使用しているアプリケーション
  3. デバイスID-使用されている実際のデバイス。

これらはそれぞれ、包括的なID管理の重要な部分です。あなたの場合、デバイスのアイデンティティが焦点です。 SIMカードID、IMEI、UDID(Appleの場合)など、特定のデバイスをユーザーに関連付けるために使用できる多くのデバイス固有の情報があります。別の方法としては、デバイスの初期登録時に、そのデバイスで公開鍵と秘密鍵のペアを生成できます。公開鍵をサーバー上のユーザーIDに関連付けることができます。これで、セッションを開始したりトランザクションを実行したりするたびに、秘密鍵を使用してトークン(JWTなど)に署名し、リクエストで送信できます。サーバーでの認証/承認プロセスの一部として、受け取ったトークンを検証し、保存された関連付けに基づいて、認証されたユーザーIDと照合できます。

さらに、私はあなたが処理するための適切なプロセスを持っていると想定しています。1。モバイルデバイスの譲渡-人々はデバイスを売却または譲渡し、新しい人々はデバイスを使用してアプリケーションを実行したいと考えています(デバイスワイプの有無にかかわらず)。 2.複数のユーザー-同じ家族の人々が同じデバイスを使用して、トランザクションを実行するために異なるユーザーIDを使用する場合があります。

0
jhash