Androidデータ送信暗号化

対称暗号化

  • 単一キーの暗号化、同じ暗号化および復号化キー
  • 代表的なアルゴリズム:DES、3DES、AES、RC2、RC4
  • 利点:高い暗号化と復号化の効率、シンプルなアルゴリズム、大量のデータの暗号化に適しています。
  • 短所:複雑なキーのメンテナンス、リーク後のセキュリティがありません

非対称暗号化

  • 非対称暗号化の公開鍵と秘密鍵。一方の鍵は暗号化に使用され、もう一方の鍵は復号化に使用されます。
  • 代表的なアルゴリズム:RSA、ECC
  • 利点:セキュリティが高く、秘密鍵を公開鍵から取得できず、ネットワーク送信シナリオに適応します
  • 短所:暗号化効率が低い

HTTP / HTTPS

HTTP / HTTPSリクエストとアンチキャプチャ

APPネットワークアプリケーションシナリオ

  1. httpを使用し、暗号化を行わないことはストリークと同等であり、ジュニアエンジニアはすべてのビジネスデータを簡単にスパイできます。
  2. httpを使用しますが、すべてのトラフィックはクライアントに埋め込まれたキーを使用してAESによって暗号化され、トラフィックは基本的に安全ですが、クライアントコードが逆コンパイルされてキーが盗まれると、ストリーク状態になります
  3. httpを使用しますが、AESで使用されるキーはGUIDモードでクライアントによって一時的に生成されます。キーをサーバーに安全に配信できるようにするには、暗号化にサーバーの公開キーを使用する必要があるため、サーバー証明書を埋め込む必要があり、証明書の有効期限が切れます。メカニズムが更新され、使用されている対称暗号化アルゴリズムを動的にネゴシエートできず、セキュリティに欠陥があります。

暗号化された伝送セキュリティの推奨事項

  • httpsを使用してみてください
  • クリアテキストでパスワードを送信しないでください
  • 改ざんを防ぐためにデータ署名を持参するように要求する
  • httpリクエストは一時キーを使用します
  • AESはCBCモードを使用します
  • 投稿は取得よりも安全ではありません。暗号化して署名する必要があります

https証明書の検証

  • CA(Certificate Authority)。CAは独自の秘密鍵を使用してデジタル証明書を発行し、デジタル証明書にはAの公開鍵が含まれています。次に、BはCAのルート証明書の公開鍵を使用して、CAによって発行された証明書を復号化し、それによって正当な公開鍵を取得できます。

  • 中間CA:ほとんどのCAはサーバー証明書に直接署名しませんが、代わりに中間CAに署名し、次に中間CAを使用してサーバー証明書に署名します。このようにして、ルート証明書をオフラインで保存してセキュリティを確保し、中間証明書に問題が発生した場合に、中間証明書をルート証明書で再署名することができます。

  • 証明書の検証:HTTPSハンドシェイクが開始された後、サーバーは検証のために証明書チェーン全体をクライアントに送信します。検証プロセスは、そのような証明書チェーンを見つけることです。チェーン内の隣接するノードごとに、上位レベルの公開キーを検証して、下位レベルの証明書を渡すことができます。チェーンのルートノードは、デバイスの信頼のアンカーポイントです。

https構成

サーバ

  • サーバーは公開鍵と秘密鍵のペアを生成します
  • Tomcatサーバーのhttpsを構成する
  • 証明書のエクスポート

クライアント

  • 証明書をAPKファイルに統合します
  • ネットワークリクエストの送信、証明書の取得、httpsWebサイトのデータの読み取り

https API

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(); 
}

https検証証明書の問題

SSLHandshakeException

  • サーバー証明書を発行したCAは不明です
  • サーバー証明書はCAによって署名されていませんが、自己署名されています
  • サーバー構成に中間CAがありません

カスタム信頼戦略

// 取到证书的输入流
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();

Androidセキュリティ開発のためのHTTPSの安全な使用

おすすめ

転載: blog.csdn.net/yanwenyuan0304/article/details/106376085