实现登录用户会话的最佳方法是什么?因此,当我登录时,我希望能够打开用户详细信息并在那里查看信息...最好将密码和加密密码保存在共享首选项中(使用用户名和密码调用api以获得用户详细信息),或者保存模型中有关用户的数据-sqllite(Room),还有什么更好的方法吗?谢谢您的帮助!
答案 0 :(得分:1)
我不建议存储密码。有多种处理登录会话的方法。您必须关心不同的事情以确保其安全。例如,会话吊销和权限。
我建议您研究一些类似JWT的标准。使用JWT,您可以在令牌内部存储一些声明和用户数据。令牌本身的存储方式由您自己决定,请注意只有您的应用程序可以访问令牌。
答案 1 :(得分:0)
从不建议使用字符串密码。您可以使用下面提到的方法保存详细信息:
如果您想立即获得用户详细信息而不用点击API,则可以直接将详细信息保存到数据库中,并在需要时加载它。
与保存密码和/或使用共享首选项相比,DB将是存储数据的更好选择。通过这种方法,您无需保存密码,也可以在需要时获取用户详细信息。
答案 2 :(得分:0)
如果您登录:
切勿将密码另存为明文。您可以这样操作:
public static String CreateSalt() {
Random random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
return new String(salt);
}
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);
}
}
由于隐私权法,这是最好的方法。这样,您就不会从用户那里得到任何密码,因此可以授予应用程序的安全性!
如果您没有登录名,但是想要以任何方式保持您的应用标识,则可以这样操作:
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);
}
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保存在数据库中,并将一些信息与其关联。这样,您可以跳过应用程序的登录部分!