対称暗号化
- 単一キーの暗号化、同じ暗号化および復号化キー
- 代表的なアルゴリズム:DES、3DES、AES、RC2、RC4
- 利点:高い暗号化と復号化の効率、シンプルなアルゴリズム、大量のデータの暗号化に適しています。
- 短所:複雑なキーのメンテナンス、リーク後のセキュリティがありません
非対称暗号化
- 非対称暗号化の公開鍵と秘密鍵。一方の鍵は暗号化に使用され、もう一方の鍵は復号化に使用されます。
- 代表的なアルゴリズム:RSA、ECC
- 利点:セキュリティが高く、秘密鍵を公開鍵から取得できず、ネットワーク送信シナリオに適応します
- 短所:暗号化効率が低い
HTTP / HTTPS
APPネットワークアプリケーションシナリオ
- httpを使用し、暗号化を行わないことはストリークと同等であり、ジュニアエンジニアはすべてのビジネスデータを簡単にスパイできます。
- httpを使用しますが、すべてのトラフィックはクライアントに埋め込まれたキーを使用してAESによって暗号化され、トラフィックは基本的に安全ですが、クライアントコードが逆コンパイルされてキーが盗まれると、ストリーク状態になります
- 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();