Подтвердить что ты не робот

Лучший способ сохранить имя пользователя и пароль в приложении для Android

Я занимаюсь разработкой приложения для Android, в котором пользователю необходимо выполнить вход для выполнения операций. Но в основном на устройствах с Android пользователи используют "Оставить меня в системе". В этом случае мне придется поддерживать значения имени пользователя и пароля. в моем приложении. Должен ли я использовать SharedPreferences, или базу данных SQLite, или есть что-то еще, что я могу использовать.
И как я могу сделать это безопасно?

4b9b3361

Ответ 1

Да, это сложно для Android. Вы не хотите хранить пароль открытого текста в настройках, потому что любой, у кого есть корневое устройство, будет в основном показывать свой пароль миру. С другой стороны, вы не можете использовать зашифрованный пароль, потому что вам нужно будет хранить ключ шифрования/дешифрования где-то на устройстве, снова подверженный корневой атаке.

Одно из решений, которое я использовал некоторое время назад, - это заставить сервер генерировать "билет", который он передает обратно на устройство, что хорошо в течение определенного периода времени. Этот билет используется устройством для всей коммуникации, используя SSL, поэтому люди не могут украсть ваш билет. Таким образом, пользователь один раз аутентифицирует свой пароль на сервере, сервер отправляет обратно истекающий билет, а пароль никогда не хранится нигде на устройстве.

Этот механизм использует несколько трехсторонних механизмов аутентификации, таких как OpenID, Facebook, даже API Google. Недостатком является то, что каждый раз, когда истекает срок действия билета, пользователь должен повторно войти в систему.

В конечном счете, это зависит от того, насколько безопасно вы хотите, чтобы ваше приложение было. Если это просто отличить пользователей, и никакая сверхсекретная информация не хранится, как банковские счета или типы крови, то, возможно, сохранение pwd в открытом тексте на устройстве просто отлично:)

Удачи, какой бы метод вы ни выбрали, лучше всего подходит для вашей конкретной ситуации!

Изменить: я должен отметить, что этот метод передает ответственность безопасности серверу - вы захотите использовать соленые хэши для сравнения паролей на сервере, идея, которую вы увидите в некоторых других комментариях по этому вопросу, Это предотвращает появление незашифрованного пароля в любом месте, кроме EditText View на устройстве, связь SSL с сервером и оперативную память сервера, в то время как он солит и хеширует пароль. Он никогда не хранится на диске, что является хорошей вещью (tm).

Ответ 2

Как говорили другие, нет надежного способа хранения пароля на Android, который полностью защищает данные. Хеширование/шифрование пароля - отличная идея, но все, что он сделает, это замедлить "взломщик".

Сказав это, это то, что я сделал:

1) Я использовал этот simplecryto.java класс, который берет семя и текст и шифрует его. 2) Я использовал SharedPreferences в приватном режиме, который защищает сохраненный файл в ненагруженных устройствах. 3) Семя, которое я использовал для simplecryto, представляет собой массив байтов, который немного сложнее найти декомпиляторами, чем String.

Моя заявка была недавно рассмотрена группой безопасности "белой шляпы", нанятой моей компанией. Они отметили эту проблему и указали, что я должен использовать OAUTH, но они также перечисляли ее как проблему с низким уровнем риска, что означает, что она не велика, но недостаточно для предотвращения выпуска.

Помните, что "взломщик" должен иметь физический доступ к устройству и корни его и заботиться достаточно, чтобы найти семя.

Если вы действительно заботитесь о безопасности, не используйте параметр "Запомнить меня".

Ответ 3

По крайней мере, сохраните его в SharedPreferences (частный режим) и не забывайте хешировать пароль. Хотя это не будет иметь особого значения для злоумышленника (или внедренного устройства), это что-то.

Ответ 4

Самый безопасный способ сделать это без угрозы безопасности - использовать общие настройки для хранения ТОЛЬКО имени пользователя для последнего пользователя для входа.

Кроме того, в вашей таблице пользователей введите столбец, который содержит числовые логические (1 или 0), чтобы указать, проверял ли человек человека флажок "помнить меня" или нет.

При запуске приложения получите имя пользователя с помощью функции getSharedPreferences() и используйте его для запроса вашей размещенной базы данных, чтобы увидеть, является ли столбец signedin равным 1 или 0, где 1 указывает, что человек установил флажок "запомнить меня".

Ответ 5

 //encode password
 pass_word_et = (EditText) v.findViewById(R.id.password_et);
 String pwd = pass_word_et.getText().toString();
                byte[] data = new byte[0];
                try {
                    data = pwd.getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                String base64 = Base64.encodeToString(data, Base64.DEFAULT);
                hbha_pref_helper.saveStringValue("pass_word", base64);

 //decode password
 String base64=hbha_pref_helper.getStringValue("pass_word");
            byte[] data = Base64.decode(base64, Base64.DEFAULT);
            String decrypt_pwd="";
            try {
                 decrypt_pwd = new String(data, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

Ответ 6

Использование NDK для шифрования и дешифрования наряду с определением там переменной String Key вместо сохранения ее в общих настройках или определения ее в строке xml поможет предотвратить кражу секретного ключа для большинства детишек сценария. Полученный зашифрованный текст будет затем сохранен в общих настройках. Эта ссылка может помочь с примером кода