Функции шифрования
Данные функции реализуют шифрование и расшифровку данных с помощью AES (Advanced Encryption Standard) алгоритма.
Длина ключа зависит от режима шифрования. Он может быть длинной в 16, 24 и 32 байта для режимов шифрования -128-
, -196-
и -256-
соответственно.
Длина инициализирующего вектора всегда 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
Синтаксис
Аргументы
mode
— режим шифрования. String.plaintext
— текст, который будет зашифрован. String.key
— ключ шифрования. String.iv
— инициализирующий вектор. Обязателен для-gcm
режимов, для остальных режимов необязателен. String.aad
— дополнительные аутентифицированные данные. Не шифруются, но влияют на расшифровку. Параметр работает только с-gcm
режимами. Для остальных вызовет исключение. String.
Возвращаемое значение
- Бинарная зашифрованная строка. String.
Примеры
Создадим такую таблицу:
Запрос:
Вставим некоторые данные (замечание: не храните ключи или инициализирующие векторы в базе данных, так как это компрометирует всю концепцию шифрования), также хранение "подсказок" небезопасно и используется только для наглядности:
Запрос:
Запрос:
Результат:
Пример в режиме -gcm
:
Запрос:
Результат:
aes_encrypt_mysql
Совместима с шифрованием mysql, результат может быть расшифрован функцией AES_DECRYPT.
При одинаковых входящих значениях зашифрованный текст будет совпадать с результатом, возвращаемым функцией encrypt
. Однако если key
или iv
длиннее, чем должны быть, aes_encrypt_mysql
будет работать аналогично функции aes_encrypt
в MySQL: свернет ключ и проигнорирует лишнюю часть 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
совпадают.
Запрос:
Результат:
Функция encrypt
генерирует исключение, если key
или iv
длиннее чем нужно:
Запрос:
Результат:
Однако функция 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-cfb128
- 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
Синтаксис
Аргументы
mode
— режим шифрования. String.ciphertext
— зашифрованный текст, который будет расшифрован. String.key
— ключ шифрования. String.iv
— инициализирующий вектор. Обязателен для-gcm
режимов, для остальных режимов опциональный. String.aad
— дополнительные аутентифицированные данные. Текст не будет расшифрован, если это значение неверно. Работает только с-gcm
режимами. Для остальных вызовет исключение. String.
Возвращаемое значение
- Расшифрованная строка. String.
Примеры
Рассмотрим таблицу из примера для функции encrypt.
Запрос:
Результат:
Теперь попытаемся расшифровать эти данные:
Запрос:
Результат:
Обратите внимание, что только часть данных была расшифрована верно. Оставшаяся часть расшифрована некорректно, так как при шифровании использовались другие значения mode
, key
, или iv
.
aes_decrypt_mysql
Совместима с шифрованием mysql и может расшифровать данные, зашифрованные функцией AES_ENCRYPT.
При одинаковых входящих значениях расшифрованный текст будет совпадать с результатом, возвращаемым функцией decrypt
. Однако если key
или iv
длиннее, чем должны быть, aes_decrypt_mysql
будет работать аналогично функции aes_decrypt
в MySQL: свернет ключ и проигнорирует лишнюю часть 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:
Запрос:
Результат: