作为应用最广泛的信息存储和处理系统,数据库中存在大量敏感数据,如何防止数据被窃取和篡改是重中之重。加密技术是提高数据库安全的一个重要手段。
但不是什么加密方法和方式都是适合数据库的,在加密数据的同时,也会带来一些相关问题,如果处理不好,不仅会降低数据库的安全性,而且还会带来其它如性能的影响。
UXDB安全数据库提供了几个不同级别的加密,并且在保护数据不会因为数据库服务器偷窃、不道德的管理员、不安全网络等因素而泄漏。加密也是保护一些诸如医疗记录或财务交易等敏感数据所要求的。
整个数据库加密,就是对数据库中所有的系统表、数据表、索引、视图和存储过程等进行加密处理。这种加密方法简单快捷,只需对相应数据库文件进行加密处理即可,对于企业或者用户简单的备份整个数据库,可以采取这种操作更加方便。但是数据库中的数据共享性高,会同时被多个用户和应用访问使用,因此,全库加密会对系统性能会产生一定的影响。
只需在初始化的时候加上-M参数就可以进行全库加密。
创建对象并插入数据,通过查看数据文件中的数据是否是密文来验证全库加密。
初始化集群时用参数M指定对存储文件加密,并启动:
./initdb -k fnv -M -W -D uxdb_enc ./ux_ctl -M -D uxdb_enc start
登录控制台,创建表并插入数据:
CREATE TABLE sjjm(no int, name varchar(32)); INSERT INTO sjjm VALUES(1, 'pizza'); INSERT INTO sjjm VALUES(2, 'sandwich'); CHECKPOINT;
查询表文件的路径:
SELECT ux_relation_filepath('sjjm');
进入集群目录查看表文件:
表文件全是密文。
默认情况下,UXDB安全数据库用户的口令以 MD5 哈希的方式存储, 所以管理员无法判断赋予用户的实际口令。如果 MD5 被加密用于客户端认证, 那么未加密的口令甚至都不可能临时出现在服务器上,因为客户端在透过网络发送口令之前,就先用 MD5 加密过。
登录加密数据库创建用户并设定密码:
create user test password '1qaz!QAZ';
查看密码:
select usename,passwd from ux_shadow ;
uxcrypto模块允许对特定域进行加密存储。这个功能只对某些敏感数据有用。 客户端提供解密的密钥,然后数据在服务器端解密并发送给客户端。
在数据被解密和在服务器与客户端之间传递时,解密数据和解密密钥将会在服务器端存在短暂的一段时间。 这就给那些能完全访问数据库服务器的人提供了一个短暂的截获密钥和数据的时间,例如系统管理员。
登录加密数据库加载uxcrypto插件:
CREATE EXTENSION uxcrypto;
创建测试表:
CREATE TABLE sjjm_01(id int, name varchar(64), pwd varchar(128));
以不同的加密方式插入数据:
INSERT INTO sjjm_01 VALUES (1, 'zhang',digest('1qaz!QAZ','md5')); INSERT INTO sjjm_01 VALUES (2, 'wang',digest('1qaz!QAZ','sha1')); INSERT INTO sjjm_01 VALUES (3, 'huang', encrypt('1qaz!QAZ','aa','aes'));
查看表:
SELECT * FROM sjjm_01;
aes是可逆加密。
SELECT convert_from(decrypt('\xa998f73e7f15a1895bf3a863e4eadbb9','aa','aes'),'SQL_ASCII');
批量加密指定列数据,既可以指定不同的算法,可供选择的算法有AES-128、AES-192、AES-256、DES-64、DES-128、DES-196、SM4-128、SM2、SM3、SM9,又可以指定每次加密的数据条数。此功能同样是对表的特定域进行加密,只对某些敏感数据有用。
指定列批量加密功能既可以通过可视化界面UXKMS操作,又可以通过后台命令行工具操作。UXKMS中可创建用户映射、对表指定列进行加密信息配置、数据批量加密、数据脱密、数据同步等功能。
ux_authority模块创建inuser用户并保存特定用户对某表的指定列所拥有的加密、解密权限及秘钥等相关信息。当没有此权限的用户执行批量数据加密直接返回失败,相反,加密或者解密成功。
加密后的密文数据显示形式可设置,包含‘*****’和十六进制密文两种形式,通过修改配置文件uxsino.conf中参数display_mode。
登录数据库加载插件ux_authority
CREATE EXTENSION ux_authority;
创建普通用户test
CREATE USER test WITH PASSWORD '1qaz!QAZ';
切换至test用户并创建测试表、插入10条数据
\c uxdb test CREATE TABLE stu (nu int,name varchar(256));
INSERT into stu values(1,'wang'); INSERT into stu values(2,'zhang'); INSERT into stu values(3,'hu'); INSERT into stu values(4,'huang'); INSERT into stu values(5,'li'); INSERT into stu values(6,'song'); INSERT into stu values(7,'liu'); INSERT into stu values(8,'han'); INSERT into stu values(9,'hang'); INSERT into stu values(10,'xia');
切换至inuser用户配置指定列加密相关信息
SELECT inuser.IUD_authorized_user('test','{keyname1}','{1}','{0}');
第一个参数:被授权的用户名。
第二个参数:秘钥名。
第三个参数:加密权限,1代表有权限,0代表无权限。
第四个参数:解密权限,1代表有权限,0代表无权限。
SELECT inuser.IU_encrypted_column('uxdb','test','stu','name','keyname1','AES-128', 'ECB','none',0,'iv1','key_value1','o_data_type1','n_data_type1',1,'2015/10/12'::timestamp, '2016/10/12'::timestamp,1);
第一个参数:数据库名。
第二个参数:表的拥有者名。
第三个参数:表名。
第四个参数:列名。
第五个参数:秘钥名。
第六个参数:算法名。
第七个参数:加密模式。
第八个参数:padding模式。
第九个参数:iv类型。
第十个参数:iv填充字符串。
第十一个参数:密钥值。
第十二个参数:原字段类型。
第十三个参数:加密字段类型。
第十四个参数:加密字段长度。
第十五个参数:密钥生效时间。
第十六个参数:密钥过期时间。
第十七个参数:操作类型,1代表插入,2代表更新,3代表删除。
切换回test用户,执行name列批量数据加密
\c uxdb test SELECT data_migration('test', 'stu', 'name', 'bytea', 1, 100);
第一个参数:模式名。
第二个参数:表名。
第三个参数:列名。
第四个参数:加密后的数据类型,固定为bytea。
第五个参数:该列配置信息表中的第一个字段encrpt_clmn_id值。
第六个参数:批量加密的数据条数。
查看加密后的数据
SELECT * from stu;
查看脱密后的数据
切换至inuser用户向test用户授权解密权限。
\c uxdb inuser SELECT inuser.IUD_authorized_user('test','{keyname1}','{1}','{1}');
切换至test用户查看解密后的数据结果。
\c uxdb test SELECT * from stu;
跨网络加密口令:
MD5认证方法在将口令发送给服务器之前由客户端对它进行双重加密。第一次 MD5 加密是基于用户名的, 然后在建立数据库连接时,服务器再次加密口令。通过网络传递给服务器的就是这个双重加密的值。双重加密 不仅可以防止口令被发现,还可以防止稍后另一个连接使用同样的加密口令连接数据库。
跨网络加密数据:
SSL 连接加密所有跨网络发送的数据:口令、查询以及返回的数据。ux_hba.conf文件允许管理员指定哪些主机可以使用 非加密连接(host),以及哪些主机需要使用 SSL 加密的连接(hostssl)。客户端还可以指定它们只通过 SSL 连接到服务器。澳门游戏平台注册网站还可以使用Stunnel或SSH加密传输。
SSL主机认证:
客户端和主机都可以提供 SSL 证书给对方。这在两边都需要一些额外的配置, 但是这种方式提供了比仅使用口令更强的身份验证。 它避免一个计算机伪装成服务器,这个时长只要足够读取客户端发送的口令就行了。它还避免了 “中间人”攻击,在其中有一台计算机处于客户端和服务器之间并伪装成服务器读取和传递两者之间的所有数据。