メインコンテンツまでスキップ
メインコンテンツまでスキップ

暗号化関数

これらの関数は、AES(高度暗号化標準)アルゴリズムを使用してデータの暗号化と復号化を実装します。

キーの長さは暗号化モードによって異なります。 -128--196-、および -256- モードのそれぞれに対して、16、24、および32バイトです。

初期化ベクトルの長さは常に16バイトです(16バイトを超えるバイトは無視されます)。

これらの関数は、ClickHouse 21.1まで遅く動作することに注意してください。

encrypt

この関数は、次のモードを使用してデータを暗号化します:

  • aes-128-ecb、aes-192-ecb、aes-256-ecb
  • aes-128-cbc、aes-192-cbc、aes-256-cbc
  • aes-128-ofb、aes-192-ofb、aes-256-ofb
  • aes-128-gcm、aes-192-gcm、aes-256-gcm
  • aes-128-ctr、aes-192-ctr、aes-256-ctr
  • aes-128-cfb、aes-128-cfb1、aes-128-cfb8

構文

引数

  • mode — 暗号化モード。 String
  • plaintext — 暗号化する必要があるテキスト。 String
  • key — 暗号化キー。 String
  • iv — 初期化ベクトル。 -gcm モードでは必須、その他では任意。 String
  • aad — 追加の認証データ。暗号化されませんが、復号化に影響します。他のモードでは例外をスローします。 String

返される値

  • 暗号文のバイナリ文字列。 String

このテーブルを作成します:

クエリ:

いくつかのデータを挿入します(鍵やIVをデータベースに保存することは、暗号化の全体的な概念を損ねるため避けてください)。また、「ヒント」を保存することも安全ではなく、説明的な目的のためにのみ使用されます:

クエリ:

クエリ:

結果:

-gcm の例:

クエリ:

結果:

aes_encrypt_mysql

MySQLの暗号化と互換性があり、結果の暗号文は AES_DECRYPT 関数で復号化可能です。

同じ入力に対して encrypt と同じ暗号文を生成します。ただし、keyiv が通常必要とされる長さよりも長い場合、aes_encrypt_mysql はMySQLの aes_encrypt が行うことに従います:key を「折り畳み」、iv の余分なビットを無視します。

サポートされている暗号化モード:

  • aes-128-ecb、aes-192-ecb、aes-256-ecb
  • aes-128-cbc、aes-192-cbc、aes-256-cbc
  • aes-128-ofb、aes-192-ofb、aes-256-ofb

構文

引数

  • mode — 暗号化モード。 String
  • plaintext — 暗号化する必要があるテキスト。 String
  • key — 暗号化キー。モードによって要求される長さよりも長い場合、MySQL特有のキー折り畳みが行われます。 String
  • iv — 初期化ベクトル。オプション、最初の16バイトのみ考慮されます。 String

返される値

  • 暗号文のバイナリ文字列。 String

同じ入力が与えられた場合、encryptaes_encrypt_mysql は同じ暗号文を生成します:

クエリ:

結果:

しかし、keyiv が期待される以上の長さの場合、encrypt は失敗します:

クエリ:

結果:

一方、aes_encrypt_mysql はMySQL互換の出力を生成します:

クエリ:

結果:

長い IV を提供しても同じ結果が得られます。

クエリ:

結果:

これは、同じ入力でMySQLが生成したものとバイナリ的に等しいです:

decrypt

この関数は次のモードを使用して暗号文を平文に復号化します:

  • aes-128-ecb、aes-192-ecb、aes-256-ecb
  • aes-128-cbc、aes-192-cbc、aes-256-cbc
  • aes-128-ofb、aes-192-ofb、aes-256-ofb
  • aes-128-gcm、aes-192-gcm、aes-256-gcm
  • aes-128-ctr、aes-192-ctr、aes-256-ctr
  • aes-128-cfb、aes-128-cfb1、aes-128-cfb8

構文

引数

  • mode — 復号化モード。 String
  • ciphertext — 復号化が必要な暗号化テキスト。 String
  • key — 復号化キー。 String
  • iv — 初期化ベクトル。 -gcm モードでは必須、その他では任意。 String
  • aad — 追加の認証データ。この値が正しくない場合は復号化されません。-gcm モードでのみ機能し、他のモードでは例外が発生します。 String

返される値

  • 復号化された文字列。 String

encrypt からのテーブルを再利用します。

クエリ:

結果:

今、すべてのデータを復号化してみましょう。

クエリ:

結果:

データの一部だけが正常に復号化され、残りは意味不明になっていることに注意してください。これは、暗号化時の modekey、または iv が異なっていたためです。

tryDecrypt

decrypt に似ていますが、復号化が失敗した場合は NULL を返します。

user_id が一意のユーザー ID で、encrypted が暗号化された文字列フィールド、iv が復号化/暗号化用の初期ベクトルであるテーブルを作成します。ユーザーは自分の ID と暗号化されたフィールドを復号化するためのキーを知っていると仮定します:

いくつかのデータを挿入します:

クエリ:

結果:

aes_decrypt_mysql

MySQLの暗号化と互換性があり、 AES_ENCRYPT 関数で暗号化されたデータを復号化します。

同じ入力に対して decrypt と同じ平文を生成します。ただし、keyiv が通常必要とされる長さよりも長い場合、aes_decrypt_mysql はMySQLの aes_decrypt がすることに従います:key を「折り畳み」、iv の余分なビットを無視します。

サポートされる復号化モード:

  • aes-128-ecb、aes-192-ecb、aes-256-ecb
  • aes-128-cbc、aes-192-cbc、aes-256-cbc
  • aes-128-cfb128
  • aes-128-ofb、aes-192-ofb、aes-256-ofb

構文

引数

  • mode — 復号化モード。 String
  • ciphertext — 復号化する必要がある暗号化テキスト。 String
  • key — 復号化キー。 String
  • iv — 初期化ベクトル。オプション。 String

返される値

  • 復号化された文字列。 String

MySQLで以前に暗号化したデータを復号化しましょう:

クエリ:

結果: