2012-08-06 3 views
5

私は現在Djangoで構築されたREST APIへのリクエストを作成するモバイルアプリケーションに取り組んでいます。モバイルアプリの秘密鍵は、初めて生成するときにサーバと共有するにはどうすればよいですか?

APIを保護するために、私は秘密/公開鍵ペア認証システムの使用を計画しています。

私は考えているワークフローは、このような何か行く:Facebookのを使用して

  1. ユーザーログを
  2. ユーザーはアプリが
  3. 秘密鍵を生成し、署名したら、秘密鍵を間で共有されていますサーバーとそのアプリケーションを使用して、サーバーがその秘密鍵を特定のユーザーにマップすることを知るようにします。
  4. モバイルアプリケーションがリクエストするたびに、アプリケーションはリクエストパラメータとプライベートキーを使用してHMAC /署名を生成します。 HMACに加えて、アプリはそれを送信したユーザーのuser_idも送信します(これは公開キーとして機能します)。
  5. サーバーは要求を受信すると、独自のHMACを生成します。それはuser_idをとり、テーブルの秘密鍵を調べます。秘密鍵を使用して、要求パラメータでHMACを再作成し、モバイルアプリケーションが送信したHMACと比較します。サーバとモバイルが一致するHMACを持つ場合、サーバとモバイルは要求を実行します。

私の問題は、モバイルアプリとサーバーの間で何らかの形で秘密鍵を共有する必要があるステップ3にあります。私は秘密鍵を安全にどのように送信できますか?

答えて

4

私は、あなたのアプリのサーバー部分が秘密鍵を知る必要があるのか​​どうか尋ねることから始めます。ユーザーを認証したいだけであれば、公開鍵とユーザーIDだけが必要で、ユーザーIDは自分自身が公開鍵ではありません(使用する公開鍵を見つける方法が必要です)。

例えば、鍵を共有するプロセスは、あなたのステップ3は、このような何かを見ることができる:

  1. アプリは、公開鍵と秘密鍵のペアを生成します。
  2. アプリは、公開鍵を傍受できる人を気にすることなく、サーバーに送信します。
  3. サーバーは、公開鍵をユーザーが提供したIDに関連付けて保管します。

Facebookへの統合は、これを不可能にする部分かもしれません。私はFacebookがどのようにこのプロセス全体に入っているかをよく理解していません。

鍵の転送をさらに安全にすることができることの1つは、複数のチャネルを使用して転送することです。

たとえば、アプリケーションではREST APIを使用して生成された秘密鍵を送信できますが、対称暗号化方式で暗号化することができます。対称暗号化キーは、電子メールなどの他の媒体を介して送信することも、SMSを介して送信することもできます。これは、モバイルアプリであるか、または登録ユーザーが提供する番号に自動電話をかけます。キーは、ユーザーが入力できるものであることを確認するために、実際の対称暗号化キーを生成するランダムなパスフレーズにすることができます。次に、アプリのロックを解除するには、このパスフレーズを画面に入力する必要があり、秘密鍵のロックが解除されます。

この場合も、わずかなマージンで転送のセキュリティが向上します。特に、秘密鍵の送信を傍受できる場合は、パスフレーズを含む電子メールを傍受する可能性があるためです。私の意見では、プライベートキーをサーバに送信しないことは、最適であるだけでなく必須でもあります。

関連する問題