メインコンテンツへスキップ
これらの関数は、AES (Advanced Encryption Standard) アルゴリズムによるデータの暗号化と復号を行います。 鍵の長さは暗号化モードによって異なり、-128--196--256- モードではそれぞれ 162432 バイトです。 初期化ベクトルの長さは常に 16 バイトです (16 バイトを超える部分は無視されます) 。

HMAC

導入バージョン: v25.12.0 指定したハッシュアルゴリズムと秘密鍵を使用して、指定したメッセージの HMAC (Hash-based Message Authentication Code) を計算します。 対応しているハッシュアルゴリズム:
  • blake2b512
  • blake2s256
  • md4
  • md5
  • md5-sha1
  • mdc2
  • ripemd (別名: RIPEMD160, ripemd)
  • ripemd160
  • rmd160 (別名: RIPEMD160, rmd160)
  • sha1
  • sha224
  • sha256
  • sha3-224
  • sha3-256
  • sha3-384
  • sha3-512
  • sha384
  • sha512
  • sha512-224
  • sha512-256
  • shake128
  • shake256
  • sm3
  • ssl3-md5 (別名: MD5, ssl3-md5)
  • ssl3-sha1 (別名: SHA1, ssl3-sha1)
  • whirlpool
構文
HMAC(mode, message, key)
引数
  • mode — ハッシュアルゴリズム名 (大文字と小文字は区別されません) 。対応: md5, sha1, sha224, sha256, sha384, sha512。String
  • message — 認証対象のメッセージ。String
  • key — HMAC の秘密鍵。String
戻り値 HMAC ダイジェストを含むバイナリ文字列を返します。String 基本的な HMAC-SHA256
Query
SELECT hex(HMAC('sha256', 'The quick brown fox jumps over the lazy dog', 'secret_key'));
Response
┌─hex(HMAC('sha256', 'The quick brown fox jumps over the lazy dog', 'secret_key'))─┐
│ 31FD15FA0F61FD40DC09D919D4AA5B4141A0B27C1D51E74A6789A890AAAA187C                 │
└──────────────────────────────────────────────────────────────────────────────────┘
さまざまなハッシュアルゴリズム
Query
SELECT
    hex(HMAC('md5', 'message', 'key')) AS hmac_md5,
    hex(HMAC('sha1', 'message', 'key')) AS hmac_sha1,
    hex(HMAC('sha256', 'message', 'key')) AS hmac_sha256;
Response
┌─hmac_md5─────────────────────────┬─hmac_sha1────────────────────────────────┬─hmac_sha256──────────────────────────────────────────────────────┐
│ 4E4748E62B463521F6775FBF921234B5 │ 2088DF74D5F2146B48146CAF4965377E9D0BE3A4 │ 6E9EF29B75FFFC5B7ABAE527D58FDADB2FE42E7219011976917343065F58ED4A │
└──────────────────────────────────┴──────────────────────────────────────────┴──────────────────────────────────────────────────────────────────┘
大文字と小文字を区別しないモード
Query
SELECT
    hmac('SHA256', 'message', 'key') = HMAC('sha256', 'message', 'key') AS same_result,
    HMAC('SHA256', 'message', 'key') = Hmac('Sha256', 'message', 'key') AS also_same;
Response
┌─same_result─┬─also_same─┐
│           1 │         1 │
└─────────────┴───────────┘

aes_decrypt_mysql

導入バージョン: v20.12.0 MySQL の AES_ENCRYPT 関数で暗号化されたデータを復号します。 同じ入力に対して、decrypt と同じ平文を生成します。 key または iv が通常より長い場合、aes_decrypt_mysql は MySQL の aes_decrypt と同様に、key を「fold」し、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
構文
aes_decrypt_mysql(mode, ciphertext, key[, iv])
引数
  • mode — 復号モード。 String
  • ciphertext — 復号する暗号文。 String
  • key — 復号キー。 String
  • iv — 任意。初期化ベクトル。 String
戻り値 復号された文字列を返します。 String MySQL データを復号する
Query
-- MySQLで以前に暗号化したデータを復号してみましょう:
mysql> SET  block_encryption_mode='aes-256-ofb';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT aes_encrypt('Secret', '123456789101213141516171819202122', 'iviviviviviviviv123456') as ciphertext;
+------------------------+
| ciphertext             |
+------------------------+
| 0x24E9E4966469         |
+------------------------+
1 row in set (0.00 sec)

SELECT aes_decrypt_mysql('aes-256-ofb', unhex('24E9E4966469'), '123456789101213141516171819202122', 'iviviviviviviviv123456') AS plaintext
Response
┌─plaintext─┐
│ Secret    │
└───────────┘

aes_encrypt_mysql

