web-dev-qa-db-ja.com

モバイルクライアントが使用するWebサービスを保護する簡単な方法

私は現在、JavaでRESTful Webサービスに取り組んでいます。つまり、AndroidおよびiOS、両方から抽象化できるフレームワークを使用しています)この情報を追加するのは、セキュリティに役立つ可能性のあるフレームワークの使用に関しては、多少制限があることを意味するからです。

私が現在行っていることは次のとおりです。

クライアントのパスワードは、アプリの内部ファイルにプレーンテキストで保存されています。これは、リクエストごとにユーザー名とパスワードを送信する必要があるためです-> RESTful。 HTTP認証ヘッダーを介して、username:password Base64エンコードとして送信されます。送信はHTTPS経由で行われます。サーバーはユーザー名とパスワードをデコードし、パスワードからハッシュを計算します。パスワードは、データベース内のそのユーザーのハッシュと照合されます。 herehere からハッシュアルゴリズムとコードを取得しました。

私の仮定:

  • クライアント自体が危険にさらされていないと想定すれば、これは安全なはずです。
  • 誰かがサーバーのデータベースにアクセスした場合でも、パスワードはハッシュ化されているため、ユーザーは安全です。
  • 送信自体はHTTPSで保護されているため、パスワードをプレーンテキスト(Base64)でサーバーに送信できます。

私は余暇にこのプロジェクトに取り組んでいます。つまり、セキュリティだけにあまり時間をかけたくないのです。それは単なるゲームなので、アカウントの乗っ取りはそれほど重要ではありません。ただし、堅牢な認証メカニズムが必要です。

私の質問:

  • 私の仮定は正しいですか?
  • 現在のアプローチを妥協することはどのように可能ですか?
  • セキュリティをさらに向上させるにはどうすればよいですか?
3
noone

これを攻撃する1つの方法は、リプレイ攻撃です。メッセージを手に入れると、メッセージを再送信できます。サーバーは、認証されたユーザーであると判断し、アクセスを許可します。

これは、サーバーがチャレンジ(例:ワンタイムトークン)を送信することで解決できます。チャレンジは、ユーザー名とパスワードとともに何らかの方法で含める必要があります。重要なのは、このチャレンジ/トークンは、悪意のある人が推測できないようにランダムにする必要があるということです。さらに簡単な解決策は、タイムスタンプを追加し、応答に含まれるタイムスタンプが含まれる必要がある間隔を設けることです。

2
Anders Nordin