此bounty已结束。回答此问题可获得+50声望奖励。奖励宽限期将在2小时后结束。dan希望吸引更多人关注此问题。
我正在学习更多关于SharedPreferences的知识,想了解一切到底是如何工作的。我已经看了相当数量的视频,但我仍然有一些问题。
1.在用户登录时,我使用UUID生成一个随机会话ID,然后为用户分配会话ID,并通过将UserModel传递到处理SharedPreferences的SessionManagement示例来保存会话。
userModel.setSessionId(UUID.randomUUID().toString());
SessionManagement sessionManagement = new SessionManagement(LoginActivity.this);
sessionManagement.saveSession(userModel);
1.当用户关闭/打开应用时,onStart()被调用,它创建另一个SessionManagement示例,并使用getSession()检查会话是否为空,以确定用户是否登录。
SessionManagement sessionManagement = new SessionManagement(LoginActivity.this);
if (sessionManagement.getSession() != null) {
// go to some activity
}
SessionManagement构造函数如下所示:
private SharedPreferences sharedPreferences;
private final SharedPreferences.Editor editor;
private MasterKey masterKey;
//private String SHARED_PREF_NAME = "session";
private final String SESSION_KEY = "session_user";
private final String SESSION_USERNAME = "session_username";
public SessionManagement(Context context) {
try {
masterKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
} catch (GeneralSecurityException | IOException e) {
e.printStackTrace();
}
try {
sharedPreferences = EncryptedSharedPreferences.create(
context,
"secret_shared_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
} catch (GeneralSecurityException | IOException e) {
e.printStackTrace();
}
//sharedPreferences = context.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
editor = sharedPreferences.edit();
}
我现在的问题是,如果我只是检查会话是否为null,那么SharedPreferences如何知道sessionID对应于在步骤1中初始化它的用户?
SharedPreferences实现可以防止人们以什么方式处理弱的/暴露的会话ID?
我的实施/流程是否正确?
将sessionID保存到用户模型是否安全?
我感谢任何帮助,我可以得到这个主题!
2条答案
按热度按时间hsvhsicv1#
我经常使用
SharedPreferences
,但还没有使用EncryptedSharedPreferences
。我认为这是唯一必要的,如果你有数据,值得保护在一个非常严格的方式(如密码或类似)。但然后你可能会想使用Google Identity或类似。如果你使用私有的
SharedPreferences
,通过调用context.getSharedPreferences(.., Context.MODE_PRIVATE)
,操作系统已经确保你的数据只能从你的应用程序访问。除非系统有漏洞或设备被黑客攻击,否则其他任何人都无法访问你的数据。现在回答您的问题,您使用会话ID做什么?
对我来说,这看起来像是你试图在Android应用程序中实现一个Web应用程序。如果是这种情况,因为你习惯于构建Web应用程序,并且没有更具体的原因,那么就忘记会话处理,并在只有一个用户的情况下实现应用程序。如果你想这样做,因为你正在与一个Web服务或类似的服务进行通信,那么就让那个服务来做会话处理。如果可能的话。如果你真的需要那个会话,那么你问题的答案是:在您的示例中,系统不知道您调用的
SharedPrefrences
对于当前会话是否有效。值总是相同的,与当前登录的用户无关。您可以做什么,为您的SharedPreferences
选择一个与登录用户相对应的名称(例如用户名/邮件地址的哈希值或类似值)。因此,您总是根据某个用户标识加载SharedPreferences
,如下所示:context.getSharedPreferences(username.hashCode(), Context.MODE_PRIVATE)
如果这样做,有两点需要考虑:
1.如果用户登录过一次,就会生成一个
SharedPreferences
文件,并且再也不会登录,那么您可能会生成垃圾数据。因此,保存用户的最后一次活动并不时进行清理可能是合适的。1.如果你有很多用户登录,你可能要考虑一个database或其他一些存储类型,如json文件或任何东西,因为它更容易处理和清理。
rxztt3cl2#
sharedPrefences就像一个存储库。所以用字符串类型来写我们的数据。你可以选择你的数据是私有的还是公共的。当你删除应用程序时,也会删除你的数据。* 也许你的帮助是这个链接:*