一、 数据加密函数
你可以将 SET ENCRYPTION PASSWORD 语句与内置 SQL 加密函数(使用 Advanced
Encryption Standard (AES)和 Triple DES (3DES)加密)一起使用来保护你的敏感数据。
如果使用加密,只有拥有正确密码的用户才能读取、复制或修改数据。
将SET ENCRYPTION PASSWORD 语句与下列内置加密和解密函数一起使用 :
• ENCRYPT\_AES
ENCRYPT\_AES(data-string-expression
\[, password-string-expression \[, hint-string-expression \]\])
• ENCRYPT\_TDES
ENCRYPT\_TDES (data-string-expression
\[, password-string-expression \[, hint-string-expression \]\])
• DECRYPT\_CHAR
DECRYPT\_CHAR(EncryptedData \[, PasswordOrPhrase\])
• DECRYPT\_BINARY
DECRYPT\_BINARY(EncryptedData \[, PasswordOrPhrase\])
• GETHINT
GETHINT(EncryptedData)
如果你使用了 SET ENCRYPTION PASSWORD 语句来指定缺省密码,那么数据库服务器
将该密码应用于同一会话中调用的对加密和解密函数的后续调用中。
使用 ENCRYPT\_AES 和 ENCRYPT\_TDES 定义加密的数据,使用 DECRYPT\_CHAR 和 DECRYPT\_BINARY 查询加密的数据。使用 GETHINT 显示密码提示符(如果在服务器上设置了该字符串)。
可以使用这些 SQL 内置函数来实现列级别或单元级别加密。
使用列级别加密,用相同的密码为给定列上的所有值加密。
使用单元级别加密,用不同的密码为列内的数据加密。
提示: 如果想从大型表中选择加密数据,请指定未加密的列。在其中选择行,可对包含加密数
据的列创建索引或外键约束,但是这样做对资源使用的效率较低,原因是查询优化器不使用此
类索引和外键约束。
1、 使用列级别数据加密来保护信用卡数据
下列示例使用列级别加密来保护信用卡数据。
使用列级别加密来保护信用卡数据:
1. 创建表:create table customer (id char(30), creditcard lvarchar(67));
2. 插入加密数据:
a. 设置会话密码:SET ENCRYPTION PASSWORD "credit card number is encrypted";
b. 加密数据。
INSERT INTO customer VALUES
("Alice", encrypt\_aes("1234567890123456"));
INSERT INTO customer VALUES
("Bob", encrypt\_aes("2345678901234567"));
3. 使用解密函数查询加密数据。
SET ENCRYPTION PASSWORD "credit card number is encrypted";
SELECT id FROM customer
WHERE DECRYPT\_CHAR(creditcard) = "2345678901234567";
重要: 加密数据值比相应的未加密数据占用更多的存储空间。列宽足够存储明文的列可能需要
增大宽度才能支持列级别加密或单元级别加密。如果要将加密值插入声明宽度小于加密字符串
的列,那么列存储截断后的值,该值无法被解密。




