Как хранится пароль Gmail на Android и где?

Я осмотрелся и не нашел информации о том, как Android может хранить пароли на устройстве. Особенно пароли Gmail. Я хочу узнать, как Android шифрует и хранит пароли? Какой ключ он использует и где этот ключ хранится, и какой алгоритм шифрования он использует.

Почему сохраненный пароль должен быть зашифрован ключом? Это означало бы только то, что нужно вводить ключ каждый раз, когда требуется пароль, тогда вы могли бы просто не хранить пароль и вводить его каждый раз.
Гм, ключ может быть специфичным для устройства, полученным из IMEI телефона или что-то в этом роде. Это означает, что программное обеспечение может получить ключ, не заставляя пользователя вводить его каждый раз.
Что мешает любой другой программной части, работающей на телефоне, получить ключ? Этот подход не добавляет дополнительного уровня безопасности

Ответы (2)

Официальное приложение Gmail не хранит пароль на вашем устройстве. Ваш пароль на 100% безопасен, если вы используете это приложение.

Вот как это работает: пароль используется серверами аутентификации Google ТОЛЬКО в первый раз. После первой успешной аутентификации на Auth Tokenустройство загружается файл, который сохраняется в accounts.dbфайле в виде обычного текста. Для всех последующих входов используется именно этот Auth Token, а НЕ ваш первоначальный пароль.
Итак, если ваше устройство украдено, все, что кто-либо может получить, это то, Auth Tokenчто оно становится недействительным после смены пароля. Таким образом, вы будете в окончательном командовании.
Для максимальной безопасности я рекомендую вам включить 2-Factor Authenticationи создать Device Specific Passwordдля вашего устройства. После потери устройства все, что вам нужно, это отключить это устройство. Вам даже не нужно менять основной пароль.

Примечание. Все это неверно, если вы используете сторонние почтовые приложения для Gmail, а именно. Стандартное приложение электронной почты, K-9 Mail и т. д. Протоколу IMAP или POP требуется оригинальный пароль для аутентификации пользователей каждый раз. Таким образом, простой пароль должен быть доступен для приложения электронной почты перед его отправкой на сервер. Таким образом, большинство почтовых приложений хранят пароли в виде простого текста (хеширование/шифрование бесполезно, поскольку ключ хеширования/шифрования необходимо хранить локально). В этом случае я бы порекомендовал вам включить 2-Factor Authenticationи создать Device Specific Passwordдля вашего устройства. После потери устройства все, что вам нужно, это отключить это устройство.

Обновление:
технически возможно хранить пароли локально в зашифрованном/хешированном виде без локального хранения ключа шифрования/ключа хеширования в виде простого текста. Спасибо @JFSebastian за указание на это. К сожалению, такой реализации для Android пока нет. Начиная с ICS, Android предоставляет API KeyChain, с помощью которого приложение может хранить пароль локально в защищенной форме. Приложения, использующие KeyChain API, встречаются редко, но стандартное почтовое приложение использует его (спасибо @wawa за эту информацию). Таким образом, ваш пароль будет в безопасности со стандартным почтовым приложением, пока ваш экран заблокирован. Помните, что KeyChain небезопасен, если устройство имеет root-права и недоступно на устройствах до ICS.

Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .

Пароли Android, используемые со встроенным приложением электронной почты, хранятся в виде обычного текста в базе данных SQLite. Это отличается от приложения Gmail , которое использует токены аутентификации, как описано в ответе Сачина Сехара .

Для Jelly Bean расположение базы данных:

/data/system/users/0/accounts.db

Указанное выше расположение зависит от версии Android.

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

Член команды разработчиков Android опубликовал объяснение , которое актуально и по сей день:

Теперь, что касается этой конкретной заботы. Первое, что нужно уточнить, это то, что приложение электронной почты поддерживает четыре протокола — POP3, IMAP, SMTP и Exchange ActiveSync — и, за очень немногими, очень ограниченными исключениями, все это старые протоколы, которые требуют, чтобы клиент предоставил пароль серверу. при каждом соединении. Эти протоколы требуют, чтобы мы сохраняли пароль до тех пор, пока вы хотите использовать учетную запись на устройстве. Более новые протоколы этого не делают — вот почему, например, некоторые статьи контрастируют с Gmail. Более новые протоколы позволяют клиенту использовать пароль один раз для создания маркера, сохранения маркера и сброса пароля.

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

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

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

Ух ты. Это меня поражает. Я не знал о том, что он хранится в виде простого текста. Забудьте, укоренен или не укоренен. Если ваше устройство будет украдено, недобросовестный человек может легко получить ваши учетные данные, даже если вы заблокируете телефон с помощью ключа безопасности. Учитывая этот факт, знаете ли вы также о каких-либо механизмах шифрования на уровне диска.
Ну, я только что узнал, что пароли НЕ в виде простого текста. В account.db были имена пользователей различных учетных записей в сочетании с некоторыми странными строками. Я подозревал простую кодировку base64, но это было не так. Таким образом, он должен использовать какой-то механизм токена доступа, как указано @SachinShekhar. Но я все же хотел бы подтвердить, не являются ли эти «строки» какой-то формой зашифрованного пароля.
Какими бы они ни были, их можно использовать для получения доступа к учетной записи. Но, @SachinShekhar, accounts.dbфайл защищен от чтения другими учетными записями, кроме system.
Зуул, я ценю твои усилия, которые ты приложил к ответам, но я думаю, что этот ответ вводит в заблуждение. Если вы снова прочитаете цитату, которую вы процитировали, приложение Gmail не сохранит пароль. --edit проверьте также ответ @SachinShekhar.
@asudhak Если какое-либо приложение использует исходный пароль, его невозможно защитить. Хакер может декодировать закодированную строку из account.db после нахождения ключа шифрования/хеширования, который необходимо хранить локально, поскольку почтовому приложению потребуется этот ключ для компиляции исходного пароля перед его отправкой на сервер.
@roxan Я не смог найти ничего, что указывало бы на то, что пароль не хранится в приложении Gmail. Можно цитату или ссылку?
Я сделал этот ответ вики-сообществом, чтобы каждый мог улучшить его содержимое. Так как мнения расходятся, таким образом каждый может внести свой вклад.
Мой телефон — ASUS Zenfone 2, работающий под управлением Android 5.0, и расположение файла «базы данных» /data/system/sync/accounts.xml(да, это XML), как сказано в этой статье .