2015-07-30 3 views
-1

как я могу хранить учетные данные пользователя в своем приложении, которое я создаю для себя? Я не настраиваю никаких серверов, я просто устанавливаю приложение прямо на свой телефон через USB. то, что я пытаюсь сделать, - это ввести имя пользователя/пароль для связи с учетной записью, в основном так же, как и большинство других приложений. Единственное различие заключается в том, что я не настраиваю серверы с тех пор, как я новичок, и не знал бы, как это сделать. поэтому, имея в виду, я могу уйти с хранением в базе данных и вытащить информацию оттуда или, как я уверен, есть ли более простой способ сделать это, предоставленный android?сохранение учетных данных в android

примечание: я очень новичок и устал от изучения книг, поэтому я просто расширяю свои знания, поскольку мне нужно, чтобы это приложение было создано. Я в основном ищут самую легкую технику для этого и в конечном итоге расширю ее позже. спасибо, ребята, я очень ценю любую помощь!

+0

вы можете использовать хранимые процедуры для этого. – Lal

+0

вы можете использовать http://parse.com, поскольку это база данных для хранения данных на сервере. Просто проверьте. –

+0

была статья об андродите androiddev, обсуждая ваши варианты для такой вещи. вы можете найти его здесь (https://rammic.github.io/2015/07/28/hiding-secrets-in-android-apps/). надеюсь, это поможет. – Adeeb

ответ

0

Это может быть сделано с помощью SharedPreferences ..

SharedPreferences wmbPreference1,wmbPreference2;  
SharedPreferences.Editor editor; 

//wmbPreference for Shared Prefs that lasts forever 
wmbPreference1 = PreferenceManager.getDefaultSharedPreferences(this); 

//save_item for Shared Prefs that lasts only just once each time program is running. It is just a name given. 
wmbPreference2 =getApplicationContext().getSharedPreferences("save_item",Activity.MODE_PRIVATE); 

Для сохранения значений

SharedPreferences.Editor editor = wmbPreference1.edit(); 
editor.putString("MYKEY", "12345"); 
editor.commit(); 

Вы можете получить значения как

String Phonenumber = wmbPreference1.getString("MYKEY", ""); 

где MYKEY является ИМЯКЛАВИШИ по которые вы можете определить значение.

Подробнее об этом в документации here или here

UPDATE

Как @adelphus упомянутые в своем комментарии, всегда рекомендуется шифровать пароли перед сохранением.

+2

Несмотря на то, что OP признает себя новичком, не демонстрируйте сохранение сырых паролей в SharedPreferences (или где-нибудь еще, если на то пошло) - сначала соль + хэш, это всего лишь несколько строк кода. – adelphus

+0

Спасибо за указание .. @ adelphus .. упоминается как обновление в ответе. – Lal

+0

@adelphus вы можете указать мне в направлении изучения того, как «солить + хэш»? – Bryan

0

В моем случае я храню имя пользователя и пароль в sharedprefrences, но не обычный и необеспеченный. в дополнении к @Lal ответа я рекомендую вам использовать secureSharedPrefrences с этой большой работой и безопасным методом из scottyab, нормален для начала добавить это зависимостями к вашему Gradle:

com.scottyab:secure-preferences-lib:0.1.1 

для получения дополнительной информации из этой библиотеки:

Это оболочка предпочтений Android Shared, которая шифрует значения общих настроек с использованием дополнений AES 128, CBC и PKCS5 с проверкой целостности в виде хэша SHA 256. Каждый ключ хранится как односторонний хэш SHA 256. Оба ключа и значения кодируются base64 перед сохранением в файл xfs prefs. По умолчанию сгенерированный ключ сохраняется в файле настроек резервного копирования и поэтому может быть прочитан и извлечен пользователем root.

поэтому после добавления зависимости к Gradle, создать класс с этим фрагментом:

public class App extends Application { 
protected static App instance; 
private SecurePreferences secureAppData; 

public App(){ 
    super(); 
    instance = this; 
} 
public static App get() { 
    return instance; 
} 

public SharedPreferences getSharedPreferences() { 
    if(secureAppData==null){ 
     secureAppData = new SecurePreferences(this, null, "my_prefs.xml"); 
     SecurePreferences.setLoggingEnabled(true); 
    } 
    return secureAppData; 
} 

}

в любом использовании деятельности сниппет для магазина ключа

SharedPreferences secureAppData = App.get().getSharedPreferences(); 
     secureAppData.edit().putString("key",myKey) 
       .commit(); 

и извлечение использовать это

secureAppData.getString("key",null) 

для тех, кто спрашивает о классе и теории приложений для этого: Иногда вы хотите хранить данные, такие как глобальные переменные, к которым необходимо получить доступ из нескольких видов деятельности - иногда везде в приложении. В этом случае объект Application поможет вам.

Возможно, это поможет кому-то.

0

В ответ на my comment (и потому, что я не смог найти простой пример в любом другом вопросе SO), это немного прокомментированный код для хэша, хранения и проверки учетных данных. Если вы хотите понять salting и password hashing, у Википедии есть хорошая информация.

Экономия:

void saveCredentials(String username, String password) { 
/* create some random salt bytes - the value doesn't need to be secret (which is 
    why we can save it) but it must be unpredictable and unique per-user */ 
SecureRandom sr = new SecureRandom(); 
byte[] salt = new byte[16]; 
sr.nextBytes(salt); 

    // hash the (salt + password) 
    // hashing algorithms vary, but for now, SHA256 is a reasonable choice 
    try { 
    MessageDigest hasher = MessageDigest.getInstance("SHA-256"); 
    hasher.update(salt); 
    hasher.update(password.getBytes("UTF-8")); 
    byte[] hashedbytes = hasher.digest(); 

    // we can now save the salt and the hashed bytes to a file, 
    // SharedPreference or any other storage location 
    savedata(username, salt, hashedbytes); 

    } catch (Exception e) { 
    // do something sensible on errors 
    } 

} 

Проверка:

boolean checkPassword(String username, String password) { 
    // read the info for the user that we saved in storage 
    byte[] salt = readdata(username, "salt"); 
    byte[] correcthash = readdata(username, "pwdhash"); 

    // hash the password we are checking in the same way that we did 
    // for the original password 
    try { 
    MessageDigest hasher = MessageDigest.getInstance("SHA-256"); 
    hasher.update(salt); 
    hasher.update(password.getBytes("UTF-8")); 
    byte[] testhash = hasher.digest(); 

    // if the password is correct, the two hashed values will match 
    // - if it's wrong, the hashed values will have one or more 
    // bytes that do not match 
    for (int i=0; i < testhash.length; i++) { 
     if (testhash[i] != correcthash[i]) 
      return false; // mismatch - wrong password 
    } 

    // if we reach here, all the hash bytes match, so the password 
    // matches the original 
    return true; 

    } catch (Exception e) { 
    // do something sensible on errors 
    } 

    return false; 
} 
Смежные вопросы