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
- Usar http, não fazer nenhuma criptografia, é equivalente a streaking, e os engenheiros juniores podem facilmente espionar todos os seus dados de negócios.
- 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
- 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();