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

暗号化関数

これらの関数は、AES(Advanced Encryption Standard)アルゴリズムを用いてデータの暗号化と復号化を実装します。

キーの長さは暗号化モードによって異なります。-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 — 追加の認証データ。暗号化されませんが、復号化に影響します。-gcm モードでのみ機能し、その他のモードでは例外をスローします。 String.

返される値

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

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

クエリ:

データを挿入します(この鍵/ ivをデータベースに保存することは安全ではありません)。また、「ヒント」を保存することも安全ではなく、説明目的のみで使用されます:

クエリ:

クエリ:

結果:

-gcm を使用した例:

クエリ:

結果:

aes_encrypt_mysql

MySQLの暗号化と互換性があり、暗号文は AES_DECRYPT 関数で復号化できます。

同じ入力に対して encrypt と同じ暗号文を生成します。しかし、key または iv が通常の長さを超える場合、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 は同じ暗号文を生成します:

クエリ:

結果:

しかし、key または iv が予想より長い場合、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 と同じ平文を生成します。しかし、key または iv が通常の長さを超える場合、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で以前に暗号化したデータを復号化してみましょう。

クエリ:

結果: