我正在学习更多关于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();
    }

我现在的问题是,如果我只是判断会话是否为空,SharedPreferences如何知道会话ID对应于在步骤1中初始化它的用户?

人们有哪些方法来解决SharedPreferences实现可以防止的弱/expose 的会话ID?

我的实施/流程是否正确?

将会话ID保存到用户模型是否安全?

我很感激在这个话题上能得到的任何帮助!

推荐答案

看起来您的实现正在使用UUID和SharedPreferences的组合来管理用户的会话.当用户登录时,您将生成一个随机的UUID并将其另存为会话ID,然后将其与该用户相关联.当用户关闭并重新打开应用程序时,您判断SharedPreferences以查看会话ID是否仍然存在,如果仍然存在,则假定用户仍在登录.

要回答您的特定问题,请执行以下操作:

SharedPreferences没有任何内置的方法来知道会话ID属于哪个用户.它只存储键-值对,管理会话ID和它所属的用户之间的关系由您决定.

有几种方法可以防止弱会话ID或expose 的会话ID.一种常见的方法是组合使用UUID和令牌,其中UUID用于标识会话,令牌用于对用户进行身份验证.这样,即使攻击者以某种方式获得了会话ID,他们也无法模拟用户,除非他们还拥有用户的令牌.

您的实现似乎是正确的,但判断和测试您的代码以确保其按预期工作总是一个好主意.

只要采取措施保护用户数据,将会话ID保存到用户模型通常是安全的.例如,您可以在将用户的数据保存到SharedPreferences之前对其进行加密,也可以使用安全的数据库而不是SharedPreferences来存储用户的数据.

总体而言,仔细考虑会话管理实现的安全影响并采取措施防范潜在攻击是很重要的.我希望这能帮到你!

Java相关问答推荐

如何使用Java API在Oracle ODI中运行模拟?

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

将成为一个比较者.比较…在现代Java中,编译器会对`CompareTo`方法进行优化吗?

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

在AVL树的Remove方法中使用NoSuchElementException时遇到问题

Java:使用Class.cast()将对象转换为原始数组

如何使用值中包含与号的查询参数创建一个java.net.URI

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

为什么同步数据块无效?

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

如果List是一个抽象接口,那么Collectors.toList()如何处理流呢?

从12小时开始的日期模式

OAuth:登录后无法查看Google邮箱地址

TinyDB问题,无法解析符号';上下文&

字符串的Gzip压缩在java11和java17中给出了不同的结果

如何设置默认序列生成器分配大小

始终使用Spring Boot连接mongodb上的测试数据库

java.exe如何执行java源代码?

UuidGenerator Bean 类型不匹配?

JavaFX AnchorPane zoom