Функции шифрования
Данные функции реализуют шифрование и расшифровку данных с помощью 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:
Запрос:
Результат: