web-dev-qa-db-ja.com

モバイルアプリでのログインとパスワードなしの認証

アプリ開発を始めて、最初のアプリのログインフローについて考えています。 WhatsappやClash of Clansなどの他のアプリは、接続するためにサインアップまたはログインプロセスを必要としません。だから、私はこの方法論について学びました:

  1. アプリを初めて起動する場合は、ユーザーが選択したユーザー名で「サインアップ」イベントをサーバーに送信します。
  2. サーバーは、ユーザー名がすでに使用されているかどうかを確認し、使用されていない場合は、ユーザー名を使用してデータベースにアカウントを作成し、64文字の長さのアクセストークンを生成します。
  3. サーバーはクライアントにアクセストークンを送信します
  4. クライアントは、以降のログイン要求のためにアクセストークンを保存し、それが認証の唯一の方法になります。

すべての接続プロセスは、TLSを介してsocket.ioサーバーに送信されます。

これはリモートまたはローカルの攻撃者に対して安全ですか?アクセストークンをローカルに保存する最良の方法は何ですか?ローカルで暗号化する必要がありますか?暗号化するにはどうすればよいですか?サーバーデータベースで暗号化する必要がありますか?

4
zearthur99

私はITセキュリティの専門家(IT監査人)として働いているので、経験から答えることができます。

まず、安全なトークンを定義します。アクセストークンを保護するには、次の条件を満たす必要があります。

  1. トークンがいつか期限切れになる
  2. トークンは、クライアントとサーバーの間の転送中に変更できません。
  3. ユーザーはトークンを変更できません。

トークンがいつか期限切れになる

この要件は最も簡単です。サーバー側で、このトークンが無効になる日付を指定します。ログインの日付>トークンの有効期限の場合、トークンが期限切れであることを拒否します。

トークンはクライアントとサーバー間で転送中に変更できません

TLSを使用しているので(できればバージョン1.2で、ファイナライズ時に1.3に更新してください)、この問題はすでに解決されているはずです。 TLSは機密性を提供し、アクセストークンが許可なしに開示されないでないことを第三者に保証します。

ユーザーはトークンを変更できません

この要件は最も困難です。これに伴うには、PKIでデジタル署名を使用する必要があります。 このアルゴリズムは安全でないため、ハッシュ関数としてSHA 1を使用しないでください。アクセストークンにハッシュ関数を適用すると、メッセージダイジェストが生成されます。メッセージダイジェストはユーザーのみが知っている秘密鍵を使用して暗号化されます。ユーザーの公開鍵を使用してサーバー上で資格情報が復号化されると、結果のメッセージがサーバー上の資格情報と一致する場合、アクセストークンの変更が行われないことが保証されます。ユーザーが行われた。

上記の方法は、C-機密性、およびI-セキュリティCIAトライアドの整合性要件を保証します。受信した暗号化されたメッセージをユーザーの公開鍵で復号化できるため、否認防止(ユーザーが自分の資格情報であることを否定できない)も保証されます。

他のいくつかの質問に答えるには:

保存時にアクセストークンをローカルで暗号化する必要がありますか?

はい、そうする必要があります。上記は転送中のデータに関するものですが、静止していないです。ハッカーがローカルクライアントマシンを危険にさらした場合、彼または彼女は簡単にプレーンテキストトークンを盗み、正当な所有者になりすますことができます。

暗号化するにはどうすればよいですか?

AESやRSAなどの強力な暗号化アルゴリズムを使用する必要があります。セキュリティを最大化するには、長いキー(例:256)を選択します。

2
Anthony

これはリモートまたはローカルの攻撃者に対して安全ですか?

考えられることの1つは、悪意のあるユーザーがアクセストークンを再生して、有効なクライアントになりすますことです。
これを軽減するために、タイムスタンプを使用できます。別のオプションは、すべてのリクエストの後にサーバーから新しいアクセストークンを取得することです。

アクセストークンをローカルに保存する最良の方法は何ですか?ローカルで暗号化する必要がありますか?暗号化するにはどうすればよいですか?サーバーデータベースで暗号化する必要がありますか?

アクセストークンを暗号化された値としてローカルストレージに保持することで機能します。私はモバイルアプリの専門家ではありませんが、モバイルアプリのデータベースにアクセスできると思います。そこに暗号化されたデータを保存できます。同時に、サーバー上でトークンを暗号化しておくこともお勧めします。

1
Limit

これはリモートまたはローカルの攻撃者に対して安全ですか?

あなたが述べた目標を達成するために、あなたは本当にトークンがサーバーのみのキーでサーバー側で暗号化されることを望みます。長い話を短くするために、これは初心者の開発者として適切に行うことは非常に困難です

これを正しく行うには、以下に対する保護を検討する必要があります。

  • Malleability-ユーザーがトークンを読み取ることができるかどうかに関係なく、ユーザーがトークンを変更(または拡張)する機能。通常、これは [〜#〜] hmac [〜#〜] で行われます。
  • Replay-ユーザー(またはトークンにアクセスする他の誰か)が別のコンテキストでトークンを再利用する機能。これは、有効期限を使用して、またはより完全に使い捨てトークン(使用ごとに更新される)を使用して行うことができ、ソリューションごとに異なるサーバー側リソースが必要です。
  • 総当たりの復号化または相関- Rainbow tables などの攻撃に基づく。これらは通常 salts および peppers /paddingで軽減されます。

また、サーバーキーを定期的にローテーションし、生成したトークンの下位互換性を維持し(たとえば、アプリの古いバージョンの場合)、妥協があった場合(たとえば、取り消したいか)この場合、すべての未処理のトークン?)。

最終分析

独自のスキームを作成したい場合は、確かな(そして最新の)暗号化の背景を持つ誰かと協力することをお勧めします。私は缶詰のソリューションをお勧めしますが、私は自由に利用でき、本当にプラグアンドプレイで安全なものは何も知りません。

1