Spec-Zone .ru
спецификации, руководства, описания, API
|
Table 12.17. Encryption Functions
Name | Description |
---|---|
AES_DECRYPT()
|
Decrypt using AES |
AES_ENCRYPT()
|
Encrypt using AES |
COMPRESS()
|
Return result as a binary string |
DECODE() |
Decodes a string encrypted using ENCODE() |
DES_DECRYPT()
|
Decrypt a string |
DES_ENCRYPT()
|
Encrypt a string |
ENCODE() |
Encode a string |
ENCRYPT()
|
Encrypt a string |
MD5() |
Calculate MD5 checksum |
OLD_PASSWORD()
|
Return the value of the pre-4.1 implementation of PASSWORD |
PASSWORD()
|
Calculate and return a password string |
SHA1() , SHA() |
Calculate an SHA-1 160-bit checksum |
SHA2() |
Calculate an SHA-2 checksum |
UNCOMPRESS()
|
Uncompress a string compressed |
UNCOMPRESSED_LENGTH() |
Return the length of a string before compression |
VALIDATE_PASSWORD_STRENGTH() |
Determine strength of password |
Many encryption and compression functions return strings for which the result might contain arbitrary byte
values. If you want to store these results, use a column with a VARBINARY
or BLOB
binary string data type. This will avoid potential problems with
trailing space removal or character set conversion that would change data values, such as may occur if you use a
nonbinary string data type (CHAR
,
VARCHAR
,
TEXT
).
Some encryption functions return strings of ASCII characters: MD5()
, OLD_PASSWORD()
, PASSWORD()
, SHA()
, SHA1()
,
SHA2()
. In MySQL 5.6, their
return value is a nonbinary string that has a character set and collation determined by the character_set_connection
and collation_connection
system variables.
For versions in which functions such as MD5()
or SHA1()
return a string of hex digits as a binary string, the return value cannot be
converted to uppercase or compared in case-insensitive fashion as is. You must convert the value to a nonbinary
string. See the discussion of binary string conversion in Section
12.10, "Cast Functions and Operators".
If an application stores values from a function such as MD5()
or SHA1()
that returns a string of hex digits, more efficient storage and
comparisons can be obtained by converting the hex representation to binary using UNHEX()
and storing the result in a BINARY(
column. Each pair of hex
digits requires one byte in binary form, so the value of N
)N
depends on
the length of the hex string. N
is 16 for an MD5()
value and 20 for a SHA1()
value. For SHA2()
, N
ranges from 28 to 32
depending on the argument specifying the desired bit length of the result.
The size penalty for storing the hex string in a CHAR
column is at least two times, up to eight times if the value is stored in a
column that uses the utf8
character set (where each character uses 4 bytes).
Storing the string also results in slower comparisons because of the larger values and the need to take
character set collation rules into account.
Suppose that an application stores MD5()
string values in a CHAR(32)
column:
CREATE TABLE md5_tbl (md5_val CHAR(32), ...);INSERT INTO md5_tbl (md5_val, ...) VALUES(MD5('abcdef'), ...);
To convert hex strings to more compact form, modify the application to use UNHEX()
and BINARY(16)
instead as follows:
CREATE TABLE md5_tbl (md5_val BINARY(16), ...);INSERT INTO md5_tbl (md5_val, ...) VALUES(UNHEX(MD5('abcdef')), ...);
Applications should be prepared to handle the very rare case that a hashing function produces the same value for two different input values. One way to make collisions detectable is to make the hash column a primary key.
Exploits for the MD5 and SHA-1 algorithms have become known. You may wish to consider using one of
the other encryption functions described in this section instead, such as SHA2()
.
Passwords or other sensitive values supplied as arguments to encryption functions are sent in plaintext to the MySQL server unless an SSL connection is used. Also, such values will appear in any MySQL logs to which they are written. To avoid these types of exposure, applications can encrypt sensitive values on the client side before sending them to the server. The same considerations apply to encryption keys. To avoid exposing these, applications can use stored procedures to encrypt and decrypt values on the server side.
AES_DECRYPT(
crypt_str
,key_str
)
This function decrypts data using the official AES (Advanced Encryption Standard) algorithm. For
more information, see the description of AES_ENCRYPT()
.
AES_ENCRYPT()
and AES_DECRYPT()
enable encryption and decryption of data using the
official AES (Advanced Encryption Standard) algorithm, previously known as "Rijndael." Encoding with a 128-bit key
length is used, but you can extend it up to 256 bits by modifying the source. We chose 128 bits
because it is much faster and it is secure enough for most purposes.
AES_ENCRYPT()
encrypts a string and returns a binary string. AES_DECRYPT()
decrypts the encrypted string and returns the
original string. The input arguments may be any length. If either argument is NULL
,
the result of this function is also NULL
.
Because AES is a block-level algorithm, padding is used to encode uneven length strings and so the result string length may be calculated using this formula:
16 * (trunc(string_length
/ 16) + 1)
If AES_DECRYPT()
detects invalid data or incorrect padding, it returns
NULL
. However, it is possible for AES_DECRYPT()
to return a non-NULL
value (possibly garbage) if the input data or the key is invalid.
You can use the AES functions to store data in an encrypted form by modifying your queries:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
AES_ENCRYPT()
and AES_DECRYPT()
can be considered the most cryptographically secure
encryption functions currently available in MySQL.
Compresses a string and returns the result as a binary string. This function requires MySQL to have
been compiled with a compression library such as zlib
. Otherwise, the
return value is always NULL
. The compressed string can be uncompressed
with UNCOMPRESS()
.
mysql>SELECT LENGTH(COMPRESS(REPEAT('a',1000)));
-> 21mysql>SELECT LENGTH(COMPRESS(''));
-> 0mysql>SELECT LENGTH(COMPRESS('a'));
-> 13mysql>SELECT LENGTH(COMPRESS(REPEAT('a',16)));
-> 15
The compressed string contents are stored the following way:
Empty strings are stored as empty strings.
Nonempty strings are stored as a 4-byte length of the uncompressed
string (low byte first), followed by the compressed string. If the string ends with space,
an extra ".
" character is added to avoid problems with
endspace trimming should the result be stored in a CHAR
or VARCHAR
column. (However, use of nonbinary string data
types such as CHAR
or VARCHAR
to store compressed strings is not recommended
anyway because character set conversion may occur. Use a VARBINARY
or BLOB
binary string column instead.)
Decrypts the encrypted string crypt_str
using pass_str
as the password. crypt_str
should be a string returned from ENCODE()
.
DES_DECRYPT(
crypt_str
[,key_str
])
Decrypts a string encrypted with DES_ENCRYPT()
. If an error occurs, this function returns NULL
.
This function works only if MySQL has been configured with SSL support. See Section 6.3.9, "Using SSL for Secure Connections".
If no key_str
argument is given, DES_DECRYPT()
examines the first byte of the encrypted string to
determine the DES key number that was used to encrypt the original string, and then reads the key
from the DES key file to decrypt the message. For this to work, the user must have the SUPER
privilege. The key file can be specified with the --des-key-file
server option.
If you pass this function a key_str
argument, that string
is used as the key for decrypting the message.
If the crypt_str
argument does not appear to be an
encrypted string, MySQL returns the given crypt_str
.
DES_ENCRYPT(
str
[,{key_num
|key_str
}])
Encrypts the string with the given key using the Triple-DES algorithm.
This function works only if MySQL has been configured with SSL support. See Section 6.3.9, "Using SSL for Secure Connections".
The encryption key to use is chosen based on the second argument to DES_ENCRYPT()
, if one was given. With no argument, the first key from
the DES key file is used. With a key_num
argument, the
given key number (0 to 9) from the DES key file is used. With a key_str
argument, the given key string is used to encrypt str
.
The key file can be specified with the --des-key-file
server option.
The return string is a binary string where the first character is CHAR(128 |
. If an
error occurs, key_num
)DES_ENCRYPT()
returns NULL
.
The 128 is added to make it easier to recognize an encrypted key. If you use a string key, key_num
is 127.
The string length for the result is given by this formula:
new_len
=orig_len
+ (8 - (orig_len
% 8)) + 1
Each line in the DES key file has the following format:
key_num
des_key_str
Each key_num
value must be a number in the range from
0
to 9
. Lines in the file may be in any
order. des_key_str
is the string that is used to encrypt
the message. There should be at least one space between the number and the key. The first key is the
default key that is used if you do not specify any key argument to DES_ENCRYPT()
.
You can tell MySQL to read new key values from the key file with the FLUSH DES_KEY_FILE
statement. This requires the RELOAD
privilege.
One benefit of having a set of default keys is that it gives applications a way to check for the existence of encrypted column values, without giving the end user the right to decrypt those values.
mysql>SELECT customer_address FROM customer_table
>WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
Encrypt str
using pass_str
as the password. The result is a binary string of
the same length as str
. To decrypt the result, use DECODE()
.
The ENCODE()
function should no longer be used. It is preferable to use AES_ENCRYPT()
instead.
To reduce risk, a salt value must be used with ENCODE()
. For example:
ENCODE('plaintext', CONCAT('my_random_salt','my_secret_password'))
A new random salt value must be used whenever a password is updated.
Encrypts str
using the Unix crypt()
system call and returns a binary string. The salt
argument must be a string with at least two
characters or the result will be NULL
. If no salt
argument is given, a random value is used.
mysql> SELECT
ENCRYPT('hello');
-> 'VxuFAJXVARROc'
ENCRYPT()
ignores all but the first eight characters of str
, at
least on some systems. This behavior is determined by the implementation of the underlying crypt()
system call.
The use of ENCRYPT()
with the ucs2
, utf16
, utf16le
, or utf32
multi-byte character sets is not recommended because the system call expects a string terminated by
a zero byte.
If crypt()
is not available on your system (as is the case with
Windows), ENCRYPT()
always returns NULL
.
Calculates an MD5 128-bit checksum for the string. The value is returned as a string of 32 hex
digits, or NULL
if the argument was NULL
.
The return value can, for example, be used as a hash key. See the notes at the beginning of this
section about storing hash values efficiently.
The return value is a nonbinary string in the connection character set.
mysql> SELECT
MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'
This is the "RSA Data Security, Inc. MD5 Message-Digest Algorithm."
See the note regarding the MD5 algorithm at the beginning this section.
OLD_PASSWORD()
was added when the implementation of PASSWORD()
was changed in MySQL 4.1 to improve security. OLD_PASSWORD()
returns the value of the pre-4.1 implementation of PASSWORD()
as a string, and is intended to permit you to reset passwords for any pre-4.1 clients that need to
connect to your version 5.6 MySQL server without locking them out. See Section
6.1.2.4, "Password Hashing in MySQL".
The return value is a nonbinary string in the connection character set.
Calculates and returns a hashed password string from the cleartext password str
and returns a nonbinary string in the connection character set, or NULL
if the argument is NULL
. This function is the SQL interface to the
algorithm used by the server to encrypt MySQL passwords for storage in the mysql.user
grant table.
The password hashing method used by PASSWORD()
depends on the value of the old_passwords
system variable:
mysql>SET old_passwords = 0;
mysql>SELECT PASSWORD('mypass');
+-------------------------------------------+| PASSWORD('mypass') |+-------------------------------------------+| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |+-------------------------------------------+mysql>SET old_passwords = 1;
mysql>SELECT PASSWORD('mypass');
+--------------------+| PASSWORD('mypass') |+--------------------+| 6f8c114b58f2ce9e |+--------------------+
If old_passwords=1
, PASSWORD('
returns the
same value as str
')OLD_PASSWORD('
. str
')
SHA-256 password hashing (old_passwords=2
) uses a random salt value, which makes the result
from PASSWORD()
nondeterministic. Consequently, statements that use this function are not safe for statement-based
replication and cannot be stored in the query cache.
For descriptions of the permitted values of old_passwords
, see Section
5.1.4, "Server System Variables".
Encryption performed by PASSWORD()
is one-way (not reversible). It is not the same type of
encryption as used for Unix passwords; for that, use ENCRYPT()
.
The PASSWORD()
function is used by the authentication system in MySQL Server; you should not use it in your own applications. For that purpose,
consider MD5()
or SHA2()
instead. Also see
Statements that invoke PASSWORD()
may be recorded in server logs or in a history file
such as ~/.mysql_history
, which means that cleartext passwords may
be read by anyone having read access to that information. See Section
6.1.2, "Keeping Passwords Secure".
Calculates an SHA-1 160-bit checksum for the string, as described in RFC 3174 (Secure Hash
Algorithm). The value is returned as a string of 40 hex digits, or NULL
if the argument was NULL
. One of the possible uses for this function is
as a hash key. See the notes at the beginning of this section about storing hash values efficiently.
You can also use SHA1()
as a cryptographic function for storing passwords. SHA()
is
synonymous with SHA1()
.
The return value is a nonbinary string in the connection character set.
mysql> SELECT
SHA1('abc');
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()
can be
considered a cryptographically more secure equivalent of MD5()
. However, see the note regarding the MD5 and SHA-1
algorithms at the beginning this section.
Calculates the SHA-2 family of hash functions (SHA-224, SHA-256, SHA-384, and SHA-512). The first
argument is the cleartext string to be hashed. The second argument indicates the desired bit length
of the result, which must have a value of 224, 256, 384, 512, or 0 (which is equivalent to 256). If
either argument is NULL
or the hash length is not one of the permitted
values, the return value is NULL
. Otherwise, the function result is a
hash value containing the desired number of bits. See the notes at the beginning of this section
about storing hash values efficiently.
The return value is a nonbinary string in the connection character set.
mysql> SELECT SHA2('abc',
224);
-> '23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7'
This function works only if MySQL has been configured with SSL support. See Section 6.3.9, "Using SSL for Secure Connections".
SHA2()
can be
considered cryptographically more secure than MD5()
or SHA1()
.
UNCOMPRESS(
string_to_uncompress
)
Uncompresses a string compressed by the COMPRESS()
function. If the argument is not a compressed value, the
result is NULL
. This function requires MySQL to have been compiled with
a compression library such as zlib
. Otherwise, the return value is
always NULL
.
mysql>SELECT UNCOMPRESS(COMPRESS('any string'));
-> 'any string'mysql>SELECT UNCOMPRESS('any string');
-> NULL
UNCOMPRESSED_LENGTH(
compressed_string
)
Returns the length that the compressed string had before being compressed.
mysql> SELECT
UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30)));
-> 30
VALIDATE_PASSWORD_STRENGTH(
str
)
Given an argument representing a cleartext password, this function returns an integer to indicate how strong the password is. The return value ranges from 0 (weak) to 100 (strong).
The password is subjected to increasingly strict tests and the return value reflects which tests were satisfied, as shown in the following table.
Password Test | Return Value |
---|---|
Length < 4 | 0 |
Length ≥ 4 and <validate_password_length |
25 |
Satisfies policy 1 (LOW ) |
50 |
Satisfies policy 2 (MEDIUM ) |
75 |
Satisfies policy 3 (STRONG ) |
100 |
Password assessment by VALIDATE_PASSWORD_STRENGTH()
is done by the validate_password
plugin. If that plugin is not installed, the function always returns 0. For information about
installing the validate_password
plugin, see Section
6.1.2.6, "The Password Validation Plugin". To examine or configure the parameters that
affect password testing, check or set the system variables implemented by validate_password
plugin. See Section
6.1.2.6.2, "Password Validation Plugin Options and Variables".
This function was added in MySQL 5.6.6.