数据安全是数据库安全性的核心要素,基于全库、表、列、行等级别对敏感数据进行加密保护,不影响业务系统的正常访问(对应用系统“透明”),加密技术是提高数据库安全的一个重要手段。

优炫数据库采用全库加密、列加密、表、行级访问授权、通信信道加密、基于会话的访问隔离、内置数据库审计等措施保证数据安全。

支持国密等算法、硬件加密与密钥管理,支持 SM2、SM3、SM4、SM9 国密加密算法和 AES、DES、3DES、Blowfish、RC4 等国际标准加密算法。明文、密文存储相结合,保证加密前后的查询性能相近;提供用户加解密权限,灵活控制用户访问敏感数据,满足敏感数据加密存储与应用。

本期,我们分享两个列加密的方法:

UXDB支持对列进行加解密,加解密借助uxcrypto完成。用户需要指定密钥进行对敏感列的加密或者解密。

加密时,需要将密钥和明文数据发送到UXDB端,UXDB进行加密并存储密文

解密时,数据在UXDB数据库端进行解密,然后将解密的结果发送给客户端。

当进行加解密的时候,密钥和数据仅在UXDB端存在极短的时间并全部在内存中,用过即丢弃。

01

数据准备

创建外部模块

create extension uxcrypto;

创建测试表

create table test_user(id serial,username varchar(32),password text);

给测试表创建索引

create unique index idx_test_user_username on test_user using btree(username);

查看测试表结构

\d test_user

Table "public.test_user"
Column | Type | Collation | Nullable | Default
----------+-----------------------+-----------+----------+---------------------------------------
id | integer | | not null | nextval('test_user_id_seq'::regclass)
username | character varying(32) | | |
password | text | | |
Indexes:
"idx_test_user_username" UNIQUE, btree (username)

02

md5 加密

插入测试用户信息,使用md5加密方法给password列值进行数据加密。

insertintotest_user(username,password)values('user1',md5('123456'));

insertintotest_user(username,password)values('user2',md5('123456'));

查询用户信息

select * From test_user;

id | username | password
----+----------+----------------------------------
1 | user1 | e10adc3949ba59abbe56e057f20f883e
2 | user2 | e10adc3949ba59abbe56e057f20f883e
(2 rows)

认证测试,如果用户输入password的是123456,则通过认证。

select * From test_user where password=md5('123456');

id | username | password
----+----------+----------------------------------
1 | user1 | e10adc3949ba59abbe56e057f20f883e
2 | user2 | e10adc3949ba59abbe56e057f20f883e
(2 rows)

备注:使用 md5 加密,密文相同,加密结果也相同,通过结果可推知密文,保密性不够强。

03

crypt()函数加密

使用 crypt() 函数增加两条用户信息 插入测试用户信息,使用crypt加密方法给password列值进行数据加密。

insertintotest_user(username,password)values('user3',crypt('123456',gen_salt('md5')));

insertintotest_user(username,password)values('user4',crypt('123456',gen_salt('md5')));
/*gen_salt('md5')生成一个随机字符串,可接受des, xdes, md5 和 bf算法*/

查询新增用户信息

select*Fromtest_userwhereusernamein('user3','user4');

id| username |password
----+----------+------------------------------------
3 | user3 | $1$7wuaFG8c$2A7IIKlnO7M3DRGhmVGSB.
4 | user4 | $1$8CePi7UZ$I/O0jCKSTa6ENxuXooLYX1
(2rows)

认证测试,如果用户输入password的是123456,则通过认证。

select*Fromtest_userwherepassword=crypt('123456',password);

id| username |password
----+----------+------------------------------------
3 | user3 | $1$7wuaFG8c$2A7IIKlnO7M3DRGhmVGSB.
4 | user4 | $1$8CePi7UZ$I/O0jCKSTa6ENxuXooLYX1
(2rows)

备注:虽然 user3,user4 使用相同的密码,但经过 crypt() 函数加密后,加密后的密码值不同,显然,crypt()函数加密比 md5 安全。