A fim de preservar a confiança do usuário e manter a integridade dos dados, desenvolver aplicativos móveis seguros é um dos grandes desafios para a maioria dos desenvolvedores de aplicativos móveis. Este artigo irá levá-lo através de algumas das melhores práticas que devem ser seguidas durante a construção do aplicativo Android para evitar vulnerabilidades de segurança.
1. Mantenha a comunicação segura com outros aplicativos
- Use intenções implícitas para mostrar o Escolhidor de aplicativos que oferece opção ao usuário para lançar pelo menos dois aplicativos possíveis no dispositivo para a ação solicitada. Isso permite que os usuários transfiram informações confidenciais para o aplicativo em que confiam.
- Aplique permissões baseadas em assinatura enquanto compartilha dados entre dois aplicativos controlados por você. Essas permissões não precisam de confirmação do usuário, mas verificam se os aplicativos que acessam os dados são assinados usando a mesma chave de assinatura. Portanto, ofereça uma experiência mais simplificada e segura ao usuário.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <permission android:name="my_custom_permission_name" android:protectionLevel="signature" />
- C. Provedores de conteúdo não exportados — A menos que você pretenda enviar dados do seu aplicativo para outros aplicativos, desautorizou explicitamente outros aplicativos para acessar seu ContentProvider em manifesto usando android:exported=”false” (por padrão é “verdadeiro” para a versão android menor que 4.4 ).
2. Comunicação de rede segura
Garantir a segurança da rede com a Segurança com HTTPS e SSL — Para qualquer tipo de comunicação de rede, devemos usar HTTPS (em vez de simples http) com a implementação adequada do certificado. Para mais detalhes, consulte aqui.
A conexão segura com o servidor pode ser estabelecida de maneiras a seguir:
- Comunicação com o servidor web com certificado CA confiável bem conhecido precisa de quaisquer medidas adicionais a serem tomadas ao criar a solicitação http.
val url = URL("https://www.google.com") val urlConnection = url.openConnection() as HttpsURLConnection urlConnection.connect() urlConnection.inputStream.use { ... }
- Adicionando uma configuração de segurança de rede: Se o aplicativo usar CAs novos ou personalizados, você poderá declarar as configurações de segurança da sua rede em um arquivo de configuração. Esse processo permite criar a configuração sem modificar qualquer código do aplicativo.
Para adicionar um arquivo de configuração de segurança de rede ao seu aplicativo, siga estas etapas:
01) Declare a configuração no manifesto do seu aplicativo:
<manifest ... > <application android:networkSecurityConfig="@xml/network_security_config" ... > <!-- Place child elements of <application> element here. --> </application> </manifest>
02) Adicione um arquivo de recurso XML, localizado em .res/xm/network_security_config.xml
Especifique que todo o tráfego para determinados domínios deve usar HTTPS desativando texto claro:
<network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">secure.example.com</domain> ... </domain-config> </network-security-config>
Durante o processo de desenvolvimento, você pode usar o elemento para permitir de forma explicitamente certificados instalados pelo usuário. Esse elemento substitui as opções críticas de segurança do seu aplicativo durante a depuração e o teste sem afetar a configuração de versão do aplicativo. O trecho a seguir mostra como definir esse elemento no arquivo XML de configuração de segurança de rede do seu aplicativo:<debug-overrides>
<network-security-config> <debug-overrides> <trust-anchors> <certificates src="user" /> </trust-anchors> </debug-overrides> </network-security-config>
- Crie seu próprio gerente de confiança Se o servidor web tiver um certificado assinado por um CA novo ou personalizado que não é confiável pelo dispositivo móvel e, além disso, você não poderá usar uma configuração de segurança de rede.
Para este cenário, você pode precisar configurar um gerente de confiança e lidar com todos os avisos SSL que ocorrem.
- Certificados Pinning :A aplicação pode ser limitada a aceitar apenas um conjunto de certificados limitando o conjunto de CAs em que confiam ou por fixação de certificado.
É conseguido fornecendo um conjunto de certificados por hash da chave pública (do certificado X.509). Uma cadeia de certificados só é válida se a cadeia de certificados contiver pelo menos uma das chaves públicas fixadas.
SubjectPublicKeyInfo
Outros cenários: Existem alguns outros fatores que devem ser considerados quando seu aplicativo tenta acessar dados através da internet:
- Use objetos do WebView cuidadosamente: Os objetos em seu aplicativo não devem permitir que os usuários naveguem em sites que estão fora do seu controle. Além disso, o suporte à interface JavaScript só deve ser ativado se você controlar completamente e confiar no conteúdo nos objetos WebView do seu aplicativo.
Use canais de mensagens HTML em vez de se comunicar entre um site e seu aplicativo. Verifique a documentação do Android para ver como proteger seu WebView.
- Use autenticação de alto nível : Os mecanismos de autenticação desempenham um papel crucial na segurança do aplicativo móvel. Informações confidenciais podem ser protegidas eficientemente através da autenticação de vários fatores, um gerenciamento robusto de sessões e um sistema desconectado. Também é essencial configurar autorização avançada com o suporte de ferramentas como tokens web OAuth 2.0 ou JSON para maior segurança de aplicativos Android.
3. Forneça as permissões certas
O aplicativo deve solicitar apenas o número mínimo de permissões necessárias para funcionar corretamente.
Ele não deve adicionar uma permissão para concluir uma ação que poderia ser concluída em outro aplicativo. Em vez disso, use a intenção de adiar a solicitação para um aplicativo diferente que já tenha a permissão necessária.
Por exemplo, se um aplicativo precisar criar um contato para um aplicativo de contato, ele delega a responsabilidade de criar o contato para um aplicativo de contatos, que já recebeu a permissão WRITE_CONTACTS apropriada.
4. Segurança no armazenamento de dados
A criptografia é a maneira mais eficiente de alcançar a segurança dos dados. Portanto, use o mecanismo de criptografia apropriado enquanto lida com dados dentro do aplicativo.
Para maior segurança, você precisa de um certificado de assinatura de código que garanta aos usuários que o código não está sendo alterado desde que foi assinado.
Para obter maior segurança de chave, use o sistema Android Keystore.
A seguir descreve as melhores práticas para armazenar dados em seu dispositivo.
A. Armazenar dados privados dentro do armazenamento interno
Armazene todos os dados do usuário privado dentro do armazenamento interno do dispositivo, que é sandboxed por aplicativo. Não há necessidade de solicitar permissão para acessar esses arquivos e não pode ser acessado por outros aplicativos. Sempre que o usuário desinstala um aplicativo, o dispositivo exclui todos os arquivos que o aplicativo salvou dentro do armazenamento interno. Considere trabalhar com objetos, que estão disponíveis na biblioteca de segurança, em vez de objetos. Encontre o exemplo aqui: EncryptedFile
B. Use o armazenamento externo com cautela
Por padrão, o sistema Android não impõe restrições de segurança aos dados que residem dentro do armazenamento externo, e o próprio meio de armazenamento não é garantido para ficar conectado ao dispositivo. Portanto, aplique as seguintes medidas de segurança para fornecer acesso seguro às informações dentro do armazenamento externo.
Use acesso ao diretório escopo: Se o aplicativo precisar acessar apenas um diretório específico dentro do armazenamento externo do dispositivo, use o acesso ao diretório escopo para limitar o acesso do seu aplicativo ao armazenamento externo de um dispositivo de acordo.
Acesse arquivos específicos de aplicativos: Se um arquivo não contiver informações privadas ou confidenciais, mas fornecer valor ao usuário apenas em seu aplicativo, armazene o arquivo em um diretório específico do aplicativo sobre armazenamento externo.
C. Armazene apenas dados não confidenciais em arquivos de cache
Para fornecer acesso mais rápido a dados de aplicativos não sensíveis, armazene-os no cache do dispositivo. Para cache maiores que 1 MB de tamanho, use; caso contrário, use . Cada método fornece o objeto que contém os dados armazenados em cache do seu aplicativo.
getExternalCacheDir()getCacheDir()File
D. Use Preferências Compartilhadas no modo privado
Para criar ou acessar você é o objeto do seu aplicativo usando, use para que seu aplicativo possa acessar as informações dentro do arquivo de preferências compartilhadas. SharedPreferencesgetSharedPreferences()MODE_PRIVATE
Além disso, deve ser usado para mais segurança que envolve a classe de conferências compartilhadas e criptografa automaticamente chaves e valores. EncryptedSharedPreferences
5. Mantenha as dependências e bibliotecas atualizadas para tornar esses pontos de comunicação mais seguros.
6. Encolher, ofuscar e otimizar seu código com o compilador R8
Se você estiver construindo seu projeto usando o plugin Android Gradle 3.4.0 ou superior, o plugin não usa mais o ProGuard para executar a otimização do código de tempo de compilação. Em vez disso, o plugin funciona com o compilador R8 para lidar com as seguintes tarefas de tempo de compilação:
- Encolhimento de código: detecta e remove com segurança classes, campos, métodos e atributos no uso do seu aplicativo e suas dependências de biblioteca (tornando-o uma ferramenta valiosa para trabalhar em torno do limite de referência de 64k).
- Encolhimento de recursos: remove recursos não utilizados do seu aplicativo embalado, incluindo recursos não utilizados nas dependências da biblioteca do seu aplicativo.
- Ofuscação: encurta o nome das classes e membros, o que resulta em tamanhos reduzidos de arquivos DEX.
- Otimização: inspeciona e reescreve seu código para reduzir ainda mais o tamanho dos arquivos DEX do seu aplicativo.
Conclusão:
Essas são as melhores práticas que todo desenvolvedor de aplicativos móveis deve seguir para proteger o aplicativo da vulnerabilidade. Isso ajuda você a desenvolver aplicativos altamente seguros necessários para evitar informações valiosas do usuário do seu aplicativo e manter a confiança do seu cliente.