2016-03-31 18 views
3

これまでAndroid向けの小さなアプリやゲームを作成していましたが、ユーザー数の多いやや高性能なアプリケーションを作成しています。Androidでのユーザー認証 - セキュリティ実装

私の通常のやり方は、パスワードを持つすべてのユーザー用のテーブルを用意し、HTTP(S)コールを使用して簡単なログイン画面で認証することでした。

私も、このアプリのために改善したいいくつかあります:私はそれを何をする必要がありますユーザーのパスワードを、暗号化する場合

安全に送信

は?デバイス上で、送信される前に? (安全でないネットワークの場合は、WiFiホットスポットのように)またはそれをDBに書き込む前に、サーバー上でより良い?それとも、私はSQLの暗号化を使うべきですか?

自動ログイン

私は、ユーザーがログアウトするまでログインとどまることができるようにしたい - どのように私は最善のことをしますか?セキュリティだけでなく、ユーザーエクスペリエンスのためにも。

私の研究では、AccountManagerを使用すると、ユーザー名とパスワードを保存し、アプリの起動時に自動的に認証されることがわかります。それ以上のことはありますか、私がここで紛失しているセキュリティ上のリスクはありますか?

アクセス制御

ユーザーがログインせずにログイン画面以外のものにアクセスすることはできませんので、通常、私は、アプリによって行われたすべての呼び出しが有効であると期待される。しかし、どのように、私は最高の認証んそれが攻撃者ではないことを確認するユーザーの要求ですか?すべてのリクエストでusername/idを送るだけではないので、ログインごとに生成するセッショントークンのようなものが必要なのでしょうか?それとも良い方法がありますか?

私が考えることを忘れたことがありますか?

答えて

1

パスワードを暗号化せずにhttpsで転送することをお勧めします。他の方法は、アプリケーションにasymmetric encryptionを実装し、サーバから受け取る公開鍵でパスワードを暗号化することです。

サーバー側では、saltを使ったハッシングアルゴリズムを使用してパスワードをハッシュします。ハッシュと塩だけを保管してください。ユーザーがログインすると、同じ方法で着信パスワードをハッシュし、平等のハッシュをチェックできます。

自動ログインを行うには、承認されたユーザーからのすべての要求にトークンで署名する必要があります。ログインに成功した後にサーバーから受け取るトークン。このトークンは、Keystore、またはこのアプリケーションでのみアクセス可能な特別なストレージに格納できます。

添付は、すべての要求パラメータとトークンからチェックサムを使用して追加パラメータを要求するために署名することで実装できます。

さらに、あなたのアプリにふさわしくない不正なクローンアプリケーションについて考えて、サーバー側のAPIを呼び出すことをお勧めします。

+0

アドバイスをいただき、ありがとうございます。他の人がリクエストを行うのを止めるために何ができるのかよくわかりませんが、ログインできない場合はトークンを取得できず、何もできません。右? –

+0

はい、正確です。他の解決策は、署名されたAPKを生成し、キーストアからキーを使用してAPIへのリクエストに署名することです。許可されていないすべてのリクエストを削除することができます。 –

+0

良いアイデア、ありがとう! –

関連する問題