データの盗聴や改ざんを防ぐために、HTTPS または TLS プロトコルを通じてデータ送信を暗号化します。

著者: 禅とコンピュータープログラミングの芸術

1 はじめに

一文の要約

この記事では、HTTPS (HyperText Transfer Protocol Secure) プロトコルと TLS (Transport Layer Security) プロトコルを紹介し、SSL/TLS プロトコルにおける 2 つの役割を示し、例を通じてこれら 2 つのプロトコルを実装する方法を示します。

この記事の構成図

2. 背景の紹介

インターネットの急速な発展に伴い、ネットワークのセキュリティ問題に注目する人がますます増えています。ネットワーク通信プロトコルは、そのオープン性、信頼性、堅牢性により広く注目を集めていますが、多くのセキュリティ上の脆弱性もあります。たとえば、サードパーティの悪意のある攻撃、中間者攻撃、サービス拒否攻撃などです。これらのセキュリティ ホールに対応して、HTTP プロトコルは一連のセキュリティ対策を開発しました。HTTP プロトコルにおける最も重要なセキュリティ対策は、SSL/TLS プロトコルによる通信の暗号化です。HTTPS は、Hypertext Transfer Protocol Secure の略称で、暗号化通信に使用されるネットワーク セキュリティ プロトコルです。このプロトコルは、証明書の検証、データの整合性チェック、コンテンツの圧縮などを通じて、データ送信プロセスのセキュリティを保証します。現在、HTTPS はインターネット上で最も一般的に使用されているネットワーク セキュリティ プロトコルの 1 つになっています。さらに、HTTPS には、ドメイン名検証と中間者攻撃保護という 2 つの機能があります。

3. 基本的な概念と用語の説明

SSL (Secure Sockets Layer) および TLS (Transport Layer Security) プロトコル

  • SSL (Secure Socket Layer): Netscape によって開発された Secure Socket Layer (SSL) 標準です。標準化された SSL は、認証、データの整合性、暗号化、およびデータの機密性を提供します。1994 年 1 月 1 日、米国カリフォルニア州サンタクララで開催された Netscape Conference で正式に世界に公開されました。
  • TLS (Transport Layer Security): Transport Layer Security (TLS) は、IETF の RFC 2246 および RFC 4346 文書によって定義された暗号化プロトコル標準です。TLS は SSL v3 からアップグレードされ、より強力なセキュリティが提供されます。TLS は、記録プロトコルのバージョン、ユーザー認証、暗号スイートと圧縮方法の選択など、SSL よりも高度なセキュリティ サービスを提供します。2008 年 2 月、TLS は初めて PKI 証明書の認証を取得しました。

    HTTPSプロトコルの特性

    データ暗号化通信

    HTTPS では、送信されるデータが確実に暗号化されます。つまり、データはクライアントからサーバーへ暗号化され、サーバーからクライアントへも暗号化されます。HTTPS は対称暗号化を使用してデータを暗号化し、非対称暗号化を使用して HTTPS 接続を確立します。対称暗号化ではデータが暗号化され、復号化にキーが必要になります。非対称暗号化では、暗号化用と復号化用の 2 つのキーが使用されます。HTTPS はクライアント認証に公開キーを使用し、対称暗号化のためのキー交換に秘密キーを使用し、ハンドシェイク プロセスでは RSA または ECDHE 暗号スイートを使用します。

サーバー証明書の検証

HTTPS は、デジタル証明書を通じてサーバーの正当性を検証し、サーバーの ID が本物で有効であることを確認します。HTTPS 証明書は CA (認証局) によって発行され、CA はドメイン名、Web サイト名、Web サイトのアドレスなどを検証し、デジタル証明書を発行します。検証に合格すると、証明書のソースが信頼できることを証明する小さな鍵がブラウザーに表示されます。

コンテンツの圧縮

