SinoDB列级别加密简介

1. SinoDB列级别加密

  • 支持内置 SQL 功能
    所有加密和解密值都通过 SQL语句调用内置函数实现。

  • 符合OpenSSL 0.9.7c标准

  • 支持 128 bit AES 和 Triple DES

  • 最多 128 字符密码/短语

  • 字符数据类型

  • 会话级别密码管理
    SQL语句支持会话级别密码管理。这样使得用户能够为整个会话设置密码,包括调用该会话中的视图、触发器和存储过程。

  • 首次加密时,会有一个加密 VP 自动启动, 也可以通过VPCLASSonmode -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.