android 如何在SharedPreferences中验证会话ID?

t3psigkw  于 2022-12-09  发布在  Android
关注(0)|答案(2)|浏览(140)

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保存到用户模型是否安全?
我感谢任何帮助,我可以得到这个主题!

hsvhsicv

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文件或任何东西,因为它更容易处理和清理。

rxztt3cl

rxztt3cl2#

sharedPrefences就像一个存储库。所以用字符串类型来写我们的数据。你可以选择你的数据是私有的还是公共的。当你删除应用程序时,也会删除你的数据。* 也许你的帮助是这个链接:*

https://www.geeksforgeeks.org/shared-preferences-in-android-with-examples/

相关问题