Лучший вариант для хранения имени пользователя и пароля в приложении для Android - PullRequest
33 голосов
/ 10 февраля 2012

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

Ответы [ 6 ]

28 голосов
/ 10 февраля 2012

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

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

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

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

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

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

24 голосов
/ 10 февраля 2012

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

С учетом сказанного, вот что я сделал:

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

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

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

Если вы действительно заботитесь о безопасности, не включайте опцию «держать меня в системе».

6 голосов
/ 10 февраля 2012

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

1 голос
/ 01 сентября 2016
 //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();
            }
1 голос
/ 18 августа 2012

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

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

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

0 голосов
/ 05 марта 2018

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

...