DECRYPT_BINARY、DECRYPT_BIT、DECRYPT_CHAR和DECRYPT_DB标量函数

解密功能返回一个值,该值是解密加密数据的结果。 解密功能只能解密使用ENCRYPT_TDES函数加密的值。

阅读语法图跳过可视化语法图DECRYPT_BINARYDECRYPT_BITDECRYPT_CHARDECRYPT_DB( 加密数据,密码字符串DEFAULT,ccsid-constant)

该模式是 SYSIBM。

用于解密的密码可以是密码字符串值 ,也可以是加密密码值,该值由SET ENCRYPTION PASSWORD语句指定。

encrypted-data
返回CHAR FOR BIT DATA、VARCHAR FOR BIT DATA、BINARY或VARBINARY数据类型的完整加密数据值的表达式。 数据字符串必须使用ENCRYPT_TDES函数加密。 长度属性必须大于或等于0(零)且小于或等于32672。
密码字符串
返回至少6字节且不超过127字节的CHAR或VARCHAR值的表达式。 此表达式必须与加密数据时使用的密码相同,否则解密后的值将与原始加密值不同。 为了提高安全性, 密码字符串应使用主机变量而非字符串常量来指定。 如果密码参数的值为空或未提供,则将使用加密密码值解密数据,该值必须由SET ENCRYPTION PASSWORD语句指定。

对于静态 SQL 语句,建议使用主机变量而不是字符串常量来指定密码。

DEFAULT
使用加密密码值对数据进行解密,该值必须由SET ENCRYPTION PASSWORD语句分配。
ccsid-constant
一个整数常量,用于指定解密函数应返回数据的CCSID。 如果指定了 DECRYPT_BIT 或 DECRYPT_BINARY,则不能指定 ccsid-constant。 缺省设置为“
  • 对于包含静态SQL语句的本机SQL程序,计划或包的编码绑定选项或CREATE PROCEDURE或ALTER PROCEDURE语句的应用编码方案选项
  • 应用程序编码特殊寄存器对动态SQL语句的价值
函数结果的数据类型由指定的函数和第一个参数的数据类型决定,如下表所示。 如果不支持从加密数据的实际类型到函数结果的转换,则返回警告或错误。
表 1. 解密函数的结果
函数 第一个参数的类型 加密数据的实际类型 结果
DECRYPT_BINARY 用于二进制位数据 1、二进制、可变二进制 任何字符串(LOB除外) VARBINARY
解密位 用于二进制、变长二进制数据 CHAR 或 VARCHAR VARCHAR FOR BIT DATA
解密位 用于二进制、变长二进制数据 图形、VARGRAPHIC ( UTF16 ) 警告或错误

如果返回警告,结果为VARCHAR FOR BIT DATA

解密位 用于二进制、变长二进制数据 图形、VARGRAPHIC(非 UTF16 ) 警告或错误

如果返回警告,结果为VARCHAR FOR BIT DATA

解密位 用于二进制、变长二进制数据 BINARY 或 VARBINARY 警告或错误

如果返回警告,结果为VARCHAR FOR BIT DATA

DECRYPT_CHAR 用于二进制、变长二进制数据 CHAR 或 VARCHAR VARCHAR(3)
DECRYPT_CHAR 用于二进制、变长二进制数据 图形、VARGRAPHIC ( UTF16 ) VARCHAR(3)
DECRYPT_CHAR 用于二进制、变长二进制数据 图形、VARGRAPHIC(非 UTF16 ) 警告或错误

如果返回警告,结果为VARCHAR(3)

DECRYPT_CHAR 用于二进制、变长二进制数据 BINARY 或 VARBINARY 警告或错误

如果返回警告,结果为VARCHAR(3)

解密数据库 用于二进制、变长二进制数据 Char、Varchar、Graphic 和 Vargraphic VARGRAPHIC
解密数据库 用于二进制、变长二进制数据 BINARY 或 VARBINARY 警告或错误

如果返回警告,结果为VARGRAPHIC

注:
  1. 对于位数据,表示字符或可变字符 对于位数据

如果 encrypted-data 包含提示,则该函数不会返回此提示。 结果的“长度”属性为加密数据的长度属性减去8个字节。 函数返回的实际值长度与加密的原始字符串长度一致。 如果 encrypted-data 包含加密字符串之外的字节,那么该函数不会返回这些字节。

加密数据的管理 :解密功能只能解密使用三重DES加密算法加密的数据。 因此,如果使用三重DES加密算法加密了数据,则只有在复制后才能使用加密数据列。

如果使用与原始加密值不同的 CCSID 对数据进行解密,则在将解密值转换为该 CCSID 时可能会发生扩展。 在这种情况下,在执行解密功能之前,必须先将加密数据值转换为具有更大字节数的VARCHAR字符串。

结果可以为空;如果第一个参数为空,则结果为空值。

有关使用解密功能的更多信息,请参阅 ENCRYPT_TDES或ENCRYPT标量函数GETHINT标量函数

密码保护 :为了防止无意中访问加密密码,请不要在源代码中指定密码字符串为常量。 请使用加密密码特殊寄存器或使用主机变量指定密码。

示例1: 将“加密密码”值设置为“ Ben123 ”,并将其作为密码,将解密后的社会保险号插入表中。 使用加密密码值解密附加的社会安全号码。
   SET ENCRYPTION PASSWORD ='Ben123';
   INSERT INTO EMP(SSN) VALUES ENCRYPT_TDES('289-46-8832');
   SELECT DECRYPT_CHAR(SSN) FROM EMP;

这个例子返回的值为“289-46-8832”。

示例2 :解密表格中填写的社会保险号码。 不要使用“加密密码”值,而应明确指定“ Ben123 ”作为加密密码。
   SELECT DECRYPT_CHAR(SSN,'Ben123') FROM EMP;

这个例子返回的值为“289-46-8832”。

示例3: 在表格中插入一个已解密的社会安全号码,并明确指定“ Ben123 ”作为密码。 解密数据并将其转换为CCSID 1208。
   SET ENCRYPTION PASSWORD ='Ben123';
   INSERT INTO EMP(SSN) VALUES ENCRYPT_TDES('289-46-8832');
   SELECT DECRYPT_CHAR(SSN) FROM EMP;
当指定CCSID时,可能有必要将数据显式转换为更长的值,以确保数据解密时有扩展空间。 以下示例说明了该技术:
   SELECT DECRYPT_CHAR(CAST(SSN AS VARCHAR(57)),
                        'Ben123',1208) 
                  FROM EMP;

在第一种情况下,如果数据没有转换为更长的值,结果就是VARCHAR(11)值。 在第二种情况下,为了便于扩展,SSN的地址为 VARCHAR(57) (11 * 3 + 24)。 将数据转换为更长的值,可使正常VARCHAR(11)结果扩展三倍。 三次扩展通常与ASCII或EBCDIC到Unicode UTF-8 转换的最坏情况有关。 在这个例子中,两种情况的结果都是VARCHAR(11)值“289-46-8832”。