ページの読み込み速度を向上させるために、サーバーはリソース ファイルを圧縮することができ、ブラウザはサーバーから送信された圧縮ファイルを受信すると、自動的に解凍して表示します。ただし、圧縮率が低すぎると、ブラウジングエクスペリエンスに影響を与える可能性があります。HTTPS を使用すると、圧縮ファイルの使用帯域幅が減り、ダウンロードにかかる時間が短縮されるため、この問題は効果的に解決されます。

中間者攻撃を防ぐ

中間者攻撃とは、攻撃者がネットワーク上の場所を介してユーザーの要求を転送し、ユーザーの個人的な機密情報やデータを取得することを指します。中間者攻撃により、攻撃者は通信内容を改ざん、変更、挿入し、ユーザーの個人情報や銀行口座のパスワードなどを取得する可能性があります。HTTPS は、ハンドシェイク プロセス中に RSA または ECDHE 暗号スイートを使用して安全な通信チャネルを確立し、中間者攻撃に対抗します。

HTTPステータスコード

  • 2XX ステータス コードは 200 OK などの成功を表し、クライアントから送信されたリクエストが正常に処理され、クライアントが必要とするデータが取得されたことを意味します。
  • 3XX ステータス コードは、301 Moved Permanently などのリダイレクトを表し、要求されたリソースが新しい場所に永続的に移動されたことを示します。
  • 4XX ステータス コードは、要求されたファイルが存在しないことを意味する 404 Not Found などのクライアント エラーを表します。
  • 5XX ステータス コードは、500 Internal Server Error などのサーバー エラーを表します。これは、サーバーが予期しない状況に遭遇し、リクエストを完了できなかったことを意味します。

4. コアアルゴリズム原理、具体的な操作手順、数式の説明

対称暗号化

対称暗号化は、共有キー暗号化とも呼ばれ、暗号化と復号化に使用される同じキーを指します。対称暗号化では、データはアルゴリズムと同じキーを使用して暗号化され、キーを所有するエンティティのみが復号できる暗号文が生成されます。対称暗号化は、データ暗号化、検証、整合性テストなどのシナリオに適用できます。対称暗号化アルゴリズムとプロセスは次のとおりです。

  1. キーの生成 対称暗号化アルゴリズムでは、まずキーを生成する必要があります。これは十分に複雑であり、誰にも漏洩できないものでなければなりません。通常、対称暗号化アルゴリズムは乱数をキーとして使用し、キーの長さは通常 128 ビット、192 ビット、または 256 ビットです。

  2. 暗号化 暗号化プロセスには、エンコードと暗号化の 2 つのステップが含まれます。エンコードとは、生データを送信に適した情報形式に変換することを指します。暗号化とは、暗号化された情報をキーで暗号化することを指します。一般的に使用されるエンコード方法には、ASCII コードと Base64 エンコードが含まれます。一般的に使用される暗号化アルゴリズムには、AES、DES、RC4 などが含まれます。

  3. 復号化 復号化プロセスは、復号化とデコードという 2 つのステップで構成されます。復号化とは、キーを使用して暗号化された情報を復号化し、元のデータに復元することを指します。デコードとは、復号化した情報を元のデータに戻すことを指します。

  4. セキュリティ分析 対称暗号アルゴリズムの安全性は鍵の安全性に依存しており、鍵の漏洩は情報漏洩や復号失敗などの重大な事態につながる可能性があります。一般に、対称暗号化アルゴリズムのパフォーマンスは、キーのネゴシエーションが必要ないため、キーベースのアルゴリズムよりも優れており、そのためキー管理の難しさが軽減され、キー漏洩のリスクが軽減されます。

非対称暗号化

非対称暗号化は、公開キー暗号化、暗号化公開キー、暗号化秘密キーとも呼ばれ、暗号化と復号化に異なるキーを使用することを指します。非対称暗号化では、公開キーと秘密キーがペアで表示され、それぞれメッセージの暗号化と復号化に使用されます。秘密キーを持つエンティティのみがデータを復号化できます。非対称暗号化は、対称暗号化のキー ネゴシエーション プロセスで使用でき、デジタル署名や認証局などのシナリオでも使用できます。非対称暗号化アルゴリズムとプロセスは次のとおりです。

  1. キー ペアの生成 非対称暗号化アルゴリズムでは、まずキー ペアのセット、公開キーと秘密キーを生成する必要があります。公開キーはデータの暗号化に使用され、秘密キーはデータの復号化に使用されます。公開キーはデータの暗号化のみが可能ですが、データの復号化はできません。また、秘密キーはデータの復号化のみが可能ですが、データの暗号化はできません。通常、キー ペアには、同じ長さの 2 つの大きな素数の積が含まれます。たとえば、RSA キー ペアは、2 つの 1024 ビットの大きな素数の積によって生成されます。

  2. 暗号化 暗号化プロセスには、エンコードと暗号化の 2 つのステップが含まれます。エンコードとは、生データを送信に適した情報形式に変換することを指します。暗号化とは、暗号化された情報を公開鍵を使用して暗号化することを指します。暗号化の結果は暗号文ですが、これは秘密キーでのみ復号化できます。一般的に使用されるエンコード方法には、ASCII コードと UTF-8 エンコードが含まれます。一般的に使用される暗号化アルゴリズムには、RSA、ECC (Elliptic Curve Cryptography、楕円曲線暗号化アルゴリズム) などが含まれます。

  3. 復号化 復号化プロセスは、復号化とデコードという 2 つのステップで構成されます。復号化とは、秘密キーを使用して暗号文を復号化し、元のデータに復元することを意味します。デコードとは、復号化した情報を元のデータに戻すことを指します。

  4. 鍵合意 鍵合意プロセスは、非対称暗号化アルゴリズムの重要な機能であり、両当事者が一貫した鍵をネゴシエートするために使用します。対称暗号化には共有キーが必要であるため、安全なチャネルを確立するにはキーの合意が重要です。一般的に使用される鍵合意プロトコルには、DH (Diffie-Hellman)、ECDH (Elliptic Curve Diffie-Hellman) などが含まれます。

  5. デジタル署名 デジタル署名は、非対称暗号化アルゴリズムの重要なアプリケーションです。ID 認証、情報の識別、データの整合性などのシナリオで使用できます。デジタル署名の基本プロセスは次のとおりです: メッセージは送信者の秘密キーを使用して暗号化されて受信者に送信され、受信者は自分の秘密キーを使用してメッセージを復号化し、メッセージが正しいかどうかを判断します。これにより、メッセージの送信者の身元が保証されます。一般的に使用されるデジタル署名アルゴリズムには、RSA、DSA (デジタル署名アルゴリズム)、ECC (楕円曲線デジタル署名アルゴリズム) などが含まれます。

握手協定

HTTPS プロトコルのハンドシェイク プロセスは、暗号化パラメータのネゴシエーションと安全なチャネルの確立の 2 つのステップに分かれています。ネゴシエートされた暗号化パラメータには、キー交換アルゴリズム、対称暗号化アルゴリズム、メッセージ認証コード アルゴリズムが含まれます。安全なチャネルの確立には、デジタル証明書の検証、ハンドシェイク プロトコルの確認、データ暗号化が含まれます。ハンドシェイク合意の詳細なプロセスは次のとおりです。

鍵交換アルゴリズム

ハンドシェイク プロトコルの最初のステップは鍵交換アルゴリズムです。これは、両当事者間でどの鍵を使用するかをネゴシエートすることを目的としています。一般的に使用される鍵交換アルゴリズムには、RSA、Diffie-Hellman などが含まれます。

メッセージ認証コードアルゴリズム

メッセージ認証コード アルゴリズムは、データの整合性を検証するために使用されます。メッセージ認証コード アルゴリズムは、実際には、受信者がデータの整合性を確認できるようにする署名メカニズムです。一般的に使用されるメッセージ認証コード アルゴリズムには、MD5、SHA-1 などが含まれます。

対称暗号化アルゴリズム

2 番目のステップは、対称暗号化アルゴリズムをネゴシエートすることです。対称暗号化アルゴリズムで使用されるキーをネゴシエートして、クライアントとサーバー間の対称暗号化通信を確立します。一般的に使用される対称暗号化アルゴリズムには、AES、DES、3DES、RC4、RC5、IDEA などが含まれます。

デジタル証明書の検証

3 番目のステップは、デジタル証明書の検証です。HTTPS では、通信のセキュリティを確保するために、すべての通信がデジタル証明書を経由する必要があります。デジタル証明書は、通信当事者の身元、申請者の正当な権利と利益を証明でき、データの暗号化にも使用できます。デジタル証明書は通常、認証局によって発行され、CA は申請者の名前、ID 番号、組織、登録住所などの関連情報を確認して、デジタル証明書を発行します。

握手同意の確認

4番目のステップは握手合意の確認です。ハンドシェイク プロトコルは、安全なチャネルの確立を確認します。つまり、クライアントとサーバーはハンドシェイクを完了して、暗号化された通信パスを確立します。ハンドシェイクプロトコルの方式にはメッセージ認証コードと暗号化通信があり、それぞれに長所と短所があります。

データ暗号化

HTTPS プロトコルの最後のステップはデータの暗号化です。データ暗号化とは、送信前に対称暗号化アルゴリズムを通じてデータを暗号化することを指します。データ暗号化のプロセスには、エンコード、暗号化、圧縮という 3 つのステップが含まれます。このうち、エンコードとは、元のデータを伝送に適した情報形式に変換することを指します。一般的に使用されるエンコード方法には、ASCII コードと Base64 エンコードが含まれます。暗号化とは、対称暗号化アルゴリズムを使用して、エンコードされた情報を暗号化することを指します。一般的に使用される暗号化アルゴリズムには、AES、DES、3DES、RC4、RC5、IDEA などが含まれます。圧縮とは、送信データのサイズを減らすために、エンコードおよび暗号化された情報を圧縮することを指します。

5. 具体的なコード例と説明

このセクションでは、例を使用して、HTTPS または TLS プロトコルを介してデータの安全な送信を実現する方法を示します。クライアントが HTTPS プロトコルを介してデータを送信することを希望しており、サーバーが独自に構成された SSL 証明書を使用していると仮定します。両方のコード例を以下に示します。

オプション 1: HTTPS プロトコルを介してデータを転送する

クライアントは Python 言語で記述され、Requests モジュールを通じて HTTPS リクエストを開始し、応答オブジェクト内の応答コンテンツを取得します。

import requests

url = "https://www.example.com"   # 目标网站URL
response = requests.get(url)      # 发起GET请求
print(response.content)           # 获取响应内容

解決策 2: TLS プロトコルを介してデータを送信する

クライアントは Java 言語で記述され、HttpClient を通じて HTTPS リクエストを開始し、SSLContext を設定して TLS プロトコルを指定し、応答オブジェクト内の応答コンテンツを取得します。

public static void main(String[] args) throws Exception {
    CloseableHttpClient httpClient = HttpClients.createDefault();

    // 设置SSL上下文
    SSLContext sslcontext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
        @Override
        public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            return true;    // 忽略证书信任策略
        }
    }).build();

    // 创建SSL连接
    SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslcontext);
    HttpHost targetHost = new HttpHost("www.example.com", 443, "https");

    // 执行请求
    RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5 * 1000).setConnectTimeout(5 * 1000).build();
    HttpPost httpPost = new HttpPost("/");
    HttpResponse response = httpClient.execute(targetHost, httpPost, null);

    // 获取响应内容
    BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));
    String inputLine;
    StringBuilder sb = new StringBuilder();
    while ((inputLine = br.readLine())!= null) {
        sb.append(inputLine);
    }
    br.close();
    System.out.println(sb.toString());

    // 关闭连接
    response.close();
    httpClient.close();
}

おすすめ

転載: blog.csdn.net/universsky2015/article/details/133066974