Spec-Zone.ru › MySQL 5.7

12.13 Функции шифрования и сжатия

Таблица 12.18 Функции шифрования

Таблица 12.18 Функции шифрования
Имя Описание Устарело
AES_DECRYPT() Дешифрование с использованием AES
AES_ENCRYPT() Шифрование с использованием AES
COMPRESS() Возвращает результат в виде двоичной строки
DECODE() Декодирование строки, зашифрованной с помощью ENCODE() Да
DES_DECRYPT() Дешифрование строки Да
DES_ENCRYPT() Шифрование строки Да
ENCODE() Кодирование строки Да
ENCRYPT() Шифрование строки Да
MD5() Вычисление контрольной суммы MD5
PASSWORD() Вычисление и возвращение строки пароля Да
RANDOM_BYTES() Возвращает случайный вектор байтов
SHA1(), SHA() Вычисление контрольной суммы SHA-1 (160 бит)
SHA2() Вычисление контрольной суммы SHA-2
UNCOMPRESS() Распаковка сжатой строки
UNCOMPRESSED_LENGTH() Возвращает длину строки до сжатия
VALIDATE_PASSWORD_STRENGTH() Определение силы пароля

Многие функции шифрования и сжатия возвращают строки, которые могут содержать произвольные байтовые значения. Если вы хотите сохранить эти результаты, используйте столбец с типом данных бинарной строки VARBINARY или BLOB. Это позволяет избежать потенциальных проблем с удалением хвостовых пробелов или преобразованием кодовой страницы, которые могут изменить значения данных, как это может произойти при использовании небинарного типа данных строки (CHAR, VARCHAR, TEXT).

Некоторые функции шифрования возвращают строки ASCII-символов: MD5(), PASSWORD(), SHA(), SHA1(), SHA2(). Их возвращаемое значение — строка с кодовой страницей и сортировкой, определяемыми системными переменными character_set_connection и collation_connection. Это небинарная строка, если кодовая страница не является binary.

Если приложение хранит значения из функции, такой как MD5() или SHA1(), которая возвращает строку шестнадцатеричных цифр, можно получить более эффективное хранение и сравнение, преобразовав шестнадцатеричное представление в двоичное с помощью UNHEX() и сохранив результат в столбце типа BINARY(N). Каждая пара шестнадцатеричных цифр требует одного байта в двоичной форме, поэтому значение N зависит от длины шестнадцатеричной строки. N составляет 16 для значения MD5() и 20 для значения SHA1(). Для SHA2(), N изменяется от 28 до 32 в зависимости от аргумента, определяющего желаемую длину результата в битах.

Накладные расходы на хранение шестнадцатеричной строки в столбце типа CHAR по меньшей мере вдвое больше, а до восьми раз больше, если значение хранится в столбце, использующем кодовую страницу utf8 (где каждый символ использует 4 байта). Хранение строки также приводит к более медленным сравнениям из-за больших значений и необходимости учитывать правила сортировки кодовой страницы.

Предположим, что приложение хранит значения строки MD5() в столбце типа CHAR(32):

CREATE TABLE md5_tbl (md5_val CHAR(32), ...);
INSERT INTO md5_tbl (md5_val, ...) VALUES(MD5('abcdef'), ...);

Для преобразования шестнадцатеричных строк в более компактную форму измените приложение на использование UNHEX() и BINARY(16) следующим образом:

CREATE TABLE md5_tbl (md5_val BINARY(16), ...);
INSERT INTO md5_tbl (md5_val, ...) VALUES(UNHEX(MD5('abcdef')), ...);

Приложения должны быть готовы к очень редкому случаю, когда функция хэширования генерирует одинаковое значение для двух разных входных значений. Один из способов обнаружить коллизии — сделать столбец хэша первичным ключом.

Примечание

Для алгоритмов MD5 и SHA-1 стали известны уязвимости. Возможно, стоит рассмотреть использование другой односторонней функции шифрования, описанной в этом разделе, например, SHA2().

Предупреждение

