使用 SET ENCRYPTION PASSWORD 语句设置加密密码和提示信息。 仅 GBase 8s 支持此语句,这是对 SQL 的 ANSI/ISO 标准的扩展。 语法 元素 描述 限制 语法 password 用于数据加密的密码(或多 字词短句)。 必须是符型数据。并 且,6 字节≤ password ≤128 字 节。 引用字符 串 hint 密码提示信息。 必须是字符型数据。 并且,0 字节≤ hint ≤32 字节。 引用字符 串 用法 SET ENCRYPTION PASSWORD 语句通过内置的函数声明密码,以支持数据保密 性。这些函数使用AES 或 TDES 算法进行加密和解密并使数据库能够以加密格式 存储敏感数据,防止不能提供机密密码的任何人员查看、复制或修改加密数据。 该密码不以明文存储在数据库中,并且 DBA 不能访问。 GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 999 hint 应该为帮助您记忆 password 的词或短语,但最好不要包括password。 例如,使用SET ENCRYPTION PASSWORD 语句设置密码和提示: SET ENCRYPTION PASSWORD ‘abc123456’ WITH HINT ‘1234’; 有关加密和解密函数的详细信息,请参阅 加密和解密函数 一章。 加密的存储需求 使用 ENCRYPT_AES 或 ENCRYPT_TDES 内建的函数来加密数据。以 BASE64 格式(又称为 Radix-64)来存储字符数据类型的加密的值。对于字符数 据,这需要比相应的未加密的数据大得多的存储。省略 hint 可对每一加密的值减 少超过 50 字节的开销。留出充足的存储空间供加密的值使用是用户的职责。 下表罗列可加密的数据类型,以及您可用来对那些数据类型的值进行加密和解密 的内建的函数: 原始的数据类型 加密的数据类型 BASE64 格式 解密函数 CHAR CHAR 是 DECRYPT_CHAR NCHAR NCHAR 是 DECRYPT_CHAR VARCHAR VARCHAR 是 DECRYPT_CHAR NVARCHAR NVARCHAR 是 DECRYPT_CHAR LVARCHAR LVARCHAR 是 DECRYPT_CHAR BLOB BLOB 否 DECRYPT_BINARY CLOB BLOB 否 DECRYPT_CHAR 您不可加密 IDSSECURITYLABEL 数据类型的列。 如果加密的 VARCHAR(或 NVARCHAR)值长于那些数据类型的最大大小 255 字节,则该加密函数返回有足够大小的 CHAR(或 NCHAR)值来存储加密的 值。 DECRYPT_BINARY 和 DECRYPT_CHAR 都从加密的 CHAR、NCHAR、 VARCHAR、NVARCHAR 或 LVARCHAR 值返回相同的值。没有内建的加密或 GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 1000 解密函数支持 BYTE 或 TEXT 数据类型,但您可使用 BLOB 数据类型来加密 每个大型字符串。 警告: 如果您想要在其中存储加密的数据的数据库列的声明的大小小于加密的数 据长度,则当您将加密的数据插入到该列内时会发生截断。被截断的数据不可在 后续进行解密,因为在加密的字符串的头部内标明的数据长度与该列存储的不相 匹配。要避免发生截断,请确保任何存储加密的字符串的列都有充足的长度。 (要了解如何计算加密的字符串长度,请参阅下一段中的交叉引用。) 除了未加密的数据长度之外,对加密的数据需要的存储依赖于编码格式,依赖于 您是否指定 hint,以及依赖于加密函数的块大小。要了解估算加密的大小的公 式,请参阅 计算加密的数据的存储需求 页上的“计算加密的数据的存储需求”。 指定会话口令和提示 所需的 password 规范可为带引号的字符串或其他求出其长度至少为 6 字节但不 大于 128 字节的字符串的字符表达式。可选的 hint 可指定不长于 32 字节的字 符串。 口令或 hint 可为单个词或几个词。hint 应为帮助您记忆 password 的词或短语, 但您不包括 password。您可后续地执行内建的 GETHINT 函数(带有加密的值 作为其参数)来返回 hint 的明文。 下列 ESQL/C 程序片段定义包括 SET ENCRYPTION PASSWORD 语句的例程,并执行 DML 语句: process_ssn( ) { EXEC SQL BEGIN DECLARE SECTION; char password[128]; char myhint[33]; char myid[16], myssn[16]; EXEC SQL END DECLARE SECTION; . . . EXEC SQL SET ENCRYPTION PASSWORD :password WITH HINT :myhint; ... EXEC SQL INSERT INTO tab1 VALUES (':abcd', ENCRYPT_AES("111-22- 3333")) ; EXEC SQL SELECT Pid, DECRYPT(ssn, :password) INTO :myid, :myssn; GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 1001 ... EXEC SQL SELECT GETHINT(ssn) INTO :myhint, WHERE id = :myid; } 加密的级别 您可使用带有加密和解密函数的 SET ENCRYPTION PASSWORD 来支持在数据 库中的这些加密粒度。 列级加密:使用相同的口令、相同的加密算法和相同的加密模式加密数据 库表的给定列中的所有值。(在这种情况下,您可通过在加密的列的外部 存储 hint,而不是在每行中重复它,来节省磁盘空间。) 单元级加密:使用不同的口令或不同的加密算法或不同的加密模式来加密 同一数据库表的不同行中给定的列的值。有时有必要采用此技术来保护个 人的数据。(对于单元级加密,行-列级 加密与集合-列级加密都是同义 词。) 单元级加密可导致极大的维护成本。如果您实施此级别的加密,则您的应用有责 任确定哪些行包含加密的数据,并使用正确的编码来处理数据。如果将 GBase 8s 的内建的解密函数应用到未加密的数据,则它们会失败并报错 -26005。避免此错 误的最简单的办法是使用列级加密而不是单元级加密。 如果您不使用加密函数,则人们可将未加密的数据输入到本应包含加密的数据的 列内。要确保输入到字段中的数据总是加密了的,请使用视图和 INSTEAD OF 触发器。 保护口令 您以 SET ENCRYPTION PASSWORD 声明的口令和提示不会以明文存储在系统 目录的任何表内,系统目标中也不维护包含加密的数据的列或表的记录。 然而,要防止其他用户访问加密的数据或口令的明文,您必须避免可能违反口令 的保密性的活动: 不要使用解密函数创建函数的索引。(这可能会在数据库中存储明文,达 不到加密的目的。) 在不安全的网络上,总是以加密的数据工作或使用会话加密,因为在客户 端与服务器之间的 SQL 通信以明文发送要被加密的口令、提示和数据。 不要在将口令暴露给公众的触发器或 UDR 中存储口令。 GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 1002 不要在创建任何视图、触发器、过程或 UDR 之前设置会话口令。仅当 您使用对象时才设置会话口令。否则,该口令可能在该模式中对其他用户 可见,且通过其他用户执行的查询可能返回未加密的数据。下列示例展示 包括加密的口令的过程: -- reset session encryption password set encryption password null; -- create procedure without password create procedure p1 (); insert into tab2 select (decrypt_char (col1)) from tab1; end procedure; -- set session encryption password set encryption password ("PASSWD2"); -- insert data insert into tab1 values (encrypt_aes ('WXY')); -- call procedure 从 SET EXPLAIN 语句的输出总是显示 password 和 hint 参数为 XXXXX,而不 显示实际的 password 或 hint 值。