Sie sind auf Seite 1von 4

Funciones de cifrado

~
Invierte todos los bits.
mysql> SELECT 5 & ~1;
-> 4

El resultado es un entero de 64 bits.

BIT_COUNT(N)
Retorna el nmero de bits en el argumento N.
mysql> SELECT BIT_COUNT(29);
-> 4

12.9.2. Funciones de cifrado


Las funciones en esta seccin cifran y descifran valores. Si quiere almacenar resultados de una
funcin de cifrado que puede contaner valores arbitrarios de bytes, use una columna BLOB en lugar de
CHAR o VARCHAR para evitar problemas potenciales con eliminacin de espacios finales que pueden
cambiar los valores de datos.
AES_ENCRYPT(str,key_str) , AES_DECRYPT(crypt_str,key_str)
Estas funciones permiten el cifrado y descifrado de datos usando el algoritmo oficial AES (Advanced
Encryption Standard), conocido anteriormente como "Rijndael." Se usa un cifrado con una clave
de 128-bit, pero puede ampliarlo hasta 256 bits modificando las fuentes. Elegimos 128 porque es
mucho ms rpido y de momento es suficientemente seguro.
Los argumentos de entrada pueden ser de cualquier longitud. Si algn argumento es NULL, el
resultado de esta funcin tambin 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 invlidos 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 invlidos.
Puede usar la funcin AES para almacenar datos de forma cifrada modificando sus consultas:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));

Puede obtener incluso mejor seguridad si no transfiere la clave a travs de la conexin para
cada consulta, que puede hacerse almacenando la clave en una variable del servidor al hacer la
conexin. 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 cifrado


criptogrficamente ms seguras disponibles en MySQL.
632

Funciones de cifrado

DECODE(crypt_str,pass_str)
Descifra la cadena cifrada crypt_str usando pass_str como contrasea. crypt_str debe ser
una cadena retornada de ENCODE().

ENCODE(str,pass_str)
Cifra str usando pass_str como contrasea. Para descifrar 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])
Descifra una cadena cifrada con DES_ENCRYPT(). En caso de error, esta funcin retorna NULL.
Tenga en cuenta que esta funcin funciona slo si MySQL se configura con soporte SSL. Consulte
Seccin 5.7.7, Usar conexiones seguras.
Si no se da argumento key_str, DES_DECRYPT() examina el primer byte de la cadena cifrada
para determinar el nmero de clave DES que se us para cifrar la cadena original, y luego lee la
clave del fichero clave DES para descifrar el mensaje. Para que esto funcione, el usuario debe tener
el privilegio SUPER. El fichero clave puede especificarse con la opcin del servidor --des-keyfile .
Si le pasa a esta funcin el argumento key_str , esta cadena se usa como la clave para descifrar
el mensaje.
Si el argumento crypt_str no parece una cadena cifrada, MySQL retorna crypt_str.

DES_ENCRYPT(str[,(key_num|key_str)])
Cifra la cadena con la clave dada usando el algoritmo triple-DES. En caso de error, retorna NULL.
Tenga en cuenta que esta funcin funciona slo si MySQL se configura con soporte SSL. Consulte
Seccin 5.7.7, Usar conexiones seguras.
La clave de cifrado a usar se elige basada en el segundo argumento de DES_ENCRYPT(), si se ha
dado uno:

Argumento

Descripcin

Sin argumento

Se usa la primera clave del fichero clave DES.

key_num

El nmero de clave dado (0-9) del fichero clave DES se usa.

key_str

Se usa la cadena clave dada para cifrar str.

El fichero clave puede especificarse con la opcin de servidor --des-key-file .


La cadena retornada es una cadena binaria donde el primer carcter es CHAR(128 | key_num).
Se aade 128 para hacer ms sencillo reconocer una clave cifrada. Si usa una cadena clave,
key_num es 127.
633

Funciones de cifrado

La longitud de la cadena para el resultado es new_len = orig_len + (8-(orig_len %


8))+1.
Cada lnea en el fichero clave DES tiene el siguiente formato:
key_num des_key_str

Cada key_num debe ser un nmero en el rango de 0 a 9. Las lneas en el fichero pueden estar en
cualquier orden. des_key_str es la cadena que se usa para cifrar el mensaje. Entre el nmero y
la clave debe haber un espacio como mnimo. La primera clave es la clave usada por defecto si no
especifica ningn 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 cifrados, sin dar al usuario final el derecho de
descifrarlos.
mysql> SELECT customer_address FROM customer_table
> WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');

ENCRYPT(str[,salt])
Cifra 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 implementacin 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 dgitos 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 maysculas, consulte la descripcin de conversiones de cadenas
binarias dada en la entrada del operador BINARY en Seccin 12.8, Funciones y operadores de
cast.

634

Funciones de informacin

OLD_PASSWORD(str)
OLD_PASSWORD() se aadi en MySQL 4.1,cuando se cambin la implementacin de PASSWORD()
para mejorar la seguridad. OLD_PASSWORD() retorna el valor de la implementacin pre-4.1 de
PASSWORD(), y est hecha para permitirle resetear contraseas para cualquier cliente pre-4.1
que necesite conectar a su versin 4.1 o posterior de MySQL server sin bloquearlo. Consulte
Seccin 5.6.9, Hashing de contraseas en MySQL 4.1.

PASSWORD(str)
Calcula y retorna una cadena de contrasea de la contrasea en texto plano str, o NULL si el
argumento era NULL. Esta es la funcin que se usa para cifrar contraseas MySQL para almacenar
en la columna Password de la tabla user .
mysql> SELECT PASSWORD('badpwd');
-> '7f84554057dd964b'

El cifrado de PASSWORD() es de un sentido (no reversible).


PASSWORD() no realiza el cifrado de contrasea de la misma forma que se cifran las contraseas
Unix. Consulte ENCRYPT().
Nota: La funcin PASSWORD() se usa por el sistema de autenticacin en MySQL Server; no no
debe usarlo en su propias aplicaciones. Para ese propsito, use MD5() o SHA1() en su lugar.
Consulte RFC 2195 para ms informacin acerca de tratar contraseas y autenticacin de forma
segura en su aplicacin.

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 dtigos hexadecimales, o NULL si el
argumento era NULL. Uno de los usos posibles para esta funcin es una clave hash. Tambin puede
usarlo como funcin criptogrficamente segura para almacenar contraseas
mysql> SELECT SHA1('abc');
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'

SHA1() puede considerarse un equivalente criptogrficamente ms seguro que MD5(). SHA() es


sinnimo de SHA1().

12.9.3. Funciones de informacin


BENCHMARK(count,expr)
La funcin BENCHMARK() ejecuta la expresin expr repetidamente count veces. Puede usarse
para ver lo rpido que MySQL procesa la expresin. El valor resultado siempre es 0. El uso
pretendido es desde dentro del cliente mysql, que reporte tiempos de ejecucin de consultas:
mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));
+----------------------------------------------+
| BENCHMARK(1000000,ENCODE('hello','goodbye')) |
+----------------------------------------------+
|
0 |
+----------------------------------------------+
1 row in set (4.74 sec)

635

Das könnte Ihnen auch gefallen