Пароли или другие конфиденциальные значения, используемые в качестве аргументов функций шифрования, отправляются на сервер MySQL как открытый текст, если не используется подключение SSL. Кроме того, такие значения отображаются в любом журнале MySQL, в который они записываются. Чтобы избежать таких утечек, приложения могут шифровать конфиденциальные значения на стороне клиента перед отправкой их на сервер. Те же соображения относятся к ключам шифрования. Чтобы избежать их раскрытия, приложения могут использовать хранимые процедуры для шифрования и дешифрования значений на стороне сервера.

  • AES_DECRYPT(crypt_str,key_str[,init_vector][,kdf_name][,salt][,info | iterations])

    Эта функция расшифровывает данные с помощью официального алгоритма AES (Advanced Encryption Standard). Дополнительную информацию см. в описании AES_ENCRYPT().

    Операторы, использующие AES_DECRYPT(), небезопасны для репликации на основе операторов.

  • AES_ENCRYPT(str,key_str[,init_vector][,kdf_name][,salt][,info | iterations])

    AES_ENCRYPT() и AES_DECRYPT() реализуют шифрование и дешифрование данных с помощью официального алгоритма AES (Advanced Encryption Standard), ранее известного как “Rijndael.” Стандарт AES допускает различные длины ключей. По умолчанию эти функции реализуют AES с длиной ключа 128 бит. Можно использовать длины ключей 196 или 256 бит, как описано ниже. Длина ключа — это компромисс между производительностью и безопасностью.

    AES_ENCRYPT() шифрует строку str с использованием строки ключа key_str и возвращает двоичную строку, содержащую зашифрованный вывод. AES_DECRYPT() расшифровывает зашифрованную строку crypt_str с использованием строки ключа key_str и возвращает исходную строку открытого текста. Если любой из аргументов функции равен NULL, функция возвращает NULL. Если AES_DECRYPT() обнаруживает недействительные данные или неверную заливку, она возвращает NULL. Однако AES_DECRYPT() может вернуть значение, отличное от NULL (возможно, мусор), если входные данные или ключ неверны.

    Начиная с MySQL 5.7.40, эти функции поддерживают использование функции вывода ключа (KDF) для создания криптографически защищённого секретного ключа из информации, переданной в key_str. Выведенный ключ используется для шифрования и дешифрования данных и хранится в экземпляре MySQL Server, и не доступен пользователям. Использование KDF настоятельно рекомендуется, так как оно обеспечивает лучшую безопасность, чем указание собственного предварительно созданного ключа или вывод его с помощью более простого метода, когда вы используете функцию. Функции поддерживают HKDF (доступный с OpenSSL 1.1.0), для которого можно указать необязательную соль и контекстно-специфическую информацию для включения в материал ключа, и PBKDF2 (доступный с OpenSSL 1.0.2), для которого можно указать необязательную соль и установить количество итераций, используемых для создания ключа.

    AES_ENCRYPT() и AES_DECRYPT() позволяют управлять режимом шифрования блоков. Переменная системы block_encryption_mode управляет режимом алгоритмов шифрования блоков. Её значение по умолчанию — aes-128-ecb, что означает шифрование с длиной ключа 128 бит и режимом ECB. Описание допустимых значений этой переменной см. в разделе 5.1.7 «Переменные системы сервера». Необязательный аргумент init_vector используется для предоставления вектора инициализации для режимов шифрования блоков, которые его требуют.

    Операторы, использующие AES_ENCRYPT() или AES_DECRYPT(), небезопасны для репликации на основе операторов.

    Если AES_ENCRYPT() вызывается из клиента mysql, двоичные строки отображаются с использованием шестнадцатеричного обозначения, в зависимости от значения --binary-as-hex. Дополнительную информацию об этом параметре см. в разделе 4.5.1 «mysql — Клиентская командная строка MySQL».

    Аргументы функций AES_ENCRYPT() и AES_DECRYPT() следующие:

  • str

    Строка для AES_ENCRYPT() для шифрования с использованием строки ключа key_str, или (начиная с MySQL 5.7.40) ключа, полученного из неё с помощью указанного KDF. Строка может быть любой длины. Заполнение автоматически добавляется к str, чтобы она была кратной блоку, как требуется блочными алгоритмами, такими как AES. Это заполнение автоматически удаляется функцией AES_DECRYPT().

    crypt_str

    Зашифрованная строка для AES_DECRYPT() для дешифрования с использованием строки ключа key_str, или (начиная с MySQL 5.7.40) ключа, полученного из неё с помощью указанного KDF. Строка может быть любой длины. Длина crypt_str может быть вычислена по длине исходной строки по следующей формуле:

    16 * (trunc(string_length / 16) + 1)
    
    key_str

    Ключ шифрования или входные криптографические данные, которые используются в качестве основы для вывода ключа с помощью функции вывода ключа (KDF). Для одного и того же набора данных используйте одно и то же значение key_str для шифрования с помощью AES_ENCRYPT() и дешифрования с помощью AES_DECRYPT().

    Если вы используете KDF, что возможно с MySQL 5.7.40, key_str может представлять собой любые произвольные данные, такие как пароль или пароль. В дополнительных аргументах функции вы указываете имя KDF, а затем добавляете дополнительные параметры для повышения безопасности, соответствующие KDF.

    При использовании KDF функция создаёт сильный криптографический секретный ключ из информации, переданной в key_str, и любого соли или дополнительной информации, которую вы предоставляете в других аргументах. Полученный ключ используется для шифрования и дешифрования данных, и он хранится в экземпляре MySQL Server и недоступен пользователям. Использование KDF настоятельно рекомендуется, поскольку оно обеспечивает лучшую безопасность, чем указание собственного предварительно созданного ключа или получение его более простым методом, как при использовании функции.

    Если вы не используете KDF, для длины ключа 128 бит самый безопасный способ передачи ключа в аргумент key_str — создать истинно случайное 128-битное значение и передать его как двоичное значение. Например:

    INSERT INTO t
    VALUES (1,AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));
    

    Пароль может быть использован для генерации ключа AES путём хеширования пароля. Например:

    INSERT INTO t
    VALUES (1,AES_ENCRYPT('text', UNHEX(SHA2('My secret passphrase',512))));
    

    Если длина ключа превысит максимальную длину 128 бит, возвращается предупреждение. Если вы не используете KDF, не передавайте пароль или пароль напрямую в key_str, сначала захешируйте его. Предыдущие версии этой документации предлагали первый подход, но он больше не рекомендуется, так как показанные здесь примеры более безопасны.

    init_vector

    Вектор инициализации для режимов блочного шифрования, которые его требуют. Переменная системы block_encryption_mode контролирует режим. Для одного и того же набора данных используйте одно и то же значение init_vector для шифрования с помощью AES_ENCRYPT() и дешифрования с помощью AES_DECRYPT().

    Примечание

    Если вы используете KDF, вы должны указать вектор инициализации или пустую строку для этого аргумента, чтобы получить доступ к последующим аргументам для определения KDF.

    Для режимов, требующих вектора инициализации, он должен составлять 16 байтов или более (байты сверх 16 игнорируются). Возникает ошибка, если init_vector отсутствует. Для режимов, не требующих вектора инициализации, он игнорируется, и генерируется предупреждение, если init_vector указан, если вы не используете KDF.

    Значение по умолчанию для переменной системы block_encryption_mode равно aes-128-ecb или режим ECB, который не требует вектора инициализации. В альтернативных разрешённых режимах блочного шифрования CBC, CFB1, CFB8, CFB128 и OFB требуется вектор инициализации.

    Случайную строку байтов для использования в качестве вектора инициализации можно получить, вызвав RANDOM_BYTES(16).

    kdf_name

    Название функции вывода ключа (KDF) для создания ключа из входных криптографических данных, переданных в key_str, и других аргументов, соответствующих KDF. Этот необязательный аргумент доступен начиная с MySQL 5.7.40.

    Для одного и того же набора данных используйте одно и то же значение kdf_name для шифрования с помощью AES_ENCRYPT() и дешифрования с помощью AES_DECRYPT(). Когда вы указываете kdf_name, вы должны указать init_vector, используя либо действительный вектор инициализации, либо пустую строку, если режим шифрования не требует вектора инициализации.

    Поддерживаются следующие значения:

    hkdf

    HKDF, доступный с OpenSSL 1.1.0. HKDF извлекает псевдослучайный ключ из криптографических данных, затем расширяет его в дополнительные ключи. С помощью HKDF вы можете указать необязательный соль (salt) и контекстно-специфическую информацию, такую как данные приложения (info), для включения в криптографические данные.

    pbkdf2_hmac

    PBKDF2, доступный с OpenSSL 1.0.2. PBKDF2 применяет псевдослучайную функцию к криптографическим данным и повторяет этот процесс большое количество раз для получения ключа. С помощью PBKDF2 вы можете указать необязательный соль (salt) для включения в криптографические данные и задать количество итераций, используемых для получения ключа (iterations).

    В этом примере в качестве функции вывода ключа задан HKDF, и указаны соль и контекстная информация. Аргумент для вектора инициализации включён, но является пустой строкой:

    SELECT AES_ENCRYPT('mytext','mykeystring', '', 'hkdf', 'salt', 'info');
    

    В этом примере в качестве функции вывода ключа задан PBKDF2, указан соль, и количество итераций удвоено относительно рекомендуемого минимума:

    SELECT AES_ENCRYPT('mytext','mykeystring', '', 'pbkdf2_hmac','salt', '2000');
    
    salt

    Соль, передаваемая функции вывода ключа (KDF). Этот необязательный аргумент доступен начиная с MySQL 5.7.40. И HKDF, и PBKDF2 могут использовать соли, и их использование рекомендуется для предотвращения атак, основанных на словарях общих паролей или радужных таблицах.

    Соль состоит из случайных данных, которые для обеспечения безопасности должны отличаться для каждой операции шифрования. Случайную строку байтов для использования в качестве соли можно получить, вызвав RANDOM_BYTES(). В этом примере генерируется 64-битная соль:

    SET @salt = RANDOM_BYTES(8);
    

    Для одного и того же набора данных используйте одно и то же значение salt для шифрования с помощью AES_ENCRYPT() и дешифрования с помощью AES_DECRYPT(). Соль можно безопасно хранить вместе с зашифрованными данными.

    info

    Контекстно-специфичная информация для HKDF для включения в криптографические данные, такие как информация об приложении. Этот необязательный аргумент доступен начиная с MySQL 5.7.40, когда вы указываете hkdf как имя KDF. HKDF добавляет эту информацию к криптографическим данным, указанным в key_str, и соли, указанной в salt, чтобы получить ключ.

    Для одного и того же набора данных используйте одно и то же значение info для шифрования с помощью AES_ENCRYPT() и дешифрования с помощью AES_DECRYPT().

    iterations

    Количество итераций для PBKDF2 для использования при получении ключа. Этот необязательный аргумент доступен начиная с MySQL 5.7.40, когда вы указываете pbkdf2_hmac как имя KDF. Более высокое значение обеспечивает большую устойчивость к атакам методом перебора, так как это требует от злоумышленника больших вычислительных затрат, но то же самое справедливо и для процесса вывода ключа. Если вы не указываете этот аргумент, значение по умолчанию составляет 1000, что является минимально рекомендуемым стандартом OpenSSL.

    Для одного и того же набора данных используйте одно и то же значение iterations для шифрования с помощью AES_ENCRYPT() и дешифрования с помощью AES_DECRYPT().

    mysql> SET block_encryption_mode = 'aes-256-cbc';
    mysql> SET @key_str = SHA2('My secret passphrase',512);
    mysql> SET @init_vector = RANDOM_BYTES(16);
    mysql> SET @crypt_str = AES_ENCRYPT('text',@key_str,@init_vector);
    mysql> SELECT AES_DECRYPT(@crypt_str,@key_str,@init_vector);
    +-----------------------------------------------+
    | AES_DECRYPT(@crypt_str,@key_str,@init_vector) |
    +-----------------------------------------------+
    | text                                          |
    +-----------------------------------------------+
    
  • COMPRESS(string_to_compress)

    Сжимает строку и возвращает результат в виде двоичной строки. Эта функция требует, чтобы MySQL был скомпилирован с библиотекой сжатия, такой как zlib. В противном случае возвращаемое значение всегда равно NULL. Сжатую строку можно разархивировать с помощью UNCOMPRESS().

    mysql> SELECT LENGTH(COMPRESS(REPEAT('a',1000)));
            -> 21
    mysql> SELECT LENGTH(COMPRESS(''));
            -> 0
    mysql> SELECT LENGTH(COMPRESS('a'));
            -> 13
    mysql> SELECT LENGTH(COMPRESS(REPEAT('a',16)));
            -> 15
    

    Содержимое сжатой строки хранится следующим образом:

    • Пустые строки хранятся как пустые строки.

    • Непустые строки хранятся как 4-байтовая длина нескомпрессированной строки (нижний байт первым), за которой следует сжатая строка. Если строка заканчивается пробелом, добавляется дополнительный . символ, чтобы избежать проблем с обрезкой конечного пробела, если результат будет сохранён в столбце типа CHAR или VARCHAR. (Однако, использование типов данных для строк, не являющихся двоичными, таких как CHAR или VARCHAR для хранения сжатых строк не рекомендуется, так как может произойти преобразование кодировки символов. Используйте двоичный столбец типа VARBINARY или BLOB вместо него.)

    Если COMPRESS() вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате в зависимости от значения параметра --binary-as-hex. Дополнительную информацию об этом параметре см. в Разделе 4.5.1, “mysql — The MySQL Command-Line Client”.

  • DECODE(crypt_str,pass_str)

    DECODE() дешифрует зашифрованную строку crypt_str, используя pass_str в качестве пароля. crypt_str должна быть строкой, возвращенной функцией ENCODE().

    Примечание

    Функции ENCODE() и DECODE() устарели в MySQL 5.7 и больше не должны использоваться. Ожидается, что они будут удалены в будущих версиях MySQL. Рассмотрите возможность использования AES_ENCRYPT() и AES_DECRYPT() вместо них.

  • DES_DECRYPT(crypt_str[,key_str])

    Расшифровывает строку, зашифрованную с помощью DES_ENCRYPT(). При возникновении ошибки эта функция возвращает NULL.

    Эта функция работает только в том случае, если MySQL настроен с поддержкой SSL. См. Раздел 6.3, “Использование защищенных соединений”.

    Если аргумент key_str не указан, DES_DECRYPT() проверяет первый байт зашифрованной строки, чтобы определить номер ключа DES, который использовался для шифрования исходной строки, а затем считывает ключ из файла ключей DES для расшифровки сообщения. Для этого пользователю необходимо иметь привилегию SUPER. Файл ключей можно указать с помощью параметра сервера --des-key-file.

    Если вы передаете этой функции аргумент key_str, эта строка используется в качестве ключа для расшифровки сообщения.

    Если аргумент crypt_str не выглядит как зашифрованная строка, MySQL возвращает переданный аргумент crypt_str.

    Примечание

    Функции DES_ENCRYPT() и DES_DECRYPT() устарели в MySQL 5.7, удалены в MySQL 8.0 и больше не должны использоваться. Рассмотрите возможность использования AES_ENCRYPT() и AES_DECRYPT() вместо них.

  • DES_ENCRYPT(str[,{key_num|key_str}])

    Шифрует строку с помощью заданного ключа с использованием алгоритма Triple-DES.

    Эта функция работает только в том случае, если MySQL настроен с поддержкой SSL. См. Раздел 6.3, “Использование защищенных соединений”.

    Ключ шифрования выбирается на основе второго аргумента функции DES_ENCRYPT(), если он был указан. Без аргумента используется первый ключ из файла ключей DES. С аргументом key_num используется ключ с номером (от 0 до 9) из файла ключей DES. С аргументом key_str используется заданная строка ключа для шифрования str.

    Файл ключей можно указать с помощью параметра сервера --des-key-file.

    Возвращаемая строка — это двоичная строка, где первый символ — CHAR(128 | key_num). При возникновении ошибки функция DES_ENCRYPT() возвращает NULL.

    128 добавляется для облегчения распознавания зашифрованного ключа. Если используется строковый ключ, key_num равно 127.

    Длина результата строки определяется по следующей формуле:

    new_len = orig_len + (8 - (orig_len % 8)) + 1
    

    Каждая строка в файле ключей DES имеет следующий формат:

    key_num des_key_str
    

    Каждое значение key_num должно быть числом в диапазоне от 0 до 9. Строки в файле могут быть в любом порядке. des_key_str — это строка, используемая для шифрования сообщения. Между числом и ключом должен быть по крайней мере один пробел. Первый ключ является значением по умолчанию, которое используется, если вы не указываете никакого аргумента ключа для DES_ENCRYPT().

    Вы можете указать MySQL на чтение новых значений ключей из файла ключей с помощью оператора FLUSH DES_KEY_FILE. Для этого требуется привилегия RELOAD.

    Одно преимущество наличия набора ключей по умолчанию заключается в том, что это предоставляет приложениям способ проверки существования зашифрованных значений столбцов без предоставления конечному пользователю права на их расшифровку.

    Примечание

    Функции DES_ENCRYPT() и DES_DECRYPT() устарели в MySQL 5.7, удалены в MySQL 8.0 и больше не должны использоваться. Рассмотрите возможность использования AES_ENCRYPT() и AES_DECRYPT() вместо них.

    mysql> SELECT customer_address FROM customer_table 
         > WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
    

    Если DES_ENCRYPT() вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате в зависимости от значения параметра --binary-as-hex. Дополнительную информацию об этом параметре см. в Разделе 4.5.1, “mysql — The MySQL Command-Line Client”.

  • ENCODE(str,pass_str)

    ENCODE() шифрует str с использованием pass_str в качестве пароля. Результатом является двоичная строка той же длины, что и str. Для расшифровки результата используйте DECODE().

    Примечание

    Функции ENCODE() и DECODE() устарели в MySQL 5.7 и больше не должны использоваться. Ожидается их удаление в будущих релизах MySQL.

    Если вам все еще нужно использовать ENCODE(), необходимо использовать с ней значение соли, чтобы уменьшить риск. Например:

    ENCODE('cleartext', CONCAT('my_random_salt','my_secret_password'))
    

    Каждое обновление пароля должно сопровождаться новым случайным значением соли.

    Если ENCODE() вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате в зависимости от значения параметра --binary-as-hex. Дополнительную информацию об этом параметре см. в разделе 4.5.1, «mysql — The MySQL Command-Line Client».

  • ENCRYPT(str[,salt])

    Шифрует str с использованием системного вызова Unix crypt() и возвращает двоичную строку. Аргумент salt должен быть строкой длиной не менее двух символов, иначе результатом является NULL. Если аргумент salt не указан, используется случайное значение.

    Примечание

    Функция ENCRYPT() устарела в MySQL 5.7, удалена в MySQL 8.0 и больше не должна использоваться. Для одностороннего хеширования рассмотрите использование SHA2() вместо нее.

    mysql> SELECT ENCRYPT('hello');
            -> 'VxuFAJXVARROc'
    

    ENCRYPT() игнорирует все символы в str, кроме первых восьми, по крайней мере, на некоторых системах. Это поведение определяется реализацией системного вызова crypt().

    Использование ENCRYPT() с многобайтовыми наборами символов ucs2, utf16, utf16le или utf32 не рекомендуется, так как системный вызов ожидает строку, завершающуюся нулевым байтом.

    Если системный вызов crypt() недоступен на вашей системе (как это происходит в Windows), ENCRYPT() всегда возвращает NULL.

    Если ENCRYPT() вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате в зависимости от значения параметра --binary-as-hex. Дополнительную информацию об этом параметре см. в разделе 4.5.1, «mysql — The MySQL Command-Line Client».

  • MD5(str)

    Вычисляет контрольную сумму MD5 длиной 128 бит для строки. Значение возвращается в виде строки из 32 шестнадцатеричных цифр или NULL, если аргумент был NULL. Возвращаемое значение, например, может использоваться в качестве ключа хеша. См. заметки в начале этого раздела о хранении хешей эффективно.

    Возвращаемое значение — строка в наборе символов соединения.

    mysql> SELECT MD5('testing');
            -> 'ae2b1fca515949e5d54fb22b8ed95575'
    

    Это “алгоритм MD5 Message-Digest, RSA Data Security, Inc.”

    См. примечание об алгоритме MD5 в начале этого раздела.

  • PASSWORD(str)

    Примечание

    Эта функция устарела в MySQL 5.7 и удалена в MySQL 8.0.

    Возвращает строку хешированного пароля, вычисленную из открытого пароля str. Возвращаемое значение — строка в наборе символов соединения или NULL, если аргумент NULL. Эта функция является SQL-интерфейсом к алгоритму, используемому сервером для шифрования паролей MySQL для хранения в таблице привилегий mysql.user.

    Системная переменная old_passwords управляет методом хеширования паролей, используемым функцией PASSWORD(). Она также влияет на хеширование паролей, выполняемое операторами CREATE USER и GRANT, которые указывают пароль с помощью клаузы IDENTIFIED BY.

    В следующей таблице показано допустимое значение old_passwords для каждого метода хеширования паролей и использующие его плагины аутентификации.

    Метод хеширования паролей Значение old_passwords Связанный плагин аутентификации
    Метод хеширования паролей MySQL 4.1 0 mysql_native_password
    Хеширование SHA-256 2 sha256_password

    Хеширование паролей SHA-256 (old_passwords=2) использует случайное значение соли, что делает результат функции PASSWORD() непредсказуемым. Вследствие этого операторы, использующие эту функцию, не подходят для репликации на основе операторов и не могут храниться в кэше запросов.

    Шифрование, выполняемое функцией PASSWORD(), одностороннее (необратимое), но не является тем же типом шифрования, что и для паролей Unix.

    Примечание

    PASSWORD() используется системой аутентификации в MySQL Server; вам не следует использовать её в собственных приложениях. Для этой цели рассмотрите более безопасную функцию, такую как SHA2(). Также см. RFC 2195, раздел 2 (Challenge-Response Authentication Mechanism (CRAM)) для получения дополнительной информации о безопасном обработке паролей и аутентификации в ваших приложениях.

    Внимание

    В некоторых случаях операторы, вызывающие PASSWORD(), могут регистрироваться в журнале сервера или на стороне клиента в файле истории, таком как ~/.mysql_history, что означает, что открытые пароли могут быть прочитаны любым пользователем, имеющим доступ к этой информации. Дополнительную информацию об условиях, при которых это происходит в журналах сервера, и о способах контроля, см. раздел 6.1.2.3, «Passwords and Logging». Аналогичная информация о регистрации на стороне клиента см. в разделе 4.5.1.3, «mysql Client Logging».

  • RANDOM_BYTES(len)

    Эта функция возвращает двоичную строку из len случайных байтов, сгенерированных с помощью генератора случайных чисел библиотеки SSL. Разрешённые значения len находятся в диапазоне от 1 до 1024. Для значений вне этого диапазона возникает ошибка.

    RANDOM_BYTES() может использоваться для предоставления вектора инициализации для функций AES_DECRYPT() и AES_ENCRYPT(). Для использования в этом контексте len должно быть не менее 16. Допускаются более крупные значения, но байты сверх 16 игнорируются.

    RANDOM_BYTES() генерирует случайное значение, что делает результат недетерминированным. Следовательно, утверждения, использующие эту функцию, небезопасны для репликации на основе утверждений и не могут храниться в кэше запросов.

    Если RANDOM_BYTES() вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате, в зависимости от значения параметра --binary-as-hex. Дополнительную информацию об этом параметре см. в Разделе 4.5.1, «mysql — The MySQL Command-Line Client».

  • SHA1(str), SHA(str)

    Вычисляет контрольную сумму SHA-1 длиной 160 бит для строки, как описано в RFC 3174 (Secure Hash Algorithm). Значение возвращается в виде строки из 40 шестнадцатеричных цифр или NULL, если аргумент был NULL. Одно из возможных применений этой функции — как хэш-ключ. См. примечания в начале этого раздела о хранении хэш-значений эффективно. SHA() является синонимом SHA1().

    Значение возврата — строка в кодировке набора символов соединения.

    mysql> SELECT SHA1('abc');
            -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
    

    SHA1() можно рассматривать как криптографически более безопасный аналог MD5(). Однако см. примечание относительно алгоритмов MD5 и SHA-1 в начале этого раздела.

  • SHA2(str, hash_length)

    Вычисляет семейство хэш-функций SHA-2 (SHA-224, SHA-256, SHA-384 и SHA-512). Первый аргумент — строка открытого текста, подлежащая хэшированию. Второй аргумент указывает желаемую длину результата в битах, которая должна иметь значение 224, 256, 384, 512 или 0 (что эквивалентно 256). Если любой из аргументов NULL или длина хэша не соответствует одному из разрешённых значений, возвращаемое значение — NULL. В противном случае результат функции — хэш-значение, содержащее необходимое количество битов. См. примечания в начале этого раздела о хранении хэш-значений эффективно.

    Значение возврата — строка в кодировке набора символов соединения.

    mysql> SELECT SHA2('abc', 224);
            -> '23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7'
    

    Эта функция работает только в том случае, если MySQL был сконфигурирован с поддержкой SSL. См. Раздел 6.3, «Использование защищённых соединений».

    SHA2() можно считать криптографически более безопасной, чем MD5() или SHA1().

  • UNCOMPRESS(string_to_uncompress)

    Распаковывает строку, сжатую функцией COMPRESS(). Если аргумент не является сжатым значением, результат — NULL. Для этой функции требуется, чтобы MySQL был скомпилирован с библиотекой сжатия, такой как zlib. В противном случае возвращаемое значение всегда NULL.

    mysql> SELECT UNCOMPRESS(COMPRESS('any string'));
            -> 'any string'
    mysql> SELECT UNCOMPRESS('any string');
            -> NULL
    
  • UNCOMPRESSED_LENGTH(compressed_string)

    Возвращает длину сжатой строки до сжатия.

    mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30)));
            -> 30
    
  • VALIDATE_PASSWORD_STRENGTH(str)

    Принимая на вход значение открытого пароля, эта функция возвращает целое число, указывающее, насколько надёжен пароль. Возвращаемое значение колеблется от 0 (слабый) до 100 (надёжный).

    Оценка пароля функцией VALIDATE_PASSWORD_STRENGTH() выполняется плагином validate_password. Если этот плагин не установлен, функция всегда возвращает 0. Для получения информации об установке validate_password см. Раздел 6.4.3, «Плагин проверки паролей». Для просмотра или настройки параметров, влияющих на тестирование паролей, проверьте или измените системные переменные, реализованные validate_password. См. Раздел 6.4.3.2, «Параметры и переменные плагина проверки паролей».

    Пароль подвергается всё более строгим тестам, и возвращаемое значение отражает пройденные тесты, как показано в следующей таблице. Кроме того, если системная переменная validate_password_check_user_name включена, и пароль совпадает с именем пользователя, VALIDATE_PASSWORD_STRENGTH() возвращает 0 независимо от того, как установлены другие системные переменные validate_password.

    Тест пароля Возвращаемое значение
    Длина < 4 0
    Длина ≥ 4 и < validate_password_length 25
    Удовлетворяет политике 1 (LOW) 50
    Удовлетворяет политике 2 (MEDIUM) 75
    Удовлетворяет политике 3 (STRONG) 100

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/encryption-functions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API