Como a senha do Gmail é armazenada no Android - e onde?

37

Eu olhei em volta e não encontrei informações sobre como o Android consegue armazenar senhas no dispositivo. Especialmente senhas do Gmail. Estou procurando aprender como o Android criptografa e armazena senhas? Qual chave ele usa e onde está armazenada, e qual algoritmo de criptografia usa.

asudhak
fonte
11
Por que a senha armazenada deve ser criptografada com uma chave? Isso significa apenas que é preciso digitar a chave toda vez que a senha é necessária, então você simplesmente não pode armazenar a senha e inseri-la todas as vezes.
Flow
Hum, a chave pode ser específica do dispositivo, obtida do IMEI do telefone ou algo assim. O que significa que o software pode obter a chave sem que o usuário digite sempre.
asudhak 12/09/12
11
O que impede que qualquer outro software em execução no telefone obtenha a chave? Esta abordagem não adiciona nenhuma camada extra de segurança
Fluxo

Respostas:

36

O aplicativo oficial do Gmail não armazena senha no seu dispositivo. Sua senha é 100% segura se você usar este aplicativo.

É assim que funciona: a senha é usada apenas pelos servidores de autenticação do Google pela primeira vez. Após a primeira autenticação bem-sucedida, um Auth Tokené baixado para o dispositivo armazenado no accounts.dbarquivo como texto sem formatação. Para todos os logins subsequentes, isso Auth Tokené usado, NÃO sua senha original.
Portanto, se o seu dispositivo for roubado, tudo o que alguém puder obter é o Auth Tokenque se torna inválido depois que você altera sua senha. Então, você estará no comando final.
Para segurança máxima, recomendo que você ative 2-Factor Authenticatione crie Device Specific Passwordpara o seu dispositivo. Depois de perder o dispositivo, tudo o que você precisa é desativar esse dispositivo. Você nem precisa alterar a senha principal.

Nota: tudo isso não é verdade se você usar aplicativos de email de terceiros para o Gmail viz. O aplicativo Stock Email, K-9 Mail etc. O protocolo IMAP ou POP precisa de uma senha original para autenticar os usuários sempre. Portanto, a senha simples precisa estar disponível no aplicativo de e-mail antes de enviá-lo ao servidor. Portanto, a maioria dos aplicativos de email armazena senhas em texto simples (hash / criptografia é inútil porque a chave de hash / criptografia precisa ser armazenada localmente). Nesse caso, recomendo que você ative 2-Factor Authenticatione crie Device Specific Passwordpara o seu dispositivo. Depois de perder o dispositivo, tudo o que você precisa é desativar esse dispositivo.

Atualização:
tecnicamente, é possível armazenar senhas localmente em formato criptografado / hash sem manter a chave de criptografia / chave hash em texto sem formatação localmente. Obrigado a @JFSebastian por apontar isso. Infelizmente, essa implementação para Android ainda não está disponível. Iniciando o ICS, o Android fornece a API KeyChain usando a qual um aplicativo pode armazenar uma senha localmente de forma segura. Os aplicativos que usam a API KeyChain são raros, mas o aplicativo de email padrão usa-o (obrigado a @wawa por esta informação). Portanto, sua senha estará segura com o aplicativo de e-mail padrão, desde que sua tela esteja bloqueada. Lembre-se, o KeyChain não é seguro se o dispositivo estiver enraizado e não estiver disponível em dispositivos pré-ICS.

Android Quesito
fonte
6
@JF Sebastian: mesmo assumindo que você confia completamente no terceiro que armazena suas senhas, elas eram apenas um pouco mais seguras do que simplesmente armazenar a senha no próprio dispositivo. O dispositivo ainda precisa recuperar o texto sem formatação da senha do armazenamento na nuvem e ainda precisa armazená-la localmente em cache, porque você não deseja reconectar seu dongle toda vez que entrar em um túnel ou áreas com recepção fraca. A pior coisa a fazer em segurança é fornecer uma falsa sensação de segurança.
Lie Ryan
4
@JFSebastian: em conclusão, a única maneira verdadeiramente segura de autenticação é fazer o que o Google fez com o aplicativo Gmail, ou seja, usar um esquema de autenticação não padrão com token de autenticação. Mesmo que alguém tenha roubado seu token de autenticação, você pode invalidar remotamente o token e não precisará alterar sua senha porque o texto sem formatação da senha nunca foi comprometido. A outra maneira segura é usar o dongle sem sessões; bem, você sabe o que acontece quando você faz isso, seus usuários apenas deixam o dongle permanentemente conectado.
Lie Ryan
5
@JFSebastian: Acho que você está perdendo o objetivo. Criptografar a senha não é mais seguro do que apenas armazená-la em texto sem formatação, nem um pouco. Qualquer invasor que consiga copiar o accounts.db também pode copiar a chave de descriptografia junto; a única coisa que a criptografia oferece é uma falsa sensação de segurança , que é pior do que nenhuma segurança. Sim, existem soluções muito melhores do que o armazenamento de senha em texto sem formatação, mas todas elas exigem alterações no protocolo de email, portanto, convivemos com o que temos atualmente. Ou faça-o corretamente de maneira não padrão, como o Gmail.
Lie Ryan
3
O serviço de chaves do @JFSebastian Apples ou o fornecido pelo kernel do Linux não é uma opção mais segura. A senha ainda permanece na memória e, se o chaveiro estiver desbloqueado, mesmo não criptografado. Portanto, é provável que seja apenas um pouco mais difícil de obter como o arquivo .db legível pela raiz. O Google implementou a melhor solução possível, usando um token de autenticação que pode ser invalidado caso o dispositivo seja comprometido. A próxima opção mais segura seria inserir a senha todas as vezes ou simplesmente evitar o uso de e-mail.
Flow
4
@LieRyan No ICS, o aplicativo de email de estoque realmente usa a API do KeyStore, não texto simples. android-developers.blogspot.com/2012/03/…
Wesley Wiser
12

