Función escalar ENCRYPT
La función ENCRYPT devuelve un valor que es el resultado del cifrado de expresión-serie-datos.
Los algoritmos utilizados no son compatibles con NIST SP 800-131A.
El esquema es SYSIBM.
La contraseña que se utiliza para cifrar es el valor expresión-serie-contraseña o el valor de la contraseña de cifrado asignado por la sentencia SET ENCRYPTION PASSWORD. Para mantener el mejor nivel de seguridad en el sistema, se recomienda que no pase la contraseña de cifrado explícitamente con la función ENCRYPT en la consulta; en su lugar, utilice la sentencia SET ENCRYPTION PASSWORD para establecer la contraseña, y utilice una variable del lenguaje principal o marcadores de parámetro dinámicos cuando utilice la sentencia SET ENCRYPTION PASSWORD, en lugar de una serie literal.
En una base de datos Unicode, si un argumento proporcionado es una serie gráfica, se convertirá a una serie de caracteres antes de que se ejecute la función.
- expresión-serie-datos
- Expresión que devuelve el valor CHAR o VARCHAR que debe cifrarse. El atributo de longitud del tipo de datos de expresión-serie-datos está limitado a 32663 sin ningún argumento expresión-serie-sugerencia y a 32631 cuando se especifica el argumento expresión-serie-sugerencia (SQLSTATE 42815).
- expresión-serie-contraseña
- Expresión que devuelve un valor CHAR o VARCHAR con un mínimo de 6 bytes y no más de 127 bytes (SQLSTATE 428FC). El valor representa la contraseña utilizada para cifrar expresión-serie-datos. Si el valor del argumento de contraseña es nulo o no se ha proporcionado, los datos se cifran con el valor de la contraseña de cifrado que se asignó para la sesión por la sentencia SET ENCRYPTION PASSWORD (SQLSTATE 51039).
- expresión-serie-indicación
- Expresión que devuelve un valor CHAR o VARCHAR de un máximo de 32 bytes que ayudará a los propietarios de datos a recordar las contraseñas (por ejemplo, 'Océano' puede ser una sugerencia para recordar 'Pacífico'). Si se proporciona un valor de indicación, la indicación se incorpora en el resultado y puede recuperarse utilizando la función GETHINT. Si este argumento es nulo o no se proporciona, no se incorporará ninguna indicación en el resultado.
- Cuando se especifica el parámetro de sugerencia opcional, el atributo de longitud del resultado es igual al atributo de longitud de los datos no cifrados + 8 bytes + el número de bytes hasta el siguiente límite de 8 bytes + 32 bytes para la longitud de la sugerencia.
- Si no se ha especificado el parámetro de sugerencia opcional, el atributo de longitud del resultado es igual al atributo de longitud de los datos no cifrados + 8 bytes + el número de bytes hasta el siguiente límite de 8 bytes.
Si el primer argumento puede ser nulo, el resultado puede ser nulo. Si el primer argumento es nulo, el resultado es el valor nulo.
Tenga en cuenta que el resultado cifrado tiene una longitud mayor que la del valor expresión-serie-datos. Por consiguiente, al asignar valores cifrados, asegúrese de que el destino se declara con un tamaño suficiente para contener el valor cifrado entero.
Notas
- Algoritmo de cifrado: El algoritmo de cifrado interno es la cifra de bloque RC2 con relleno; la clave secreta de 128 bits se deriva de la contraseña utilizando un resumen de mensaje MD5.
- Contraseñas y datos de cifrado: la
gestión de contraseñas es responsabilidad del usuario. Una vez que se han cifrado
los datos, sólo se puede utilizar para descifrarlos la contraseña
utilizada para cifrarlos (SQLSTATE 428FD).
El resultado cifrado puede contener el terminador nulo y otros caracteres no imprimibles. Cualquier asignación o conversión a una longitud inferior a la longitud de datos sugerida puede producir un descifrado anómalo en el futuro y hacer que se pierdan datos. Los espacios en blanco son valores de datos cifrados válidos que se pueden truncar al almacenarse en una columna demasiado pequeña.
- Administración de datos cifrados: los datos cifrados sólo se pueden descifrar en servidores que soporten las funciones de descifrado que corresponden a la función ENCRYP. Por lo tanto, la duplicación de columnas con datos cifrados sólo se debe realizar en servidores que soporten la función DECRYPT_BIN o DECRYPT_CHAR.
- Evitar los datos cifrados en el predicado: La función ENCRYPT no siempre produce los mismos datos cifrados cuando se proporciona la misma entrada. No utilice datos cifrados en condiciones de búsqueda u operaciones de comparación. Por ejemplo, no utilice datos cifrados en un predicado.
Ejemplos
- Ejemplo 1: el ejemplo siguiente demuestra el uso de la función ENCRYPT mostrando los fragmentos de código de una aplicación de SQL incorporado.
EXEC SQL BEGIN DECLARE SECTION; char hostVarCreateTableStmt[100]; char hostVarSetEncPassStmt[200]; char hostVarPassword[128]; char hostVarInsertStmt1[200]; char hostVarInsertStmt2[200]; char hostVarInsertStmt3[200]; EXEC SQL END DECLARE SECTION; /* preparar la sentencia */ strcpy(hostVarCreateTableStmt, "CREATE TABLE EMP (SSN VARCHAR(24) FOR BIT DATA)"); EXEC SQL PREPARE hostVarCreateTableStmt FROM :hostVarCreateTableStmt; /* ejecutar la sentencia */ EXEC SQL EXECUTE hostVarCreateTableStmt; - Ejemplo 2: utilizar la sentencia SET ENCRYPTION PASSWORD para establecer una
contraseña de cifrado para la sesión:
/* preparar la sentencia con un marcador de parámetros */ strcpy(hostVarSetEncPassStmt, "SET ENCRYPTION PASSWORD = ?"); EXEC SQL PREPARE hostVarSetEncPassStmt FROM :hostVarSetEncPassStmt; /* ejecutar la sentencia correspondiente a hostVarPassword = 'Pac1f1c' */ strcpy(hostVarPassword, "Pac1f1c"); EXEC SQL EXECUTE hostVarSetEncPassStmt USING :hostVarPassword; /* preparar la sentencia */ strcpy(hostVarInsertStmt1, "INSERT INTO EMP(SSN) VALUES ENCRYPT('289-46-8832')"); EXEC SQL PREPARE hostVarInsertStmt1 FROM :hostVarInsertStmt1; /* ejecutar la sentencia */ EXEC SQL EXECUTE hostVarInsertStmt1; - Ejemplo 3: pasar la contraseña de cifrado de forma explícita:
/* preparar la sentencia */ strcpy(hostVarInsertStmt2, "INSERT INTO EMP(SSN) VALUES ENCRYPT('289-46-8832',?)"); EXEC SQL PREPARE hostVarInsertStmt2 FROM :hostVarInsertStmt2; /* ejecutar la sentencia correspondiente a hostVarPassword = 'Pac1f1c' */ strcpy(hostVarPassword, "Pac1f1c"); EXEC SQL EXECUTE hostVarInsertStmt2 USING :hostVarPassword; - Ejemplo 4: definir una sugerencia de contraseña:
/* preparar la sentencia */ strcpy(hostVarInsertStmt3, "INSERT INTO EMP(SSN) VALUES ENCRYPT('289-46-8832',?,'Ocean')"); EXEC SQL PREPARE hostVarInsertStmt3 FROM :hostVarInsertStmt3; /* ejecutar la sentencia correspondiente a hostVarPassword = 'Pac1f1c' */ strcpy(hostVarPassword, "Pac1f1c"); EXEC SQL EXECUTE hostVarInsertStmt3 USING :hostVarPassword;
