web-dev-qa-db-ja.com

ユーザー名とパスワードをAndroid appに保存する最適なオプション

私はユーザーが操作を実行するためにサインインする必要があるアプリを開発しています...しかし、ほとんどの場合Android handset ppl use "keep me signed in" ...そしてこの場合はアプリ内でユーザー名とパスワードの値を維持するために、設定を使用する必要がありますか、SQLite Dbを使用する必要がありますか?.

34
Saurabh Agrawal

はい、これはAndroidでは注意が必要です。基本設定にプレーンテキストのパスワードを保存したくないのは、ルート化されたデバイスを持っている人は誰でも基本的に自分のパスワードを世界中に表示するからです。逆に、暗号化されたパスワードを使用することはできません。これは、暗号化/復号化キーをデバイスのどこかに保存する必要があるため、ルート攻撃を受けやすいためです。

しばらく前に使用した解決策の1つは、サーバーに「チケット」を生成させ、それをデバイスに戻すことです。これは一定期間有効です。このチケットは、すべての通信でデバイスによって使用されます。もちろんSSLを使用するため、人々はチケットを盗むことができません。この方法では、ユーザーはサーバー上でパスワードを一度認証し、サーバーは期限切れのチケットを送り返し、パスワードはデバイス上のどこにも保存されません。

OpenID、Facebook、Google APIなどのいくつかの3本足認証メカニズムは、このメカニズムを使用します。欠点は、時々チケットが期限切れになると、ユーザーが再ログインする必要があることです。

最終的には、アプリケーションの安全性に依存します。これが単にユーザーを区別するためであり、銀行口座や血液型のような極秘情報が保存されていない場合、デバイス上の平文でpwdを保存するだけで十分です:)

幸運を祈ります。あなたが決めた方法はあなたの特定の状況に最適です!

編集:この手法はセキュリティの責任をサーバーに移すことに注意する必要があります-サーバーでのパスワード比較にソルトハッシュを使用することをお勧めします。これは、この質問の他のコメントで見られるアイデアです。これにより、デバイス上のEditTextビュー、サーバーへのSSL通信、およびサーバーのRAMがパスワードをソルトおよびハッシュしている間を除き、プレーンテキストパスワードがディスクに保存されることはありません。これはGood Thing(tm)です。

29
Mike

他の人が言ったように、データを完全に保護するAndroidにパスワードを保存する安全な方法はありません。パスワードのハッシュ/暗号化は素晴らしいアイデアですが、行うのは「クラッカーを遅くするだけです」 「。

とはいえ、これは私がやったことです:

1)これを使用しました simplecryto.Java class シードとテキストを取得して暗号化します。 2)プライベートモードでSharedPreferencesを使用して、ルート化されていないデバイスに保存されたファイルを保護しました。 3)simplecrytoに使用したシードは、文字列よりも逆コンパイラで見つけるのが少し難しいバイトの配列です。

私の申請は、最近会社に雇われた「ホワイトハット」セキュリティグループによってレビューされました。彼らはこの問題にフラグを立て、OAUTHを使用する必要があることを示しましたが、それは低リスクの問題としてもリストしました。

「クラッカー」はデバイスに物理的にアクセスし、ルート化し、シードを見つけるのに十分な注意を払う必要があることに注意してください。

セキュリティに本当に関心がある場合は、「ログイン状態を維持する」オプションを使用しないでください。

24
knaak

セキュリティを危険にさらすことなくこれを行う最も安全な方法は、共有設定を使用して、最後にログインした人のユーザー名のみを保存することです。

また、ユーザーの表に、ブール値(1または0)を保持する列を導入して、その人が「私を記憶する」チェックボックスをチェックしたかどうかを表します。

アプリを起動するときに、getSharedPreferences()関数を使用してユーザー名を取得し、それを使用してホストされたデータベースをクエリし、signedin列が1または0のいずれかを確認します。

1
Gideon Kyalo
 //encode password
 pass_Word_et = (EditText) v.findViewById(R.id.password_et);
 String pwd = pass_Word_et.getText().toString();
                byte[] data = new byte[0];
                try {
                    data = pwd.getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                String base64 = Base64.encodeToString(data, Base64.DEFAULT);
                hbha_pref_helper.saveStringValue("pass_Word", base64);

 //decode password
 String base64=hbha_pref_helper.getStringValue("pass_Word");
            byte[] data = Base64.decode(base64, Base64.DEFAULT);
            String decrypt_pwd="";
            try {
                 decrypt_pwd = new String(data, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
1
Mani Kandan

暗号化と復号化にNDKを使用し、共有設定に保存する代わりに文字列キー変数を定義するか、文字列xmlに定義することで、ほとんどのスクリプトキディに対する秘密キーの盗難を防ぐことができます。結果の暗号化テキストは、共有設定に保存されます。 このリンクはサンプルコードについて役立つ場合があります

1
Irfan Ul Haq