導入バージョン: v20.12.0 MySQL の AES_ENCRYPT 関数と同じ方法でテキストを暗号化します。 生成された暗号文は、MySQL の AES_DECRYPT 関数で復号できます。 同じ入力に対しては、encrypt 関数と同じ暗号文を生成します。 key または iv が通常の想定より長い場合、aes_encrypt_mysql は MySQL の aes_encrypt と同様に動作し、key は「fold」され、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
構文
aes_encrypt_mysql(mode, plaintext, key[, iv])
引数
  • mode — 暗号化モード。String
  • plaintext — 暗号化する平文。String
  • key — 暗号化キー。mode で必要とされる長さより長い場合は、MySQL 固有のキーの折りたたみが行われます。String
  • iv — 任意。初期化ベクトル。最初の 16 バイトのみが使用されます。String
戻り値 暗号文のバイナリ文字列。String 同じ入力の比較
Query
-- 同じ入力を与えた場合、encrypt と aes_encrypt_mysql は同じ暗号文を生成します:
SELECT encrypt('aes-256-ofb', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv') = aes_encrypt_mysql('aes-256-ofb', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv') AS ciphertexts_equal;
Response
┌─ciphertexts_equal─┐
│                 1 │
└───────────────────┘
キーが長いと暗号化に失敗する
Query
-- しかし、keyまたはivが期待される長さより長い場合、encryptは失敗する:
SELECT encrypt('aes-256-ofb', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123');
Response
Received exception from server (version 22.6.1):
Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Invalid key size: 33 expected 32: While processing encrypt('aes-256-ofb', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123').
MySQLとの互換性
Query
-- aes_encrypt_mysql はMySQL互換の出力を生成します:
SELECT hex(aes_encrypt_mysql('aes-256-ofb', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123')) AS ciphertext;
Response
┌─ciphertext───┐
│ 24E9E4966469 │
└──────────────┘
IVが長くても結果は同じです
Query
-- さらに長いIVを指定しても同じ結果になることに注目してください
SELECT hex(aes_encrypt_mysql('aes-256-ofb', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123456')) AS ciphertext
Response
┌─ciphertext───┐
│ 24E9E4966469 │
└──────────────┘

decrypt

導入バージョン: v20.12.0 この関数は、次のモードを使用して、AES で暗号化されたバイナリ文字列を復号します。
  • 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
構文
decrypt(mode, ciphertext, key[, iv, aad])
引数
  • mode — 復号モード。String
  • ciphertext — 復号する暗号文。String
  • key — 復号キー。String
  • iv — 初期化ベクトル。-gcm モードでは必須で、それ以外では任意です。String
  • aad — 追加認証データ。この値が正しくないと復号できません。-gcm モードでのみ使用でき、それ以外では例外が発生します。String
戻り値 復号された平文を返します。String 暗号化されたデータを正しく復号する
Query
-- encrypt 関数の例で使用したテーブルを再利用する
SELECT comment, hex(secret) FROM encryption_test;
Response
┌─comment──────────────┬─hex(secret)──────────────────────────────────┐
│ aes-256-gcm          │ A8A3CCBC6426CFEEB60E4EAE03D3E94204C1B09E0254 │
│ aes-256-gcm with AAD │ A8A3CCBC6426D9A1017A0A932322F1852260A4AD6837 │
└──────────────────────┴──────────────────────────────────────────────┘
┌─comment──────────────────────────┬─hex(secret)──────────────────────┐
│ aes-256-ofb no IV                │ B4972BDC4459                     │
│ aes-256-ofb no IV, different key │ 2FF57C092DC9                     │
│ aes-256-ofb with IV              │ 5E6CB398F653                     │
│ aes-256-cbc no IV                │ 1BC0629A92450D9E73A00E7D02CF4142 │
└──────────────────────────────────┴──────────────────────────────────┘
暗号化されたデータを正しく復号できない
Query
SELECT comment, decrypt('aes-256-cfb128', secret, '12345678910121314151617181920212') AS plaintext FROM encryption_test
Response
-- `mode`、`key`、または `iv` が暗号化時と異なっていたため、データの一部のみが正しく復号され、残りは文字化けしていることに注目してください。
┌─comment──────────────┬─plaintext──┐
│ aes-256-gcm          │ OQ�E
                             �t�7T�\���\�   │
│ aes-256-gcm with AAD │ OQ�E
                             �\��si����;�o�� │
└──────────────────────┴────────────┘
┌─comment──────────────────────────┬─plaintext─┐
│ aes-256-ofb no IV                │ Secret    │
│ aes-256-ofb no IV, different key │ �4�
                                        �         │
│ aes-256-ofb with IV              │ ���6�~        │
│aes-256-cbc no IV                │ �2*4�h3c�4w��@
└──────────────────────────────────┴───────────┘

encrypt

導入バージョン: v20.12.0 AES の次のいずれかのモードを使用して、平文を暗号文に暗号化します。
  • 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
構文
encrypt(mode, plaintext, key[, iv, aad])
引数
  • mode — 暗号化モード。String
  • plaintext — 暗号化する平文。String
  • key — 暗号化キー。String
  • iv — 初期化ベクトル。-gcm モードでは必須で、それ以外では任意です。String
  • aad — 追加認証データ。これは暗号化されませんが、復号に影響します。-gcm モードでのみ機能し、それ以外では例外がスローされます。String
戻り値 バイナリ文字列の暗号文を返します。String 暗号化の例
Query
CREATE TABLE encryption_test
(
    `comment` String,
    `secret` String
)
ENGINE = MergeTree;

INSERT INTO encryption_test VALUES
('aes-256-ofb no IV', encrypt('aes-256-ofb', 'Secret', '12345678910121314151617181920212')),
('aes-256-ofb no IV, different key', encrypt('aes-256-ofb', 'Secret', 'keykeykeykeykeykeykeykeykeykeyke')),
('aes-256-ofb with IV', encrypt('aes-256-ofb', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv')),
('aes-256-cbc no IV', encrypt('aes-256-cbc', 'Secret', '12345678910121314151617181920212'));

SELECT comment, hex(secret) FROM encryption_test;
Response
┌─comment──────────────────────────┬─hex(secret)──────────────────────┐
│ aes-256-ofb no IV                │ B4972BDC4459                     │
│ aes-256-ofb no IV, different key │ 2FF57C092DC9                     │
│ aes-256-ofb with IV              │ 5E6CB398F653                     │
│ aes-256-cbc no IV                │ 1BC0629A92450D9E73A00E7D02CF4142 │
└──────────────────────────────────┴──────────────────────────────────┘
GCMモードの例
Query
INSERT INTO encryption_test VALUES
('aes-256-gcm', encrypt('aes-256-gcm', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv')),

('aes-256-gcm with AAD', encrypt('aes-256-gcm', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv', 'aad'));

SELECT comment, hex(secret) FROM encryption_test WHERE comment LIKE '%gcm%';
Response
┌─comment──────────────┬─hex(secret)──────────────────────────────────┐
│ aes-256-gcm          │ A8A3CCBC6426CFEEB60E4EAE03D3E94204C1B09E0254 │
│ aes-256-gcm with AAD │ A8A3CCBC6426D9A1017A0A932322F1852260A4AD6837 │
└──────────────────────┴──────────────────────────────────────────────┘

tryDecrypt

導入バージョン: v22.10.0 decrypt 関数と同様ですが、誤った秘密鍵を使用したために復号に失敗した場合は NULL を返します。 構文
tryDecrypt(mode, ciphertext, key[, iv, aad])
引数
  • mode — 復号モード。String
  • ciphertext — 復号対象の暗号文。String
  • key — 復号キー。String
  • iv — 任意。初期化ベクトル。-gcm モードでは必須で、その他のモードでは任意です。String
  • aad — 任意。追加認証データ。この値が正しくない場合、復号できません。-gcm モードでのみ機能し、その他のモードでは例外がスローされます。String
戻り値 復号された String を返します。復号に失敗した場合は NULL を返します。Nullable(String) テーブルを作成してデータを挿入
Query
-- user_id は一意のユーザー ID、encrypted は暗号化された文字列フィールド、iv は復号/暗号化のための初期ベクトルです。
-- ユーザーは自分の id と暗号化フィールドを復号するための鍵を知っていると仮定します:
CREATE TABLE decrypt_null
(
    dt DateTime,
    user_id UInt32,
    encrypted String,
    iv String
)
ENGINE = MergeTree;

-- データを挿入する:
INSERT INTO decrypt_null VALUES
('2022-08-02 00:00:00', 1, encrypt('aes-256-gcm', 'value1', 'keykeykeykeykeykeykeykeykeykey01', 'iv1'), 'iv1'),
('2022-09-02 00:00:00', 2, encrypt('aes-256-gcm', 'value2', 'keykeykeykeykeykeykeykeykeykey02', 'iv2'), 'iv2'),
('2022-09-02 00:00:01', 3, encrypt('aes-256-gcm', 'value3', 'keykeykeykeykeykeykeykeykeykey03', 'iv3'), 'iv3');

-- 1 つの鍵で復号を試みる
SELECT
    dt,
    user_id,
    tryDecrypt('aes-256-gcm', encrypted, 'keykeykeykeykeykeykeykeykeykey02', iv) AS value
FROM decrypt_null
ORDER BY user_id ASC
Response
┌──────────────────dt─┬─user_id─┬─value──┐
│ 2022-08-02 00:00:00 │       1 │ ᴺᵁᴸᴸ   │
│ 2022-09-02 00:00:00 │       2 │ value2 │
│ 2022-09-02 00:00:01 │       3 │ ᴺᵁᴸᴸ   │
└─────────────────────┴─────────┴────────┘
最終更新日 2026年6月10日