Android: armazenando nome de usuário e senha?

178

Se eu quiser armazenar o nome de usuário e a senha a serem usados ​​em um aplicativo Android, qual é a melhor maneira de fazer isso? É através da tela de preferências (mas e se o usuário perder isso?), Ou abrir uma caixa de diálogo e solicitar credenciais ao usuário? Nesse caso, tenho que manter o estado do aplicativo. Como eu faria isso?

lenda
fonte
4
stackoverflow.com/a/786588/1166727 Confira o que o @RetoMeier (líder técnico para desenvolvimento do Android no Google) tem a dizer sobre isso.
gil tony
1
Se você estiver procurando a maneira mais segura de armazenar as credenciais
leia
3
@Legend como você resolveu seu problema?
Erum
@Legend, você pode lançar alguma luz sobre a poupança pwd em prefs após criptografia .. porque eu quero meu aplicativo para o trabalho sem qualquer internet, então como faço para obter a chave .. (coz eu não posso armazenamento de chaves do dispositivo)
eRaisedToX
Você pode usar o keystore para a API +18. developer.android.com/training/articles/keystore
Golnar

Respostas:

115

A maioria dos aplicativos para Android e iPhone que eu já vi usa uma tela ou caixa de diálogo inicial para solicitar credenciais. Eu acho que é complicado para o usuário ter que digitar novamente seu nome / senha com frequência, então armazenar essas informações faz sentido do ponto de vista da usabilidade.

O conselho do ( Android dev guide ) é:

Em geral, recomendamos minimizar a frequência de solicitações de credenciais do usuário - para tornar os ataques de phishing mais visíveis e menos propensos a obter êxito. Em vez disso, use um token de autorização e atualize-o.

Sempre que possível, o nome de usuário e a senha não devem ser armazenados no dispositivo. Em vez disso, execute a autenticação inicial usando o nome de usuário e a senha fornecidos pelo usuário e use um token de autorização específico de serviço de curta duração.

Usar o AccountManger é a melhor opção para armazenar credenciais. O SampleSyncAdapter fornece um exemplo de como usá-lo.

Se isso não for uma opção para você, por algum motivo, você poderá voltar a credenciais persistentes usando o mecanismo Preferências . Outros aplicativos não poderão acessar suas preferências, portanto, as informações do usuário não são facilmente expostas.

Eric Levine
fonte
40
Eu diria que é arriscado manter as informações de senha como estão nas preferências. Em telefones com root, é possível acessar o arquivo de preferências de um aplicativo. O mínimo que você pode fazer é ofuscar a senha.
Jayesh
51
Se alguém tiver seu telefone e conseguir fazer root, não há muito o que fazer para manter seus dados seguros. Não é uma má idéia ofuscar a senha, mas na verdade não está adicionando muito mais proteção. O mais importante é que já existem muitas camadas de segurança incorporadas ao sistema operacional. Obviamente, você não quer fazer nada estúpido para contornar essas medidas. Provavelmente é melhor usar um sistema como OAuth e armazenar um token no dispositivo em vez do nome de usuário e senha.
Eric Levine
4
Se você usar o AccountManager(de acordo com a minha resposta e a @ Miguel de maneira indireta) e alguém pegar o telefone GSM, precisará continuar usando o SIM para ter acesso às suas contas, pois isso invalidará as credenciais armazenadas. quando o SIM mudar.
Jon O
3
A limpeza da conta na alteração do SIP foi removida há muito tempo, porque faz pouco sentido, especialmente para pessoas que têm mais de um SIM. Uma estratégia melhor se o seu telefone for roubado é acessar a página da sua conta do Google e revogar o acesso para o dispositivo específico.
Nikolay Elenkov
2
"Usar o AccountManger é a melhor opção para armazenar credenciais." Por quê?
Luc
9

