在Android中存储用户登录凭据的最佳位置

时间:2013-10-28 07:58:12

标签: android google-app-engine

我正在创建一个Android应用程序,我无法(?)找到有关在Google App Engine上对应用程序用户进行身份验证的任何信息(不使用用户的Google帐户)。最好将用户名和密码存储在Android设备,然后将应用程序使用的数据存储在Google App Engine上?

3 个答案:

答案 0 :(得分:36)

你不应该使用SharedPreferences,尽管Google会告诉你他们是多么安全,因为权力和权力用户普遍存在生根习惯。

在有根的系统中,授权的应用程序将能够访问内部存储/系统分区,从而访问Android存储SharedPreferences的root拥有的加密XML文件,哪个成为明确的BLOTEXT根-AUTHORIZED APPS 。因此,如果受感染的手机碰巧有一个存储此类数据的应用程序,并且用户习惯滥用相同的电子邮件/密码来处理不同的服务,那么攻击向量很容易损害多个服务的凭据,尽管用户在解除警告时会发出任何警告。根据他的手机或给予应用程序这样的权限,因为,那些警告不够清晰

替代方案是使用自定义,可变种子,盐渍算法对凭证的持久存储进行手动加密。 secure-preferences lib是一个很好的选择,几乎可以透明地为您完成所有事情,还有实现Android的SharedPreferences接口的额外好处,保留默认spref的大多数功能并进行微调(查看其示例)。

2016编辑:我觉得我需要在2016年回到这个问题并添加一个很好的参考 Apple vs FBI电视剧以改变操作系统圣贝纳迪诺袭击者的电话。所以,想象一下你的手机很容易上传,就像大多数Android一样,甚至可能默认为root,也不需要将数据擦除到root。如果他们不想获得您的凭据,FBI不需要谷歌或贵公司提出任何要求。通过使用安全首选项等内容,您可以通过仅使自己的系统(在本例中为您的应用程序)能够访问这些凭据来承担Apple决定承担的相同类型的责任。如果他们愿意,你会被FBI烦恼,但让你的用户感觉你,而不是底层操作系统,是唯一直接控制这些凭据的权威,这是我宁愿在我的产品中使用的东西。

答案 1 :(得分:-1)

您可以将用户凭据保存在共享首选项中。您可以在任何活动中使用此首选项值。退出应用程序后,保存的值仍将保留。 共享首选项的示例代码在此处。建议在您的应用程序工具类中保留您的首选项代码,以保持代码的有序性。

  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", "");
}

答案 2 :(得分:-2)

为此考虑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);

我认为现在更清楚......:)