登录用户-保持会话

时间:2020-01-14 12:55:37

标签: android

实现登录用户会话的最佳方法是什么?因此,当我登录时,我希望能够打开用户详细信息并在那里查看信息...最好将密码和加密密码保存在共享首选项中(使用用户名和密码调用api以获得用户详细信息),或者保存模型中有关用户的数据-sqllite(Room),还有什么更好的方法吗?谢谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我不建议存储密码。有多种处理登录会话的方法。您必须关心不同的事情以确保其安全。例如,会话吊销和权限。

我建议您研究一些类似JWT的标准。使用JWT,您可以在令牌内部存储一些声明和用户数据。令牌本身的存储方式由您自己决定,请注意只有您的应用程序可以访问令牌。

答案 1 :(得分:0)

从不建议使用字符串密码。您可以使用下面提到的方法保存详细信息:

  1. 在登录时为每个用户生成一个唯一的会话ID,并将其作为响应从服务器发送到应用程序。将此会话ID(唯一ID)保存在您的数据库/共享首选项中。
  2. 每当要获取用户详细信息时,请再次查询服务器,并发送唯一ID和请求。在服务器上验证会话ID(唯一ID)以获取有效请求,然后根据传递的ID返回详细信息
  3. 根据收到的响应呈现输出。

如果您想立即获得用户详细信息而不用点击API,则可以直接将详细信息保存到数据库中,并在需要时加载它。

与保存密码和/或使用共享首选项相比,DB将是存储数据的更好选择。通过这种方法,您无需保存密码,也可以在需要时获取用户详细信息。

答案 2 :(得分:0)

如果您登录:
切勿将密码另存为明文。您可以这样操作:

  1. 创建“密码盐”(将其保存在与用户相对应的数据库中)

public static String CreateSalt() {
    Random random = new SecureRandom();
    byte[] salt = new byte[16];
    random.nextBytes(salt);
    return new String(salt);
}
  1. 从用户输入中获取密码,添加盐并执行MD5之类的单向算法
    文本=密码+盐

public static String HashMD5(String text){
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");

        // digest() return array of byte
        byte[] messageDigest = md.digest(text.getBytes());

        // Convert byte array into signum representation
        BigInteger no = new BigInteger(1, messageDigest);

        // Convert message digest into hex value
        String hashtext = no.toString(16);
        while (hashtext.length() < 32) {
            hashtext = "0" + hashtext;
        }
        return hashtext;
    }
    // For specifying wrong message digest algorithms
    catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }
}
  1. 现在您可以将散列的密码保存在数据库中
  2. 下一次用户登录时,您可以从数据库(通过用户名)获取密码盐,将其添加到用户要登录的密码中并对其进行哈希处理。现在,您可以将其与数据库中的哈希密码进行比较

由于隐私权法,这是最好的方法。这样,您就不会从用户那里得到任何密码,因此可以授予应用程序的安全性!

如果您没有登录名,但是想要以任何方式保持您的应用标识,则可以这样操作:

  1. 创建一个UUID并将其保存在共享首选项中

private static String UUID_KEY = "UUID";
public static <T> boolean Save(String key, T value, Context context){
    init(context);
    if(value instanceof String){
        editor.putString(key, (String) value);
    }else if(value instanceof Double){
        editor.putLong(key, Double.doubleToRawLongBits((Double)value));
    }
    else if(value instanceof Integer){
        editor.putInt(key, (Integer) value);
    }
    else if(value instanceof Boolean){
        editor.putBoolean(key, (Boolean) value);
    }
    return editor.commit();
    //TODO add more types --> This should be a generic method in the future

}

 public static boolean NewUUID(Context context){
    String UUID = java.util.UUID.randomUUID().toString();
    return Save(UUID_KEY,UUID, context);
}
  1. 每次启动时获取UUID

public static <T> T Get(String key, Class _class, Context context){
    init(context);
    if(_class == Double.class){
        return (T)(new Double(Double.longBitsToDouble(sp.getLong(key, Double.doubleToLongBits(_defaultValueDouble)))));
    }
    else if(_class == Integer.class){
        return (T)(new Integer(sp.getInt(key,defaultInteger)));
    }else if(_class == String.class){
        return (T)(new String(sp.getString(key,defaultValue_string)));
    }else if(_class == Boolean.class){
        return (T)(new Boolean(sp.getBoolean(key,defaultBoolean)));
    }
    return null;
}
 public static String GetUUID(Context context){
    return Get(UUID_KEY, String.class, context);
}

您可以将UUID保存在数据库中,并将一些信息与其关联。这样,您可以跳过应用程序的登录部分!