Segurança Android SharedPreference

118

Eu me pergunto sobre a segurança das preferências compartilhadas.

É possível obter acesso às preferências compartilhadas, mesmo que tenham sido criadas em MODE_PRIV (0)?
É possível listar todas as preferências compartilhadas disponíveis e, em seguida, buscar todas as configurações de outros aplicativos?
O sharedpreferences é um bom lugar para colocar dados confidenciais, como senha ou token de autenticação?

obrigado

Marek Sebera
fonte
Vale a pena dar uma olhada, com boas respostas. As preferências compartilhadas dizem muito sobre o estilo de programação do desenvolvedor.
Vishwa Ratna

Respostas:

232

As preferências compartilhadas são armazenadas como um arquivo no sistema de arquivos do dispositivo. Eles são, por padrão, armazenados no diretório de dados do aplicativo com permissões do sistema de arquivos definidas que permitem apenas o UID com o qual o aplicativo específico é executado para acessá-los. Portanto, eles são privados na medida em que as permissões de arquivo do Linux restringem o acesso a eles, da mesma forma que em qualquer sistema Linux / Unix.

Qualquer pessoa com acesso de nível raiz ao dispositivo será capaz de vê-los, pois o root tem acesso a tudo no sistema de arquivos. Além disso, qualquer aplicativo executado com o mesmo UID que o aplicativo de criação seria capaz de acessá-los (isso geralmente não é feito e você precisa tomar uma ação específica para fazer dois aplicativos rodarem com o mesmo UID, então provavelmente não é um grande preocupação). Por fim, se alguém conseguiu montar o sistema de arquivos do seu dispositivo sem usar o sistema operacional Android instalado, também pode ignorar as permissões que restringem o acesso.

Se você estiver preocupado com esse acesso às suas preferências (ou quaisquer dados gravados pelo seu aplicativo), você desejará criptografá-lo. Se você está tão preocupado com eles, precisará descobrir exatamente quanta proteção é necessária para o nível de risco que você vê. Há uma discussão muito extensa sobre isso em Segurança de aplicativos para a plataforma Android , recém-publicado em dezembro de 2011 (isenção de responsabilidade: eu sou o autor deste livro).

Thamaraiselvam
fonte
2
Existe alguma documentação oficial que fale sobre isso? Você tem alguma referência?
clu
26

SharedPreferences nada mais são do que arquivos XML em seus telefones / data / data / pasta. Portanto, qualquer aplicativo ou usuário com privilégios de superusuário em um dispositivo com acesso root pode acessar suas SharedPreferences, mesmo que tenham sido criadas com MODE_PRIV

Ainda assim, há uma maneira de protegê-lo de todos ... Por favor, verifique este link. Aqui você pode armazenar dados em pref com criptografia, a classe é autoexplicativa e muito fácil de usar.

https://github.com/sveinungkb/encrypted-userprefs

Como já foi dito por outras pessoas, qualquer pessoa pode acessá-lo, mas, neste caso, ninguém pode ler os dados dentro dele, pois estão criptografados. Portanto, é seguro. Para segurança máxima , minha sugestão será gerar a chave usada para criptografia em tempo de execução, em vez de codificá-la. Há muitas maneiras de fazer isso :)

Jazz Haque
fonte
8
então como você salva a chave gerada?
Olayinka
3
@Olayinka Seria mais seguro criptografar isso com outra chave e salvá-lo em um arquivo SharedPref. Mas então, o que fazer com a outra chave? Falando sério, o melhor cenário seria enviar a chave criptografada e um UID de dispositivo a um servidor usando SSL para ser armazenado lá e recuperado conforme necessário. Isso exigiria conectividade, mas permitiria que você colocasse um dispositivo na lista negra e, de repente, todos os dados fossem descartados. Sem uma conexão constante com a Internet, qualquer tentativa de criptografar dados não é 100% segura.
Paulo Avelar
Usei a solução acima ... funciona 9 em cada 10 vezes ... mas estou recebendo o erro: 1e06b065: Funções de criptografia: EVP_DecryptFinal_ex: BAD_DECRYPT "às vezes ... Alguém tem uma ideia?
Raj Trivedi
3
@PauloAvelar Use o Android KeyStore para armazenamento de longo prazo e recuperação de chaves criptográficas. As chaves não são armazenadas em um aplicativo, portanto, não podem ser comprometidas. A biblioteca fornecida não o usa. Ele salva o segredo no código, portanto, não é seguro.
apex39 de
13

Normalmente, não, eles não podem ser acessados ​​por outros aplicativos, no entanto, você deve observar que SharedPreferences são armazenados como arquivos XML no /data/data/diretório, o que essencialmente significa que qualquer aplicativo com privilégios de superusuário em um dispositivo com acesso root pode acessar seus SharedPreferences, mesmo que fossem criado comMODE_PRIV

aviraldg
fonte
3

É possível obter acesso às preferências compartilhadas, mesmo que tenham sido criadas em MODE_PRIV (0)?

Por código não. Mas você pode recuperar o arquivo do aplicativo se tiver privilégios de superusuário.

É possível listar todas as preferências compartilhadas disponíveis e, em seguida, buscar todas as configurações de outros aplicativos?

Se você for um superusuário (dispositivos com root), poderá obter todos os arquivos privados do aplicativo.

O sharedpreferences é um bom lugar para colocar dados confidenciais, como senha ou token de autenticação?

Não. Ele pode ser facilmente hackeado. Se você quiser colocar quaisquer dados confidenciais no arquivo de preferência compartilhado, você pode criptografar os dados e armazenar. Você pode armazenar sua chave de criptografia no NDK / servidor.

Rajiv Ranjan
fonte
Como pode ser facilmente hackeado?
João Sardinha
Sim, o formulário de pergunta @Jo
Cuong Vo