2013-10-28 21 views
9

アンドロイドアプリを作成していますが、Google App Engine(ユーザーのGoogleアカウントを使用せずに)のユーザーを認証するための情報を見つけることができません。アンドロイドデバイスにユーザー名とパスワードを保存してから、App Appで使用するデータをGoogle App Engineに保存することをお勧めしますか?Androidのログイン資格情報を保存するのに最適な場所

答えて

35

。ルート権限を取得されたシステムでは

、許可のアプリケーションは、このようにルート所有の暗号化されたXMLファイルにCLEARTEXT FOR ROOT許可APPS BECOMEどこAndroidの店舗SharedPreferences、にアクセスし、内部ストレージ/システムパーティションにアクセスすることができます。そのため、侵害された電話機でそのようなデータを格納するアプリケーションが発生し、ユーザーが異なるサービスに対して同じ電子メール/パスワードを濫用する癖がある場合、攻撃ベクトルは、ユーザーが却下した警告にかかわらず、複数のサービスの認証情報を侵害するのは簡単です。彼の電話を訴えたり、アプリにそのような権限を与えたりするのは、の警告だけでは十分ではないからです。

代替案は、カスタムの可変シードとソルトアルゴリズムを使用して、資格情報の永続ストレージを手動で暗号化することです。 secure-preferences libは、AndroidのSharedPreferencesインターフェイスを実装し、マイナーな調整を行ってデフォルトのスプリアスのほとんどの機能を維持するという追加のメリット(サンプルを見てください)を備えています。

2016編集:私はちょうど私が2016年に戻って、この質問に来て、サンバーナーディーノの加害者の携帯電話にOSを変更するアップルFBI対ドラマに素敵な参照を追加する必要を感じました。したがって、ほとんどのAndroidのように、簡単にルート可能な電話があり、それはデフォルトでルートされている場合や、ルートにデータを消去する必要がない場合もあります。 FBIは、あなたの信任状を得ることができない場合、Googleや貴社から何かを要求する必要はありません。 secure-preferencesのようなものを使用することで、あなた自身のシステム(この場合はあなたのアプリ)のみがこれらの資格情報にアクセスできるようにすることによって、Appleが決めた責任と同じ種類の責任を置くことができます。彼らが望むのであれば、FBIに迷惑をかけることになりますが、基礎となるOSではなく、自分のユーザーに、それらの資格情報を直接制御できる唯一の権限であるという感覚を与えることは、私の製品ではなくてはなりません。

+6

私は 'SharedPreferences'が始めるのに適していると思います。アプリを公開する場合**それらを暗号化する必要があります**。 –

+1

パスワードを扱う際には、最も簡単に起きる場所は、最も障害が発生しやすい場所です。 Androidは、SharedPreferencesの暗号化や暗号化のオプションを提供していません。だから私は、始まるべき最善の場所は何らかの理由で最終版で終わるかもしれない場所ではないと言う。私も同様の問題があり、SecurePreferencesを使用して終了しました。https://github.com/scottyab/secure-preferences – leRobot

+0

私の場合、私たちはここにあるいくつかのタブレットにインストールされる内部エンタープライズアプリケーションを開発しています。資格情報を保存する必要があるため、基本的な実装から始めるのが適切です。それらを暗号化することは、次のバージョンのロードマップにあります。誰もここにデバイスを持って行き、他人のパスワードを見るためにそれらをルートする人はいないでしょう: –

-1

が...このためSharedPreferences、のような...

public class PrefUtils { 
    public static final String PREFS_LOGIN_USERNAME_KEY = "__USERNAME__" ; 
    public static final String PREFS_LOGIN_PASSWORD_KEY = "__PASSWORD__" ; 

    /** 
    * Called to save supplied value in shared preferences against given key. 
    * @param context Context of caller activity 
    * @param key Key of value to save against 
    * @param value Value to save 
    */ 
    public static void saveToPrefs(Context context, String key, String value) { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
     final SharedPreferences.Editor editor = prefs.edit(); 
     editor.putString(key,value); 
     editor.commit(); 
    } 

    /** 
    * Called to retrieve required value from shared preferences, identified by given key. 
    * Default value will be returned of no value found or error occurred. 
    * @param context Context of caller activity 
    * @param key Key to find value against 
    * @param defaultValue Value to return if no data found against given key 
    * @return Return the value found against given key, default if not found or any error occurs 
    */ 
    public static String getFromPrefs(Context context, String key, String defaultValue) { 
     SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); 
     try { 
      return sharedPrefs.getString(key, defaultValue); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return defaultValue; 
     } 
    } 
} 

は、単に私が今、そのより明確だと思う

// Saving user credentials on successful login case 
PrefUtils.saveToPrefs(YourActivity.this, PREFS_LOGIN_USERNAME_KEY, username); 
PrefUtils.saveToPrefs(YourActivity.this, PREFS_LOGIN_PASSWORD_KEY, password); 

// To retrieve values back 
String loggedInUserName = PrefUtils.getFromPrefs(YourActivity.this, PREFS_LOGIN_USERNAME_KEY); 
String loggedInUserPassword = PrefUtils.getFromPrefs(YourActivity.this, PREFS_LOGIN_PASSWORD_KEY); 

、などのこれらのメソッドを使用して考えてみましょう:)

+0

申し訳ありませんが、これで何をする必要がありますか?あなたは説明できますか? –

+1

はい、はるかに明確になりました。 –

+0

さて、これらの方法はどこでもう一度使うのですか? –

-1

することができます共有設定でユーザー資格情報を保存します。あなたはあなたの活動のどれでもこの嗜好値を使うことができます。保存された値はアプリケーション終了後も保持されます。 共有設定のサンプルコードはこちらです。コードを整理しておくために、アプリケーションのutilsクラスにプリファレンスコードを保存することをお勧めします。あなたは、Googleが発根習慣は、パワーと志望-電力の両方のユーザーが普及しているという単純な事実のために、彼らはあなたを教えてくれますどのように安全なにもかかわらず、SharedPreferencesを使うべきではありません

public static String KEY = "SESSION"; 
    public static void saveUserName(String userid, Context context) { 
     Editor editor = context 
       .getSharedPreferences(KEY, Activity.MODE_PRIVATE).edit(); 
     editor.putString("username", userid); 
     editor.commit(); 
    } 

public static String getUserName(Context context) { 
    SharedPreferences savedSession = context.getSharedPreferences(KEY, 
      Activity.MODE_PRIVATE); 
    return savedSession.getString("username", ""); 
} 
+0

@FranklySpeaking:データをローカルで優先的に保存する方法を教えています。また、あなたの資格情報を設定からGoogleのアプリケーションエンジンに保存することもできます。これをチェックしてくださいhttps://developers.google.com/appengine/docs/ –

関連する問題