Em geral, SharedPreferences é sua melhor aposta para armazenar preferências, portanto, em geral, eu recomendaria essa abordagem para salvar as configurações do aplicativo e do usuário.
A única área de preocupação aqui é o que você está salvando. As senhas são sempre uma coisa complicada de armazenar, e eu seria particularmente cauteloso em armazená-las como texto não criptografado. A arquitetura do Android é tal que as SharedPreferences do seu aplicativo são protegidas por sandbox para impedir que outros aplicativos possam acessar os valores, para que haja segurança lá, mas o acesso físico a um telefone pode permitir o acesso aos valores.
Se possível, eu consideraria modificar o servidor para usar um token negociado para fornecer acesso, algo como OAuth . Como alternativa, pode ser necessário construir algum tipo de armazenamento criptográfico, embora isso não seja trivial. No mínimo, verifique se você está criptografando a senha antes de gravá-la no disco.
MODE_PRIVATE
com SharedPreferences equivale a fazer o mesmo com um arquivo criado no armazenamento interno, em termos de eficácia para ofuscar os dados armazenados localmente?Eu concordo com Reto e fiXedd. Objetivamente, não faz muito sentido investir tempo e esforço significativos na criptografia de senhas em SharedPreferences, já que qualquer invasor que tenha acesso ao seu arquivo de preferências provavelmente também terá acesso ao binário do aplicativo e, portanto, às chaves para descriptografar o arquivo. senha.
No entanto, dito isso, parece haver uma iniciativa de publicidade identificando aplicativos móveis que armazenam suas senhas em texto não criptografado em SharedPreferences e lançando luz desfavorável sobre esses aplicativos. Consulte http://blogs.wsj.com/digits/2011/06/08/some-top-apps-put-data-at-risk/ e http://viaforensics.com/appwatchdog para alguns exemplos.
Embora necessitemos de mais atenção à segurança em geral, eu argumentaria que esse tipo de atenção nessa questão em particular não aumenta significativamente nossa segurança geral. No entanto, como as percepções são como são, aqui está uma solução para criptografar os dados que você coloca em SharedPreferences.
Simplesmente envolva seu próprio objeto SharedPreferences neste e todos os dados que você ler / gravar serão automaticamente criptografados e descriptografados. por exemplo.
Aqui está o código da classe:
fonte
A maneira mais simples de armazenar uma única preferência em uma Atividade Android é fazer algo como isto:
Se você estiver preocupado com a segurança desses, sempre poderá criptografar a senha antes de armazená-la.
fonte
Usando o trecho fornecido por Richard, você pode criptografar a senha antes de salvá-la. A API de preferências, no entanto, não fornece uma maneira fácil de interceptar o valor e criptografá-lo - você pode impedir que ele seja salvo por meio de um ouvinte do OnPreferenceChange e, teoricamente, pode modificá-lo por meio de um preferencialChangeListener, mas isso resulta em um loop infinito.
Eu sugeri anteriormente adicionar uma preferência "oculta" para fazer isso. Definitivamente, não é o melhor caminho. Vou apresentar duas outras opções que considero mais viáveis.
Primeiro, o mais simples, está em uma preferênciaChangeListener, você pode pegar o valor digitado, criptografá-lo e salvá-lo em um arquivo de preferências alternativo:
A segunda maneira, e da maneira que agora prefiro, é criar sua própria preferência personalizada, estendendo EditTextPreference, @ Substituindo os métodos
setText()
egetText()
, de modo quesetText()
criptografa a senha egetText()
retorne nulo.fonte
OK; já faz um tempo desde que a resposta é meio confusa, mas aqui estão algumas respostas comuns. Eu pesquisei isso como um louco e foi difícil criar uma boa resposta
O método MODE_PRIVATE é considerado geralmente seguro, se você assumir que o usuário não fez root no dispositivo. Seus dados são armazenados em texto sem formatação em uma parte do sistema de arquivos que pode ser acessada apenas pelo programa original. Isso cria facilmente a senha com outro aplicativo em um dispositivo enraizado. Então, novamente, você deseja suportar dispositivos enraizados?
O AES ainda é a melhor criptografia que você pode fazer. Lembre-se de procurar isso se estiver iniciando uma nova implementação, já faz um tempo desde que eu publiquei isso. O maior problema com isso é "O que fazer com a chave de criptografia?"
Então, agora estamos no "O que fazer com a chave?" parte. Esta é a parte difícil. Obter a chave acaba não sendo tão ruim. Você pode usar uma função de derivação de chave para obter alguma senha e torná-la uma chave bastante segura. Você se depara com questões como "quantas passagens você faz com o PKFDF2?", Mas esse é outro tópico
Idealmente, você armazena a chave AES fora do dispositivo. Você precisa descobrir uma boa maneira de recuperar a chave do servidor de maneira segura, confiável e protegida.
Você tem uma sequência de login de algum tipo (mesmo a sequência de login original que você faz para acesso remoto). Você pode executar duas execuções do seu gerador de chaves na mesma senha. Como isso funciona é que você deriva a chave duas vezes com um novo sal e um novo vetor de inicialização segura. Você armazena uma dessas senhas geradas no dispositivo e usa a segunda senha como chave AES.
Ao fazer login, você obtém a chave novamente no logon local e a compara à chave armazenada. Feito isso, use a chave de derivação nº 2 para o AES.
Você pode fazer muitas variações disso. Por exemplo, em vez de uma sequência de login completa, você pode fazer um PIN rápido (derivado). O PIN rápido pode não ser tão seguro quanto uma sequência de login completa, mas é muitas vezes mais seguro que o texto sem formatação
fonte
Sei que isso é um pouco de necromancia, mas 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.
SampleSyncAdapter é um exemplo que utiliza credenciais de conta armazenadas.
fonte
Vou jogar meu chapéu no ringue apenas para falar sobre a proteção de senhas em geral no Android. No Android, o binário do dispositivo deve ser considerado comprometido - é o mesmo para qualquer aplicativo final que esteja sob controle direto do usuário. Conceitualmente, um hacker pode usar o acesso necessário ao binário para descompilar e eliminar suas senhas criptografadas, etc.
Como tal, há duas sugestões que eu gostaria de oferecer se a segurança for uma grande preocupação para você:
1) Não armazene a senha real. Armazene um token de acesso concedido e use o token de acesso e a assinatura do telefone para autenticar a sessão no servidor. O benefício disso é que você pode fazer com que o token tenha uma duração limitada, não comprometa a senha original e tem uma boa assinatura que pode ser usada para correlacionar com o tráfego posteriormente (por exemplo, verifique se há tentativas de invasão e invalide o token tornando-o inútil).
2) Utilize autenticação de 2 fatores. Isso pode ser mais irritante e intrusivo, mas para algumas situações de conformidade inevitáveis.
fonte
Você também pode conferir esta pequena biblioteca, contendo a funcionalidade que você mencionou.
https://github.com/kovmarci86/android-secure-preferences
É semelhante a algumas das outras abordagens aqui. A esperança ajuda :)
fonte
Esta é uma resposta suplementar para quem chega aqui com base no título da pergunta (como eu fiz) e não precisa lidar com os problemas de segurança relacionados ao salvamento de senhas.
Como usar Preferências Compartilhadas
As configurações do usuário geralmente são salvas localmente no Android usando
SharedPreferences
um par de valores-chave. Você usa aString
chave para salvar ou procurar o valor associado.Gravar em preferências compartilhadas
Use em
apply()
vez decommit()
para salvar em segundo plano em vez de imediatamente.Ler em Preferências compartilhadas
O valor padrão é usado se a chave não for encontrada.
Notas
Em vez de usar uma chave local String em vários lugares como eu fiz acima, seria melhor usar uma constante em um único local. Você pode usar algo assim na parte superior da atividade de configurações:
Eu usei um
int
no meu exemplo, mas você também pode usarputString()
,putBoolean()
,getString()
,getBoolean()
, etc.fonte
Esta resposta é baseada em uma abordagem sugerida por Mark. É criada uma versão personalizada da classe EditTextPreference que converte entre o texto sem formatação visto na exibição e uma versão criptografada da senha armazenada no armazenamento de preferências.
Como foi indicado pela maioria dos que responderam a este tópico, essa não é uma técnica muito segura, embora o grau de segurança dependa parcialmente do código de criptografia / descriptografia usado. Mas é bastante simples e conveniente e impedirá a maioria dos bisbilhoteiros casuais.
Aqui está o código para a classe EditTextPreference personalizada:
Isso mostra como ele pode ser usado - este é o arquivo "items" que conduz a exibição das preferências. Observe que ele contém três visualizações EditTextPreference comuns e uma das visualizações EditPasswordPreference personalizadas.
Quanto à criptografia / descriptografia real, isso é deixado como um exercício para o leitor. Atualmente, estou usando algum código com base neste artigo http://zenu.wordpress.com/2011/09/21/aes-128bit-cross-platform-java-and-c-encryption-compatibility/ , embora com valores diferentes para a chave e o vetor de inicialização.
fonte
Antes de tudo, acho que os dados do usuário não devem ser armazenados no telefone e, se for necessário, armazenar dados em algum lugar do telefone, devem ser criptografados nos dados particulares do aplicativo. A segurança das credenciais dos usuários deve ser a prioridade do aplicativo.
Os dados confidenciais devem ser armazenados com segurança ou de maneira alguma. No caso de perda de um dispositivo ou infecção por malware, os dados armazenados de maneira insegura podem ser comprometidos.
fonte
Uso o KeyStore do Android para criptografar a senha usando o RSA no modo BCE e, em seguida, salve-a nas Preferências compartilhadas.
Quando quero a senha de volta, leio a criptografada das SharedPreferences e descriptografo-a usando o KeyStore.
Com esse método, você gera um par de chaves público / privado, onde o privado é armazenado e gerenciado com segurança pelo Android.
Aqui está um link sobre como fazer isso: Tutorial do Android KeyStore
fonte
preferências compartilhadas é a maneira mais fácil de armazenar os dados de nossos aplicativos. mas é possível que alguém possa limpar nossos dados de preferências compartilhadas por meio do gerenciador de aplicativos. Portanto, não acho que seja completamente seguro para nosso aplicativo.
fonte
você precisa usar o apit de segurança sqlite para armazenar as senhas. Aqui está o melhor exemplo, que armazena senhas, - passwordsafe. aqui está o link para a fonte e a explicação - http://code.google.com/p/android-passwordsafe/
fonte