As senhas do Android usadas com o aplicativo de email incorporado são armazenadas em texto sem formatação dentro de um banco de dados SQLite. Isso contrasta com o aplicativo Gmail , que usa tokens de autenticação, conforme descrito na resposta de Sachin Sekhar .

Para o Jelly Bean, o local do banco de dados é:

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

A localização acima varia com a versão do Android

Esse local em um dispositivo não raiz é protegido e protegido pelo sistema operacional.
Em dispositivos enraizados, os usuários já violaram tecnicamente sua própria segurança e, mesmo que não estivesse em texto simples, ainda seria trivial descriptografar, pois a chave precisa existir em algum lugar no dispositivo para fazê-lo.

Um membro da Equipe de Desenvolvimento do Android postou uma explicação que até hoje ainda se aplica:

Agora, com relação a essa preocupação em particular. A primeira coisa a esclarecer é que o aplicativo Email suporta quatro protocolos - POP3, IMAP, SMTP e Exchange ActiveSync - e com muito poucas exceções muito limitadas, todos esses protocolos mais antigos que exigem que o cliente apresente a senha ao servidor em todas as conexões. Esses protocolos exigem que retenhamos a senha pelo tempo que você desejar usar a conta no dispositivo. Protocolos mais recentes não fazem isso - é por isso que alguns dos artigos contrastam com o Gmail, por exemplo. Protocolos mais recentes permitem que o cliente use a senha uma vez para gerar um token, salvar o token e descartar a senha.

Peço que você reveja o artigo vinculado no comentário nº 38 , que é bem escrito e bastante informativo. Ele fornece algumas informações muito boas sobre a diferença entre "obscurecer" senhas e torná-las realmente "seguras". Simplesmente obscurecer sua senha (por exemplo, base64) ou criptografá-la com uma chave armazenada em outro local não tornará sua senha ou seus dados mais seguros. Um invasor ainda poderá recuperá-lo.

(Em particular, foram feitas algumas alegações sobre alguns dos outros clientes de email que não armazenam a senha em texto não criptografado. Mesmo quando isso é verdade, isso não indica que a senha é mais segura. Um teste simples: se você pode inicializar o dispositivo e ele começará a receber e-mail em suas contas configuradas, as senhas não serão realmente seguras. Elas serão ofuscadas ou criptografadas com outra chave armazenada em outro lugar.)

Além disso, como esse problema parece incomodar muitos usuários do Android, você também pode acompanhar esta discussão em Slashdot - Dados de senha do Android armazenados em texto sem formatação .

Zuul
fonte
Uau. Isso me surpreende. Eu não estava ciente do fato de que ele é armazenado em texto simples. Esqueça enraizado ou não enraizado. Se o seu dispositivo for roubado, uma pessoa sem escrúpulos poderá obter facilmente suas credenciais, mesmo se você bloquear o telefone com uma chave de segurança. Dado esse fato, você também conhece quaisquer mecanismos de criptografia de todo o disco.
Asudhak
11
Seja o que for, é algo que pode ser usado para obter acesso à conta. Mas @SachinShekhar, o accounts.dbarquivo está protegido contra leitura por outras contas que não system.
wyzard --stop Prejudicar Monica--
11
Zuul, agradeço o esforço que você colocou nas respostas, mas acho que essa resposta é altamente enganadora. Se você passar pela citação que você citou novamente, o aplicativo Gmail não armazena a senha. --edit verifique também a resposta do @SachinShekhar.
roxan
2
@asudhak Se algum aplicativo estiver usando a senha original, não há como protegê-lo. Um hacker pode decodificar a string codificada de accounts.db depois de encontrar a chave de criptografia / hash que precisa ser armazenada localmente porque o aplicativo de email precisaria dessa chave para compilar a senha original antes de enviá-la ao servidor.
Android Quesito
2
@roxan Não foi possível encontrar nada que indique que a senha não está sendo armazenada pelo aplicativo Gmail. Você pode fornecer uma cotação ou um link?
Flow