12.13 Функции шифрования и сжатия
Таблица 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 | +-----------------------------------------------+-
-
Сжимает строку и возвращает результат в виде двоичной строки. Эта функция требует, чтобы 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в качестве пароля.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_numdes_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в качестве пароля. Результатом является двоичная строка той же длины, что и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». -
Шифрует
strс использованием системного вызова Unixcrypt()и возвращает двоичную строку. Аргумент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 длиной 128 бит для строки. Значение возвращается в виде строки из 32 шестнадцатеричных цифр или
NULL, если аргумент былNULL. Возвращаемое значение, например, может использоваться в качестве ключа хеша. См. заметки в начале этого раздела о хранении хешей эффективно.Возвращаемое значение — строка в наборе символов соединения.
mysql>
SELECT MD5('testing');-> 'ae2b1fca515949e5d54fb22b8ed95575'Это “алгоритм MD5 Message-Digest, RSA Data Security, Inc.”
См. примечание об алгоритме MD5 в начале этого раздела.
-
Примечание
Эта функция устарела в 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».
-
Эта функция возвращает двоичную строку из
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». -
Вычисляет контрольную сумму SHA-1 длиной 160 бит для строки, как описано в RFC 3174 (Secure Hash Algorithm). Значение возвращается в виде строки из 40 шестнадцатеричных цифр или
NULL, если аргумент былNULL. Одно из возможных применений этой функции — как хэш-ключ. См. примечания в начале этого раздела о хранении хэш-значений эффективно.SHA()является синонимомSHA1().Значение возврата — строка в кодировке набора символов соединения.
mysql>
SELECT SHA1('abc');-> 'a9993e364706816aba3e25717850c26c9cd0d89d'SHA1()можно рассматривать как криптографически более безопасный аналогMD5(). Однако см. примечание относительно алгоритмов MD5 и SHA-1 в начале этого раздела. -
Вычисляет семейство хэш-функций 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_length25 Удовлетворяет политике 1 ( LOW)50 Удовлетворяет политике 2 ( MEDIUM)75 Удовлетворяет политике 3 ( STRONG)100
© 2025 Oracle
Licensed under the GPLv2 License.