Vou usar o outh para buscar e-mails e contatos do google. Não quero pedir ao usuário que faça login para obter um token de acesso e um segredo. Pelo que entendi, preciso armazená-los com meu aplicativo em um banco de dados ou SharedPreferences
. Mas estou um pouco preocupado com os aspectos de segurança com isso. Eu li que você pode criptografar e descriptografar os tokens, mas é fácil para um invasor descompilar seu apk e classes e obter a chave de criptografia.
Qual é o melhor método para armazenar com segurança esses tokens no Android?
123
Respostas:
Armazene-os como preferências compartilhadas . Por padrão, são privados e outros aplicativos não podem acessá-los. Em dispositivos com raiz, se o usuário permitir explicitamente o acesso a algum aplicativo que esteja tentando lê-los, o aplicativo poderá usá-los, mas você não poderá se proteger. Quanto à criptografia, você precisa exigir que o usuário insira a frase secreta descriptografada todas as vezes (anulando o objetivo de armazenar em cache as credenciais) ou salve a chave em um arquivo e o mesmo problema ocorrerá.
Existem alguns benefícios em armazenar tokens em vez da senha real do nome de usuário:
fonte
Você pode armazená-los no AccountManager . É considerado uma boa prática de acordo com esses caras.
Aqui está a definição oficial:
Para um guia detalhado sobre como usar o AccountManager:
No entanto, no final, o AccountManager armazena apenas seu token como texto sem formatação. Portanto, sugiro criptografar seu segredo antes de armazená-lo no AccountManager. Você pode utilizar várias bibliotecas de criptografia como o AESCrypt ou AESCrypto
Outra opção é usar a biblioteca Conceal . É seguro o suficiente para o Facebook e muito mais fácil de usar do que o AccountManager. Aqui está um trecho de código para salvar um arquivo secreto usando o Conceal.
fonte
SharedPreferences não é um local seguro. Em um dispositivo enraizado, podemos facilmente ler e modificar xmls de SharedPrefereces de todos os aplicativos. Portanto, os tokens devem expirar relativamente frequentes. Mas, mesmo que um token expire a cada hora, os tokens mais recentes ainda podem ser roubados das SharedPreferences. O Android KeyStore deve ser usado para armazenamento e recuperação a longo prazo de chaves criptográficas que serão usadas para criptografar nossos tokens, a fim de armazená-los em, por exemplo, SharedPreferences ou um banco de dados. As chaves não são armazenadas no processo de um aplicativo e, portanto, são mais difíceis de serem comprometidas.
Tão mais relevante que um local é como eles próprios podem ser seguros, por exemplo, usando JWTs de vida curta assinados criptograficamente, criptografando-os usando o Android KeyStore e enviando-os com um protocolo seguro
fonte
Agora carregar a ler o token de acesso e segredo em seu aplicativo do módulo build.gradle arquivo. Em seguida, você precisa definir a variável BuildConfig para o seu token e segredo de acesso, para que você possa acessá-los diretamente do seu código. Seu build.gradle pode parecer com o seguinte:
Você pode usar seu token e segredo de acesso em seu código como este:
Dessa forma, você não precisa armazenar o token e o segredo de acesso em texto sem formatação dentro do seu projeto. Portanto, mesmo que alguém descompile seu APK, eles nunca receberão seu token e segredo de acesso enquanto você os carrega de um arquivo externo.
fonte
Bem, você pode proteger seu acesso ao token seguindo duas opções.
fonte