1. SinoDB列级别加密
-
支持内置 SQL 功能
所有加密和解密值都通过 SQL语句调用内置函数实现。 -
符合OpenSSL 0.9.7c标准
-
支持 128 bit AES 和 Triple DES
-
最多 128 字符密码/短语
-
字符数据类型
-
会话级别密码管理
SQL语句支持会话级别密码管理。这样使得用户能够为整个会话设置密码,包括调用该会话中的视图、触发器和存储过程。 -
首次加密时,会有一个加密 VP 自动启动, 也可以通过VPCLASS和onmode -p实用程序来启动多个 VP以提升加密/解密性能。
-
存储考虑
加密值比解密值占用更多空间。加密一数据字段之前,要确保加密的数据符合字段定义的长度要求。如果加密数据不符合字段长度的要求,则数据将被截断,也不可再解密。
2. 列级别解密语法与示例
2.1 语法
ENCRYPT_AES(data [,password [, hint]]) --用于加密数据
ENCRYPT_TDES(data [,password [, hint]]) --用于加密数据
DECRYPT_CHAR(encrypted_data [, password]) --用于解密大多数内置的字符数据类型
DECRYPT_BINARY(encrypted_data [, password]) --用于解密 BLOB 和 CLOB 数据类型。
GETHINT(encrypted_data) --返回与数据字段或单元格一起存储的提示消息。
SET ENCRYTPION PASSWORD password [ WITH HINT hint ] --为整个会话设置密码
ENCRYPT_TDES 函数返回一个值,该值是通过将 TDES(三重数据加密标准,有时也称为 DES3)算法应用于其第一个参数来加密字符表达式或 BLOB 或 CLOB 值的结果。此算法比 ENCRYPT_AES 函数使用的 AES 算法慢,但被认为更安全。加密开销所需的磁盘空间类似于 ENCRYPT_AES,但由于 ENCRYPT_TDES 的块大小较小,因此略小。
对于 BLOB 或 CLOB 值,加密对象将临时存储在 SBSPACENAME 配置参数指定的缺省 sbspace 中。
如果用户运行 SET ENCRYPTION PASSWORD的 SQL 语句,则在同一个会话里运行的其他语句不能再内嵌密码。注意语法显示密码是可选的( 在 [ ]内 )。
2.2 示例
① 对非数值型数据加密
> create table t55(id int,salary int);
Table created.
> insert into t55 values (1,encrypt_tdes('3000','mypassword'));
1213: A character to numeric conversion process failed
Error in line 1
Near character position 59
>
由以上测试可以看到,不能对非字符型数据进行加密。
② 对字符型数据加密
> create table employee (name char(30), bankcard varchar(60));
Table created.
> insert into employee VALUES ('smith',encrypt_aes('1234567890','mypassword'));
1 row(s) inserted.
> insert into employee values ('yangming',encrypt_tdes('1234567890','mypassword'));
1 row(s) inserted.
> select * from employee;
name smith
bankcard 0Jtn/AAAAEAU6loLu7RljWBVWHW9m/VUxEYQGkzsWqS
name yangming
bankcard 1v0D/AAAAEAjPHB6R+mUBCZz3EBARqxHR6vhyA9bK/G
2 row(s) retrieved.
>
注: ‘1234567890’ 为明文,‘mypassword’ 为密钥 ,’ 0Jtn/AAAAEAU6loLu7RljWBVWHW9m/VUxEYQGkzsWqS‘ 为密文
③ 解密
> select name,DECRYPT_CHAR(bankcard,'mypassword') from employee;
name smith
(expression) 1234567890
name yangming
(expression) 1234567890
2 row(s) retrieved.
>
④ 密钥有误
> select name,DECRYPT_CHAR(bankcard,'err mypassword') from employee;
26008: The internal decryption function failed.
Error in line 1
Near character position 64
>
错误“26008: The internal decryption function failed.” 提示解密失败。
⑤ 密文过长
> insert into employee values ('lucy',encrypt_aes('我的明文比较长,加密后会超过字段长度!','mypassword'));
1 row(s) inserted.
> select * from employee;
name smith
bankcard 0Ms3/AAAAEAnbj7tZv8cPcXjXksBanH55wligHbKCiY
name yangming
bankcard 1l2j/AAAAEAuMmf6/+CIjm845ALBfegiHV0S3uFBXlB
name lucy
bankcard 0/AP/AAAAQAew8+uMYfJ14usC6v1fD7ZpySiR2zeFS4FB8wNfv1acLhBr5uv
3 row(s) retrieved.
> select name,DECRYPT_CHAR(bankcard,'mypassword') from employee;
name smith
(expression) 1234567890
name yangming
(expression) 1234567890
26012: The internal base64 decoding function failed.
Error in line 1
Near character position 60
以上测试可以看到,因为该字段bankcard varchar(60) 最长为60个字符,加密后密文超过该长度自动截断后存储,导致无法解密,解密时报错“26012: The internal base64 decoding function failed.”
⑥ 测试SET ENCRYTPION PASSWORD
> drop table employee;
Table dropped.
> create table employee (name char(30), bankcard varchar(200));
Table created.
> insert into employee VALUES ('smith','1234567890');
1 row(s) inserted.
> insert into employee values('lily','3456890187');
1 row(s) inserted.
> select * from employee;
name smith
bankcard 1234567890
name lily
bankcard 3456890187
2 row(s) retrieved.
> SET ENCRYPTION PASSWORD 'mypassword' with hint 'password';
Encryption password set.
> update employee set bankcard=encrypt_tdes(bankcard);
2 row(s) updated.
> select * from employee;
name smith
bankcard 1uEcQAAAAEAJoR7jTvij2LaqnjS/f//584N37t9KO5kEuosl+92/aVvCozjjhcB2w==
name lily
bankcard 1p1gQAAAAEABuM0krSMCScsdRKq4YZwthZC/tXaRScgEuosl+92/aVvCozjjhcB2w==
2 row(s) retrieved.
> select name,DECRYPT_CHAR(bankcard,'mypassword') from employee;
name smith
(expression) 1234567890
name lily
(expression) 3456890187
2 row(s) retrieved.
⑦ 测试GETHINT
> select name,gethint(bankcard) from employee;
name (expression)
smith password
lily password
2 row(s) retrieved.