Criptografia de transmissão de dados Android

Criptografia simétrica

  • Criptografia de chave única, a mesma chave de criptografia e descriptografia
  • Algoritmos representativos: DES, 3DES, AES, RC2, RC4
  • Vantagens: alta eficiência de criptografia e descriptografia, algoritmo simples, adequado para criptografar grandes quantidades de dados.
  • Desvantagens: manutenção de chave complexa, não há segurança após vazamento

Criptografia assimétrica

  • Chaves públicas e privadas de criptografia assimétrica, uma chave é usada para criptografar e a outra é usada para descriptografar
  • Algoritmos representativos: RSA, ECC
  • Vantagens: alta segurança, a chave privada não pode ser derivada da chave pública, adaptando-se aos cenários de transmissão da rede
  • Desvantagens: baixa eficiência de criptografia

HTTP / HTTPS

Solicitação HTTP / HTTPS e anti-captura

Cenários de aplicação de rede APP

  1. Usar http, não fazer nenhuma criptografia, é equivalente a streaking, e os engenheiros juniores podem facilmente espionar todos os seus dados de negócios.
  2. Use http, mas todo o tráfego é criptografado por AES com a chave embutida no cliente, o tráfego é basicamente seguro, mas uma vez que o código do cliente é descompilado e a chave é roubada, ele irá para o estado de streaking
  3. Use http, mas a chave usada pelo AES é gerada temporariamente pelo cliente no modo GUID. Para garantir que a chave possa ser entregue com segurança ao servidor, é necessário usar a chave pública do servidor para criptografia, portanto, o certificado do servidor deve ser incorporado e o certificado expira O mecanismo é atualizado, o algoritmo de criptografia simétrica usado não pode ser negociado dinamicamente e a segurança ainda apresenta falhas.

Recomendações de segurança para transmissão criptografada

  • Tente usar https
  • Não transmita senhas em texto não criptografado
  • Pedido para trazer assinatura de dados para evitar adulteração
  • solicitação http usa chave temporária
  • AES usa o modo CBC
  • Post não é mais seguro do que get, deve ser criptografado e assinado

verificação de certificado https

  • CA (Autoridade de Certificação). CA usa sua própria chave privada para emitir um certificado digital, e o certificado digital contém a chave pública de A. Em seguida, B pode usar a chave pública no certificado raiz da CA para descriptografar o certificado emitido pela CA, obtendo assim a chave pública legal

  • CA intermediária: a maioria das CAs não assina diretamente o certificado do servidor, mas, em vez disso, assina uma CA intermediária e, em seguida, usa a CA intermediária para assinar o certificado do servidor. Dessa forma, o certificado raiz pode ser armazenado offline para garantir a segurança e, quando há um problema com o certificado intermediário, o certificado intermediário pode ser resignado com o certificado raiz.

  • Verificação de certificado: após o início do handshake HTTPS, o servidor enviará toda a cadeia de certificados ao cliente para verificação. O processo de verificação é encontrar essa cadeia de certificados. Para cada nó adjacente na cadeia, a chave pública do nível superior pode ser verificada para passar o certificado do nível inferior. O nó raiz da cadeia é o ponto de confiança do dispositivo.

configuração https

Servidor

  • O servidor gera um par de chaves pública e privada
  • Configurar https para servidor Tomcat
  • Certificado de exportação

Cliente

  • Integre o certificado no arquivo APK
  • Enviar solicitação de rede, obter certificado, ler dados do site https

API https

HttpsURLConnection

URL url = new URL("https://google.com");
 HttpsURLConnection urlConnection = url.openConnection(); 
 InputStream in = urlConnection.getInputStream();

SSLSocketFactory

private synchronized SSLSocketFactory getDefaultSSLSocketFactory() {
		try {
			SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, null, null);
			return defaultSslSocketFactory = sslContext.getSocketFactory(); 
		} catch (GeneralSecurityException e) {
			throw new AssertionError();
		 }
}

TrustManager

public interface X509TrustManager extends TrustManager {
		public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException;
		public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException;
		public X509Certificate[] getAcceptedIssuers(); 
}

Problema de certificado de verificação de https

SSLHandshakeException

  • A CA que emitiu o certificado do servidor é desconhecida
  • O certificado do servidor não é assinado pela CA, mas autoassinado
  • A configuração do servidor está sem um CA intermediário

Estratégia de confiança personalizada

// 取到证书的输入流
InputStream stream = getAssets().open(“server.crt");
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(null);
Certificate certificate =
         CertificateFactory.getInstance("X.509").generateCertificate(stream);
// 创建Keystore包含我们的证书 keystore.setCertificateEntry(“ca", certificate);
// 创建TrustManager,仅信任keyStore中的证书
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keyStore);
//用TrustManager初始化一个SSLContext
SSLContext context = SSLContext.getInstance("TLS");
 context.init(null, tmf.getTrustManagers(), null);
 URL url = new URL(path);
 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(context.getSocketFactory());
指示HttpsUrlConnection信任指定CA
InputStream in = urlConnection.getInputStream();

O uso seguro de HTTPS para desenvolvimento de segurança Android

Acho que você gosta

Origin blog.csdn.net/yanwenyuan0304/article/details/106376085
Recomendado
Clasificación