ENCRYPT_TDES

ENCRYPT_TDES 函数返回一个值,该值是使用三重 DES 加密算法对 data-string 进行加密的结果。 用于解密的密码是 password-string 值或加密密码值 (由 SET ENCRYPTION PASSWORD 语句指定)。

读取语法图跳过可视语法图ENCRYPT_TDES (data-string,密码字符串,提示字符串)
data-string
返回要加密的字符串值的表达式。 字符串表达式必须是内置字符串数据类型。

数据类型 data-string 的长度属性必须小于 M -MOD (M, 8)- N -1 ,其中 M 是结果数据类型的最大长度, N 是加密值所需的开销量。

密码字符串
返回至少包含 6 个字节且不超过 127 个字节的字符串值的表达式。 表达式不能是 CLOB ,并且表达式的 CCSID 不能是 65535。 该值表示用于加密 data-string的密码。 如果密码自变量的值为空或未提供,那么将使用 ENCRYPTION PASSWORD 值对数据进行加密,该值必须是使用 SET ENCRYPTION PASSWORD 语句设置的。
提示字符串
返回最多 32 个字节的字符串值的表达式,将帮助数据所有者记住密码 (例如, "Ocean" 是记住 "Pacific" 的提示)。 表达式不能是 CLOB ,并且表达式的 CCSID 不能是 65535。 如果指定了提示值,那么提示将嵌入到结果中,并且可以使用 GETHINT 函数进行检索。 如果指定了 password-string ,并且此参数为空值或未提供此参数,那么不会在结果中嵌入任何提示。 如果未指定 password-string ,那么可以使用 SET ENCRYPTION PASSWORD 语句指定提示。

结果的数据类型由第一个自变量确定,如下表中所示:

第一个参数的数据类型 结果的数据类型
BINARY 或 VARBINARY VARBINARY
CHAR , VARCHAR , GRAPHIC 或 VARGRAPHIC VARCHAR FOR BIT DATA
BLOB , CLOB 或 DBCLOB BLOB

结果的长度属性取决于指定的参数:

  • 如果指定了 password-string ,但未指定 hint-stringdata-string 的长度属性加上 24 加上 8 字节边界的字节数。
  • 否则, data-string 的长度属性加上 56 加上 8 字节边界的字节数。
结果的实际长度为:
  • data-string 的实际长度加上要到达 8 字节边界的字节数。
  • 提示的实际长度。

    如果 hint-string 未指定为函数自变量或未在 SET ENCRYPTION PASSWORD 语句上指定,那么提示的实际长度为零。

  • N,其中 N (加密该值所需的开销量) 为 16 字节 (如果 data-string 是 LOB 或其他 CCSID 值用于 data-string,密码或提示,那么为 24 字节)。

如果自变量可以为空,那么结果可以为空; 如果自变量为空,那么结果为空值。

请注意,加密结果的长度超过 data-string 值。 因此,在分配加密值时,请确保声明目标的大小足以包含整个加密值。

注意

密码保护: 要防止无意中访问加密密码,请勿在程序,过程或函数的源中指定 password-string 作为字符串常量。 请改为使用 SET ENCRYPTION PASSWORD 语句或主变量或全局变量。

连接到远程关系数据库时,强烈建议使用 TLS 连接来保护密码。 如果没有 TLS ,那么将 "明文" 发送加密密码。 即密码本身未加密。

加密算法: 使用的内部加密算法是带有填充的三重 DES 块密码,使用 SHA1 消息摘要从密码派生 128 位密钥。

加密密码和数据: 用户负责执行密码管理。 一旦对数据进行了加密,就只能使用用于对其进行加密的密码对其进行解密。 使用 CHAR 变量设置密码值时请小心,因为它们可能被填充为空白。 加密结果可能包含空终止符和其他不可打印的字符。

表列定义: 定义要包含加密数据的列和单值类型时:

  • 必须使用 CHAR FOR BIT DATA , VARCHAR FOR BIT DATA , BINARY , VARBINARY 或 BLOB 数据类型定义该列。
  • 列的长度属性必须包含额外的 n 字节,其中 n 是对上述数据进行加密所必需的开销。

没有这些数据类型之一或长度短于建议数据长度的任何赋值或对列的强制类型转换都可能导致赋值错误,或者如果赋值成功,那么在随后解密数据时发生故障并丢失数据。 空白是有效的加密数据值,当存储在太短的列中时,可能会截断这些值。

一些样本列长度计算:

Maximum length of non-encrypted data           6 bytes
Number of bytes to the next 8 byte boundary    2 bytes
Overhead                                      16 bytes (or 24 bytes)
                                              --------
Encrypted data column length                  24 bytes (or 32 bytes)


Maximum length of non-encrypted data          32 bytes
Number of bytes to an 8 byte boundary          0 bytes
Overhead                                      16 bytes (or 24 bytes)
                                              --------
Encrypted data column length                  48 bytes (or 56 bytes)

加密数据管理: 只能在支持与 ENCRYPT_TDES 函数对应的解密函数的服务器上解密加密数据。 因此,仅应将具有加密数据的列复制到支持解密功能的服务器。

示例

  • 假定表 EMP1 具有名为 SSN 的社会保险列。 此示例使用 ENCRYPTION PASSWORD 值来保存加密密码。
      SET ENCRYPTION PASSWORD = 'Ben123'
    
      INSERT INTO EMP1 (SSN) VALUES ENCRYPT_TDES( '289-46-8832' )
    
  • 此示例显式传递加密密码。
      INSERT INTO EMP1 (SSN) VALUES ENCRYPT_TDES( '289-46-8832', 'Ben123' )
    
  • 存储提示 "Ocean" 以帮助用户记住加密密码 "Pacific"。
      INSERT INTO EMP1 (SSN) VALUES ENCRYPT_TDES( '289-46-8832', 'Pacific', 'Ocean' )