Segurança moderna no Android (parte 6)

Tempo de leitura: 3 minutes

Esta é a parte final desta série, mas também é provavelmente a primeira parte de uma segunda série “Rede Prática para Desenvolvedores Android” que estará disponível após a publicação desta última parte.

No mundo mobile, sabe-se que muitas vezes precisamos de algum tipo de serviço para fazer nosso aplicativo funcionar, pode ser uma API Rest, talvez Soap ou mesmo GraphQL, porém, muitas vezes é assumido que nossos serviços são seguros porque estamos usando uma conexão https, mas na realidade não é totalmente real, colocando algumas ferramentas e criando alguns certificados podemos ver nossos pedidos aos nossos servidores e eles se tornam espaços sniftable usando um simples Charles ou um Wireshark.

O Transport Layer Security (TLS) é o sucessor do protocolo SSL, o TLS é uma versão melhorada do primeiro, funciona da mesma forma que o SSL, usando criptografia para proteger os dados e informações que estão sendo transferidos. Esses dois termos são geralmente usados ​​de forma intercambiável na indústria, mas, para fins práticos, hoje vamos nos referir a eles como SSL. Para manter seu aplicativo seguro, precisamos de um certificado SSL, geralmente um servidor precisa de uma chave privada e uma chave pública para que seu aplicativo e o servidor possam fazer o handshake, o servidor usa a chave privada dentro de um certificado que foi assinado com a chave pública criptografia.

No entanto, um handshake não prova nada, todos podemos criar um certificado a partir de qualquer página da web, por isso precisamos de uma Autoridade de Certificação!

Autoridade Certificadora

Uma Autoridade de Certificação é uma organização ou empresa que valida essa identidade como sua, por exemplo, se você trabalha na FakeCompnay, pode criar uma identidade da página, e-mail ou até mesmo uma pessoa, este certificado digital é baseado em uma chave criptográfica, e nos dá a oportunidade de autenticar usando uma chave que valida que pertencemos a essa organização. Por sua vez, esta chave nos ajuda a criptografar a comunicação de nossos dados através de redes inseguras, o que nos dá a possibilidade de que nenhum de nossos dados possa ser detectado no momento da transferência

O certificado irá basicamente criar duas chaves que são necessárias, a pública e a privada, junto com um CSR que é um arquivo que contém mais informações sobre a autoridade que representa, este arquivo pode ser de dois tipos, CER ou PFX

Quando um certificado é assinado ou validado como uma autoridade de certificação, isso significa que podemos usá-lo como uma abordagem para a chave pública, ajudando-nos a estabelecer uma comunicação segura com terceiros, por sua vez, podemos validar documentos usando-o

CER: normalmente usado por SSL para identificar sites e outras entidades

PFX: contém dados criptográficos da autoridade, incluindo chaves privadas e cadeias de certificados

Ambos são protegidos criptograficamente com senhas para manter as chaves privadas e preservar sua integridade. Você pode pedir a qualquer membro da sua equipe DevOps este certificado (se você não tiver uma equipe, a pessoa que configurou os serviços pode ajudá-lo)

Podemos adicionar este certificado ao seu cliente Http preferido de uma forma simples:

  1. Você pode manter seu certificado em uma pasta Raw, se e somente se, a senha não for um texto simples dentro do seu código, porque se fosse, teríamos exatamente o mesmo que vimos no Native Module Code
  2. Assim que tivermos o certificado, precisamos criar uma instância de Keystore, lembre-se que queremos que seja seguro, então este certificado deve ficar em um local seguro, de preferência auxiliado por um ambiente de execução confiável, dependendo do tipo de certificado podemos criar um instância padrão ou um PKCS12
    PKCS12 define um único arquivo que contém vários dados criptográficos como objetos AKA PFX
  3. Precisamos usar a integração KeyManagerFactory para usar o padrão X509 definido como o formato de chave pública que contém uma chave e uma identidade pública (o nome do host, a organização ou o indivíduo) e pode ser autoassinado ou uma Autoridade de Certificação
  4. Assim que tivermos o KeyManagerFactory e a instância Keystore com nosso certificado, podemos criar uma instância de SSL e TLS
var certificate = resources.openRawResouce(R.waw_certificate) 

// Para .CRT 
val keyStore = KeyStore.getInstance(KeyStore.getDefaultType()) 

// Para .PFX
val keyStore = KeyStore.getInstance("PKCS12") 
keyStore.load(certificate, "CoolPassword") 

var factory = KeyManagerFactory.getInstance("X509") 
// pode ser qualquer outro padrão
factory.init(keyStore, "CoolPassword") 

val ssl = SSLContext.getInstance("TLS") 
ssl.init(factory.keyManagers, null, SecureRandom()) 

Dependendo do que estivermos usando, podemos adicionar a integração SSL ao HttpClient, neste exemplo, usaremos o OkHttpClient e nas primeiras linhas adicionaremos o SSL socket Factory

@Provides 
@Singleton 
fun providesOkHttpClient): OkHttpClient {
   val builder = OkHttpClient.Builder().apply { 
       sslSocketFactory(ssl.socketFactory) 
       connectTimeout(connectTimeOut, TimeUnit.SECONDS) 
       readTimeout(readTimeOut, TimeUnit.SECONDS) 
   } return builder.build() 
} 

Com isso, estamos garantindo que o handshake do cliente e do servidor estará seguro e inacessível a terceiros e seus dados serão transferidos com segurança!

 

 

Isso é tudo por este serial, muito obrigado.

 

 

Visits: 1 Visits: 1193191