Las funciones en esta sección encriptan y desencriptan valores.
Si quiere almacenar resultados de una función de encriptación
que puede contaner valores arbitrarios de bytes, use una columna
BLOB
en lugar de CHAR
o
VARCHAR
para evitar problemas potenciales con
eliminación de espacios finales que pueden cambiar los valores
de datos.
AES_ENCRYPT(
,
str
,key_str
)AES_DECRYPT(
crypt_str
,key_str
)
Estas funciones permiten encriptación y desencriptación de datos usando el algoritmo oficial AES (Advanced Encryption Standard), conocido anteriormente como "Rijndael." Se usa una encriptación con una clave de 128-bit , pero puede ampliarlo hasta 256 bits modificando las fuentes. Elegimos 128 porque es mucho más rápido y de momento es suficientemente seguro.
Los argumentos de entrada pueden ser de cualquier longitud.
Si algún argumento es NULL
, el resultado
de esta función también es NULL
.
Debido a que AES es un algoritmo a nivel de bloques, se usa
relleno para cadenas de longitud impar y así la longitud de
la cadena resultante puede calcularse como 16 *
(trunc(
.
string_length
/ 16) +
1)
Si AES_DECRYPT()
detecata datos
inválidos o relleno incorrecto, retorna
NULL
. Sin embargo, es posible para
AES_DECRYPT()
retornar un valor no
NULL
(posiblemente basura) si los datos
de entrada o la clave son inválidos.
Puede usar la función AES para almacenar datos de forma encriptada modificando sus consultas:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
Puede obtener incluso mejor seguridad si no transfiere la clave a través de la conexión para cada consulta, que puede hacerse almacenando la clave en una variable del servidor al hacer la conexión. Por ejemplo:
SELECT @password:='my password'; INSERT INTO t VALUES (1,AES_ENCRYPT('text',@password));
AES_ENCRYPT()
y
AES_DECRYPT()
pueden considerarse las
funciones de encriptación criptográficamente más seguras
disponibles en MySQL.
DECODE(
crypt_str
,pass_str
)
Desencripta la cadena encriptada
crypt_str
usando
pass_str
como contraseña.
crypt_str
debe ser una cadena
retornada de ENCODE()
.
ENCODE(
str
,pass_str
)
Encripta str
usando
pass_str
como contraseña. Para
desencriptar el resultado, use DECODE()
.
El resultado es una cadena binaria de la misma longitud que
str
. Si quiere guardarlo en una
columna, use una columna de tipo BLOB
.
DES_DECRYPT(
crypt_str
[,key_str
])
Desencripta una cadena encriptada con
DES_ENCRYPT()
. En caso de error, esta
función retorna NULL
.
Tenga en cuenta que esta función funciona sólo si MySQL se configura con soporte SSL. Consulte Sección 5.7.7, “Usar conexiones seguras”.
Si no se da argumento key_str
,
DES_DECRYPT()
examina el primer byte de
la cadena encriptada para determinar el número de clave DES
que se usó para encriptar la cadena original, y luego lee
la clave del fichero clave DES para desencriptar el mensaje.
Para que esto funcione, el usuario debe tener el privilegio
SUPER
. El fichero clave puede
especificarse con la opción del servidor
--des-key-file
.
Si le pasa a esta función el argumento
key_str
, esta cadena se usa como
la clave para desencriptar el mensaje.
Si el argumento crypt_str
no
parece una cadena encriptada, MySQL retorna
crypt_str
.
DES_ENCRYPT(
str
[,(key_num
|key_str
)])
Encriptas la cadena con la clave dada usando el algoritmo
triple-DES. En caso de error, retorna
NULL
.
Tenga en cuenta que esta función funciona sólo si MySQL se configura con soporte SSL. Consulte Sección 5.7.7, “Usar conexiones seguras”.
La clave de encriptación a usar se elige basada en el
segundo argumento de DES_ENCRYPT()
, si se
ha dado uno:
Argumento | Descripción |
Sin argumento | Se usa la primera clave del fichero clave DES. |
key_num |
El número de clave dado (0-9) del fichero clave DES se usa. |
key_str |
Se usa la cadena clave dada para encriptar
str . |
El fichero clave puede especificarse con la opción de
servidor --des-key-file
.
La cadena retornada es una cadena binaria donde el primer
carácter es CHAR(128 | key_num)
.
Se añade 128 para hacer más sencillo reconocer una clave
encriptada. Si usa una cadena clave,
key_num
es 127.
La longitud de la cadena para el resultado es
.
new_len
=
orig_len
+
(8-(orig_len
% 8))+1
Cada línea en el fichero clave DES tiene el siguiente formato:
key_num
des_key_str
Cada key_num
debe ser un número
en el rango de 0
a 9
.
Las líneas en el fichero pueden estar en cualquier orden.
des_key_str
es la cadena que se
usa para encriptar el mensaje. Entre el número y la clave
debe haber un espacio como mínimo. La primera clave es la
clave usada por defecto si no especifica ningún argumento
clave para DES_ENCRYPT()
Puede decir a MySQL que lea un nuevo valor de clave del
fichero clave con el comando FLUSH
DES_KEY_FILE
. Esto necesita el privilegio
RELOAD
.
Un beneficio de tener un conjunto de claves por defecto es que da a las aplicaciones una forma de chequear la existencia de valores de columna encriptados, sin dar al usuario final el derecho de desencritparlos.
mysql> SELECT customer_address FROM customer_table > WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
ENCRYPT(
str
[,salt
])
Encripta str
usando la llamada de
sistema Unix crypt()
. El argumento
salt
debe ser una cadena con al
menos dos caracteres. Si no se da argumento
salt
, se usa un valor aleatorio.
mysql> SELECT ENCRYPT('hello'); -> 'VxuFAJXVARROc'
ENCRYPT()
ignora todo excepto los
primeros ochos caracteres de str
,
al menos en algunos sistemas. Este comportamiento viene
determinado por la implementación de la llamada de sistema
crypt()
subyacente.
Si crypt()
no está disponible en su
sistema (como pasa en Windows), ENCRYPT()
siempre retorna NULL
. Debido a esto,
recomandamos que use MD5()
o
SHA1()
en su lugar, y que estas dos
funciones existen en todas las plataformas.
MD5(
str
)
Calcula una checksum MD5 de 128-bit para la cadena. El valor
se retorna como una cadena binaria de dígitos 32 hex ,o
NULL
si el argumento era
NULL
. El valor de retorno puede usarse
como clave hash, por ejemplo.
mysql> SELECT MD5('testing'); -> 'ae2b1fca515949e5d54fb22b8ed95575'
Este es el "RSA Data Security, Inc. MD5 Message-Digest Algorithm."
Si quiere convertir el valor a mayúsculas, consulte la
descripción de conversiones de cadenas binarias dada en la
entrada del operador BINARY
en
Sección 12.8, “Funciones y operadores de cast”.
OLD_PASSWORD(
str
)
OLD_PASSWORD()
se añadió en MySQL
4.1,cuando se cambión la implementación de
PASSWORD()
para mejorar la seguridad.
OLD_PASSWORD()
retorna el valor de la
implementación pre-4.1 de PASSWORD()
, y
está hecha para permitirle resetear contraseñas para
cualquier cliente pre-4.1 que necesite conectar a su
versión 4.1 o posterior de MySQL server sin bloquearlo.
Consulte Sección 5.6.9, “Hashing de contraseñas en MySQL 4.1”.
PASSWORD(
str
)
Calcula y retorna una cadena de contraseña de la
contraseña en texto plano str
, o
NULL
si el argumento era
NULL
. Esta es la función que se usa para
encriptar contraseñas MySQL para almacenar en la columna
Password
de la tabla
user
.
mysql> SELECT PASSWORD('badpwd'); -> '7f84554057dd964b'
La encriptación de PASSWORD()
es de un
sentido (no reversible).
PASSWORD()
no realiza encriptación de
contraseña de la misma forma que se encriptan las
contraseñas Unix. Consulte ENCRYPT()
.
Nota: La función
PASSWORD()
se usa por el sistema de
autenticación en MySQL Server; no no
debe usarlo en su propias aplicaciones. Para ese propósito,
use MD5()
o SHA1()
en
su lugar. Consulte RFC 2195 para más información acerca de
tratar contraseñas y autenticación de forma segura en su
aplicación.
SHA1(
,
str
)SHA(
str
)
Calcula una checksum SHA1 de 160-bit para la cadena, como se
describe en RFC 3174 (Secure Hash Algorithm). El valor se
retorna como cadnea de 40 dítigos hexadecimales, o
NULL
si el argumento era
NULL
. Uno de los usos posibles para esta
función es una clave hash. También puede usarlo como
función criptográficamente segura para almacenar
contraseñas
mysql> SELECT SHA1('abc'); -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()
puede considerarse un equivalente
criptográficamente más seguro que
MD5()
. SHA()
es
sinónimo de SHA1()
.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.