2015-01-25 3 views
6

Задача состоит в том, чтобы сохранить введенный пароль (PasswordStr) или mKey.getEncoded байт [], а затем автоматически отправлять в Crypto API (Cipher)Как безопасно хранить пароли на Android?

SecretKey mKey = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(new PBEKeySpec(PasswordStr.toCharArray()); 

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

Может быть, у Android уже есть механизм для хранения паролей?

р.с использование удаленный сервер невозможно. Необходимо хранить локально.

+1

Каков ваш прецедент? Зачем вам нужно хранить пароль или ключ? В настоящее время неясно, хотите ли вы сохранить пароль или ключ. Учитывая выбор, сохраните сгенерированный * ключ * (и общественную соль, конечно). Вы не хотите терять пароль пользователя другим сторонам! –

+0

Было бы идеально хранить строковый пароль. Но, учитывая уязвимость кода Java, в принципе это не имеет значения. Я хочу, чтобы мои пользователи были защищены своими данными. Соль, итерация и т. Д. Можно увидеть после декомпиляции. – Mixer

+0

Теперь это даже не имеет смысла. Соль не должна быть в коде, соль должна быть случайной, а не [такой случайный] (http://xkcd.com/221/). Соль и количество итераций могут быть общедоступными. –

ответ

0

вы можете использовать SQLCipher для android. Это расширение SQLite, которое обеспечивает прозрачное 256-битное шифрование AES файлов базы данных

+0

Без каких-либо подробностей безопасности этот ответ не так силен, как мог бы быть. AES-256 фактически ничего не говорит о уровне предоставляемой безопасности. –

2

Check Handling Credentials section on the android developers guide. Я приведу его здесь.

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

Доступ к услугам, доступным для нескольких приложений, должен осуществляться с использованием AccountManager. Если возможно, используйте класс AccountManager для вызова облачной службы и не храните пароли на устройстве.

После использования AccountManager для извлечения Account, CREATOR перед передачей в любых учетных данных, так что вы случайно не передавать учетные данные в неправильном применении.

Если учетные данные должны использоваться только создаваемыми приложениями, вы можете проверить приложение, которое обращается к AccountManager с помощью checkSignature(). В качестве альтернативы, если только одно приложение будет использовать учетные данные, вы можете использовать KeyStore для хранения.

+0

Это все правильно, но иногда существуют допустимые варианты использования паролей (то есть для сторонних служб), и этот ответ не затрагивает их. –

3

Вы можете использовать Android Keystore API.

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

Nelenkov gives a good overview:

хранилище учетных данных Андроида реализован как родной Linux службы (демон), с несколькими дополнительными слоями на верхней части его, которые делают его доступным к каркасу.Давайте быстро рассмотрим, что мы знаем о хранилище ключей демона (более подробно описано здесь):

  • это родной демон запускаться при загрузке
  • обеспечивает локальный сокет управления, чтобы приложения и системные службы говорить к нему
  • он шифрует ключи, используя битовый мастер AES 128
  • ключа шифруются ключи хранятся в файле/данных/разностороннего/хранилище ключей, один файл на один ключ
  • мастера-ключ является производным от устройства разблокировки пароля или PIN его
  • разрешает управление выполнением команд и ключи доступа на основе вызывающего абонента UID

Android Documentation Смотрите для более подробной информации.

+2

Я ниспровергаю это, поскольку я не думаю, что это решит вопрос. Вопрос состоял в том, чтобы безопасно хранить пароль, а не секретный ключ. Использование платформы keystore * - это хорошая идея в целом, но ее необходимо дополнить примером того, как хранить пароли с ней. –

+0

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

+0

Ну, я думал это просили, но теперь я смущаюсь. Отменено вниз, попросил орг. плакат для пояснения в комментариях. –

Смежные вопросы