Skip to main content
Skip to main content
Edit this page

Функции шифрования

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

Запрос:

Результат: