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

37

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

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

Ответы:

36

Официальное приложение 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 Quesito
источник
6
@JF Себастьян: даже если предположить, что вы полностью доверяете третьей стороне, которая хранит ваши пароли, они были лишь немного более безопасными, чем простое хранение пароля на самом устройстве. Устройство все еще должно иметь возможность извлекать простой текст пароля из облачного хранилища, и устройству все еще приходится кэшировать пароль локально, потому что вам не нужно повторно подключать ключ каждый раз, когда вы попадаете в туннель или области с слабый прием. Худшее, что нужно сделать в безопасности, - это создать ложное чувство безопасности.
Ложь Райан
4
@JFSebastian: в заключение, единственный действительно безопасный способ аутентификации - это делать то, что Google делал с приложением Gmail, то есть использовать нестандартную схему аутентификации с токеном аутентификации. Даже если кому-то удалось украсть ваш токен авторизации, вы можете удаленно аннулировать токен, и вам не нужно менять пароль, поскольку открытый текст пароля никогда не был взломан. Другой безопасный способ - использовать ключ без сессий; ну, вы знаете, что произойдет, когда вы это сделаете, ваши пользователи просто оставят ключ постоянно подключенным.
Ложь Райан
5
@JFSebastian: я думаю, что вы упускаете суть. Шифрование пароля не является более безопасным, чем его хранение в виде простого текста, даже одним битом. Любой злоумышленник, которому удается скопировать account.db, также может скопировать ключ дешифрования вместе с ним; единственное, что дает вам шифрование, - это ложное чувство безопасности , которое хуже, чем отсутствие безопасности. Да, есть решения, которые намного лучше, чем хранение простого текстового пароля, но все они требуют изменений в протоколе электронной почты, поэтому мы должны жить с тем, что имеем в настоящее время. Или сделайте это должным образом нестандартным способом, как Gmail.
Ложь Райану
3
@JFSebastian Служба связки ключей Apple или служба, предоставляемая ядром Linux, не является более безопасным вариантом. Пароль все еще хранится в памяти и, если брелок разблокирован, даже не зашифрован. Так что, скорее всего, получить его как корневой файл только для чтения .db будет немного сложнее. Google реализовал наилучшее из возможных решений, используя токен аутентификации, который может быть аннулирован в случае взлома устройства. Следующий более безопасный вариант - вводить пароль каждый раз или просто вообще избегать использования электронной почты.
Поток
4
@LieRyan Начиная с ICS, стандартное приложение электронной почты использует API KeyStore, а не простой текст. android-developers.blogspot.com/2012/03/…
Уэсли
12

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

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

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

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

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

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

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

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

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

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

Zuul
источник
Вау. Это поражает меня. Я не знал о том, что он хранится в виде простого текста. Забудьте укоренившиеся или не укоренившиеся. Если ваше устройство украдено, недобросовестный человек может легко получить ваши учетные данные, даже если вы заблокируете телефон с помощью ключа безопасности. Учитывая этот факт, вы также знаете о каких-либо дисковых механизмов шифрования.
Асудхак
1
Чем бы они ни были, они могут использоваться для получения доступа к учетной записи. Но, @SachinShekhar, то accounts.dbфайл будет защищен от чтения , кроме счетов system.
Вайзард
1
Зуул, я ценю твои усилия, которые ты вложил в ответы, но я думаю, что этот ответ очень вводит в заблуждение. Если вы снова прочитаете цитату, приложение Gmail не сохранит пароль. --edit check @SachinShekhar тоже отвечу.
roxan
2
@asudhak Если какое-либо приложение использует оригинальный пароль, НЕТ способа защитить его. Хакер может декодировать закодированную строку из accounts.db после нахождения ключа шифрования / хеширования, который необходимо сохранить локально, поскольку приложению электронной почты потребуется этот ключ для компиляции исходного пароля перед отправкой его на сервер.
Android Quesito
2
@ roxan Я не смог найти ничего, что указывало бы на то, что пароль не был сохранен приложением Gmail. Можете ли вы предоставить цитату или ссылку?
Поток