暗号化関数
これらの関数は、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.
例
入力が等しい場合、encrypt
と aes_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 からテーブルを再利用します。
クエリ:
結果:
では、すべてのデータを復号化してみましょう。
クエリ:
結果:
どのデータが正しく復号化されたか、そして残りがなぜ異常になるのかに注意してください。mode
、key
、または 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で以前に暗号化したデータを復号化してみましょう。
クエリ:
結果: