データ暗号化

Estimated reading time: 1 minute

モジュールの概要

このセクションは、REST API 暗号化モジュールを使った暗号化システムの概要です。 暗号化 API を実装するには、以下の仕様に基づいてモジュールを使用します。

暗号化モジュールは、安全な通信のための暗号化/復号化機能を提供します。

  • このシステムは、標準の 2048/1024 ビット RSA RFC 3447 external link および 128 ビット AES-CBC アルゴリズム RFC 3602 external link によって、安全に通信する必要がある文字列パラメータを暗号化および復号化します。

  • このシステムは通信全体を暗号化せず、特定のパラメータのみを暗号化します。これは、JSON プロトコルに関する通常の通信と同じ方法で通信が行われることを意味します。
  • このシステムは通信の傍受を防ぐためのものであり、不正アクセスやなりすましを防ぐものではありません。

暗号化フロー

次の図に暗号化フローを示します。

この暗号化システムは、公開鍵と共通鍵を使用したハイブリッド方式です。秘密データは AES 共通鍵によって暗号化され、RSA 公開鍵はクライアントとサーバーの間で安全に共通鍵を共有するために使用されます。サーバーは、初期化中に RSA 公開鍵/秘密鍵を生成します。クライアントは RSA 公開鍵を受け取り、AES 共通鍵を生成して RSA 公開鍵で暗号化します。初期化後、クライアントは両方の鍵を使用して暗号化データを送受信できます。

クライアントは、メッセージ毎に異なる初期化ベクトル (IV) を生成してください。

暗号化を使用する API は、暗号化されたデータと暗号化された鍵のパラメータを持ちます。暗号化された API がクライアントによって呼び出されると、サーバーはサーバーによって生成された RSA 秘密鍵を使用して共通鍵を復号化し、その共通鍵を使用してデータを復号化します。

サーバーから秘密データを受信するフローは、次の図のようになっています。

初期化プロセスは同じです。どちらの場合も、公開鍵を使用しても、暗号化データと暗号化鍵は通信されます。 たとえそれらが傍受されたとしても、第三者は元のデータを入手することはできません。

API の定義

暗号化サービスのgetPubicKey API は、この暗号化システムに共通の API です。

暗号化されたパラメータを送信または取得する他の API には、「encKey」要素と少なくとも 1 つの暗号化データ要素を持ちます。API に複数の暗号化要素がある場合、共有の「encKey」を “params” に含める必要があります。

JSON の例: send

{
    "method":"sendSecretData",
    "params":[
        {
            "secretData1":"G9KgQDustrxplKFcy9fnVQ==",
            "secretData2":"At2gQDgst6xplKFcy9fnVQ==",
            "encKey":"hCkxUu4WydqDwrlq+PsSSxBaIVbPFNeCU7XYgBC9bVmXvcTORXMdY5FeSr3LYu9WywFbh1WwTBW/S+xTPHZQXhQMUsWEFQwUSldm5xK8vhOcdzGe8kdrixAL6zL9qx6rioR95gF50FO1RRVS7jdsabPvHK5gXZHM9B2h24QKON1FeTkYVGKcf8J3JJp9gEWeNYG2bfMSvnS9qrn2bLXgAX71vwEz7Btm/+qmX7/nsrL5QGBdbgxUlK7q5JzZxOdDuh592lfdEoMIgFR144XAnhfqyCcuZLJ/60VjOpREQ17vTj6+NNVrSOIq4eHnBlB7SfFWM/CBa+rCFmYAzmm3VQ=="
        }
    ],
    "id":1,
    "version":"1.0"
}
{
    "result":[],
    "id":1
}

JSON の例: get

{
    "method":"getSecretData",
    "params":[
        {
            "encKey":"hCkxUu4WydqDwrlq+PsSSxBaIVbPFNeCU7XYgBC9bVmXvcTORXMdY5FeSr3LYu9WywFbh1WwTBW/S+xTPHZQXhQMUsWEFQwUSldm5xK8vhOcdzGe8kdrixAL6zL9qx6rioR95gF50FO1RRVS7jdsabPvHK5gXZHM9B2h24QKON1FeTkYVGKcf8J3JJp9gEWeNYG2bfMSvnS9qrn2bLXgAX71vwEz7Btm/+qmX7/nsrL5QGBdbgxUlK7q5JzZxOdDuh592lfdEoMIgFR144XAnhfqyCcuZLJ/60VjOpREQ17vTj6+NNVrSOIq4eHnBlB7SfFWM/CBa+rCFmYAzmm3VQ=="
        }
    ],
    "id":1,
    "version":"1.0"
}
{
    "result":[
        {
           "secretData":"G9KgQDustrxplKFcy9fnVQ=="
        }
    ],
    "id":1
}

実装ガイド

サーバーは、初期化中に RSA 公開/秘密鍵ペアを生成します。サイズの大きな RSA 鍵の生成には時間がかかる為、各システムのポリシーに基づいて RSA 鍵のビットサイズと管理方法をサーバーで設定します。初期化中に、クライアントは getPublicKey を呼び出してサーバーの公開鍵を取得し、暗号化して「encKey」にする共通鍵を作成します。その後、クライアントはこれらの鍵を使用して暗号化 API を呼び出します。

サーバーの秘密鍵とクライアントの公開鍵の整合性を維持するため、サーバーは初期化後に鍵を変更しないでください。クライアントは異なる API 呼び出しで同じ共通鍵を使用できます。また、必要に応じて、クライアントは共通鍵と「encKey」を再作成してセキュリティを向上させることができます。

鍵の不整合などの不正な状態が原因で、暗号化モジュールが暗号化または復号化に失敗した場合、サーバーは 40002 Encryption Failed エラーを返します。クライアントがこのエラーを受け取った場合、クライアントは初期化手順に戻ります。

暗号鍵のサイズは各システムで定義できます。安全性を考慮した鍵のサイズを使用してください。

参考情報

  1. IETF RFC 3447, Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1
    http://www.ietf.org/rfc/rfc3447.txt
  2. IETF RFC 3602, The AES-CBC Cipher Algorithm and Its Use with IPsec
    http://www.ietf.org/rfc/rfc3602.txt
Last modified: 26 Dec 2019