Você deve usar o Android AccountManager . Foi desenvolvido especificamente para esse cenário. É um pouco complicado, mas uma das coisas que faz é invalidar as credenciais locais se o cartão SIM mudar, por isso, se alguém roubar seu telefone e lançar um novo SIM, suas credenciais não serão comprometidas.

Isso também oferece ao usuário uma maneira rápida e fácil de acessar (e potencialmente excluir) as credenciais armazenadas de qualquer conta que ele possua no dispositivo, tudo em um só local.

O SampleSyncAdapter (como o @Miguel mencionado) é um exemplo que utiliza credenciais da conta armazenada.

Jon O
fonte
3
Onde está documentado que o AccountManager "invalidará as credenciais locais se o cartão SIM mudar"?
Eric Levine
Não é disso que estou ciente. No entanto, é algo que eu acredito / aceito / entendo depois que alguns usuários do meu aplicativo tiveram problemas de autenticação após trocas de SIM.
Jon O
1
Não o vejo nos códigos JavaDocs ou AccountManager. Parece um bom recurso, seria bom verificar e entender os detalhes.
Eric Levine
2
De acordo com @NikolayElenkov, o recurso de troca inválida no cartão SIM foi removido.
precisa saber é o seguinte
2
@ThomasW você tem uma citação para isso? Seria ótimo obter uma resposta definitiva de algum tipo.
Jon O
8

Eu acho que a melhor maneira de proteger sua credencial é primeiro pensar em armazenar a senha com criptografia no arquivo account.db, que não poderia estar facilmente disponível em dispositivos não raiz e, no caso de dispositivo raiz, o hacker precisa da chave para descriptografar isto.

Outra opção é fazer toda a sua autenticação, como está o Gmail. após a primeira autenticação com o servidor do Gmail. você obteve o token de autenticação que seria usado no caso de sua senha. esse token seria armazenado em texto sem formatação. esse token poderia ser falso caso você alterasse a senha do servidor.

a última opção, recomendo que você ative a autenticação de dois fatores e crie uma senha específica para o dispositivo. Depois de perder o dispositivo, tudo o que você precisa é desativar esse dispositivo.

Riz
fonte
2
Você pode postar uma fonte que diz que accounts.db está criptografado? Ou você diz que a senha específica deve ser criptografada?
Michał K
1
@Riz, onde armazenar a chave para a encriptação ... porque meu aplicativo funciona sem Internet, por isso não posso obtê-lo de rede
eRaisedToX
2

Com o novo hardware e API (Android 6.0) de impressão digital, você pode fazê-lo como neste aplicativo de exemplo do github.

Zlatko
fonte
8
O projeto de amostra mencionado cria uma chave no Android Key Store e a usa para criar uma cifra para criptografar a senha. A senha e a cifra criptografadas são armazenadas como cadeias codificadas em base64 nas preferências compartilhadas. Após a autenticação bem-sucedida da impressão digital, a chave secreta é recuperada do Android Key Store e usada com a cifra decodificada para descriptografar a senha decodificada.
Mjwheat #
@ mjwheat isso é muito útil para entender o que está acontecendo no exemplo. Obrigado! Um pequeno erro de digitação: "... para descriptografar a senha codificada".
precisa saber é o seguinte
2

Eles são classificados em ordem de dificuldade para quebrar suas informações ocultas .

  1. Armazenar em texto não criptografado

  2. Armazenar criptografado usando uma chave simétrica

  3. Usando o Keystore Android

  4. Armazenar criptografado usando chaves assimétricas

fonte: onde é o melhor lugar para armazenar uma senha no seu aplicativo Android

O próprio Keystore é criptografado usando o PIN / senha da tela de bloqueio do próprio usuário; portanto, quando a tela do dispositivo está bloqueada, o Keystore fica indisponível. Lembre-se disso se você tiver um serviço em segundo plano que possa precisar acessar os segredos do aplicativo.

fonte: use o Android Keystore para armazenar senhas e outras informações confidenciais

Dmytro Melnychuk
fonte