在之前的《海量智库》安全系列,我们分别介绍了Vastbase G100数据库的访问控制和审计功能,受到了广泛欢迎。Vastbase G100构建起的安全能力模型,全链路保障数据安全,让恶意用户攻不破、进不来、拿不走。全密态方案进一步加强了对于隐私数据的保护,让敏感数据不可见。
近年来,随着行业标准和政策的联合推动,数据安全越来越得到大家的重视,如何在充分释放数据价值的同时,又能保障数据安全?Vastbase G100全密态为数据保驾护航。
是什么?
全密态数据库介绍
全密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传输、运算以及存储的各个环节始终都处于密文状态。
当数据拥有者在客户端完成数据加密并发送给服务端后,如果攻击者借助系统脆弱点窃取用户数据,仍然无法获得任何有效的价值信息,以此来保护数据隐私。
工作模型如下图所示:
全密态数据库目前支持两种连接方式:vsql连接和jdbc连接
全密态数据库有两种密钥:
CMK(客户端主密钥):用于加密CEK
CEK(列加密密钥):用于加密用户数据
实现全密态数据库,需先创建CMK、然后创建 CEK、最后创建加密表,指定某一列使用CEK加密数据。全密态场景下业务SQL中的关键信息将被加密,以密文的形式发送到数据库端,查询结果也以密文的形式返回客户端。
工作模型如下图所示:
下面,通过两个例子来介绍全密态数据库的使用:
示例1
vsql中使用全密态
首先需要了解创建CMK和CEK的语法:
1
创建客户端主秘钥CMK
语法格式:
CREATE CLIENT MASTER KEY client_master_key_name [WITH] ( ['KEY_STORE' , 'KEY_PATH' , 'ALGORITHM'] );
参数说明
client_master_key_name:该参数作为密钥对象名,在同一命名空间下,需满足命名唯一性约束;取值范围:字符串,需符合标识符的命名规范;
WITH:必选关键字,没有实际的作用;
KEY_STORE:指定管理CMK的密钥工具或组件, KEY_STORE负责管理多个CMK密钥;取值:目前仅支持localkms;
KEY_PATH:用于在KEY_STORE中唯一标识CMK;取值类似:“key_path_value”;
ALGORITHM:该参数用于指定加密算法的类型;取值范围:RSA_2048、RSA_3072和SM2。
2
创建列加密秘钥CEK
语法格式:
CREATE COLUMN ENCRYPTION KEY column_encryption_key_name [WITH] [VALUES] ( ['CLIENT_MASTER_KEY' , 'ALGORITHM'] );
参数说明
column_encryption_key_name:该参数作为密钥对象名,在同一命名空间下,需满足命名唯一性约束;取值范围:字符串,要符合标识符的命名规范;
CLIENT_MASTER_KEY:指定用于加密本CEK的CMK;取值为:CMK对象名,该CMK对象由CREATE CLIENT MASTER KEY语法创建;
ALGORITHM:指定该CEK将用于何种加密算法;
取值范围为:AEAD_AES_256_CBC_HMAC_SHA256、AEAD_AES_128_CBC_HMAC_SHA256和SM4、SM3。
接下来我们以SM4算法为例做一个简单的演示:
1
使用-C参数登录后创建CMK
点击放大查看图片↑
2
创建表并指定列使用加密秘钥
点击放大查看图片↑
3
插入明文数据,然后更新或查询仍返回明文记录
点击放大查看图片↑
4
登录不使用-C参数
查询到的加密列信息将是密文显示
点击放大查看图片↑
可以看到如果登录时不使用-C参数,相当于绕开了CMK,则显示的就是密码文。
示例2
jdbc中使用全密态
用户CMK秘钥与客户端相关,不能通用。
vsql创建的客户端秘钥不能用于JDBC客户端;JDBC客户端创建的秘钥也不能用于vsql。
JDBC连接数据库需要设置参数enable_ce=1表示通过全密态连接。
下面是一个简单的例子:
import java.sql.*;
import java.util.*;
class JDBC_TESRRSA{
public static void main(String[] args) {
Locale.setDefault(Locale.US);
String driver = "org.postgresql.Driver";
String url =
"jdbc:postgresql://172.16.55.169:8888/vastbase?enable_ce=1";
String user = "test";
String password = "xxxxxxx";
ResultSet rs = null;
try(Connection conn = DriverManager.getConnection(url, user, password)){
Class.forName(driver);
Statement stmt = conn.createStatement();
stmt.execute("CREATE CLIENT MASTER KEY ImgCMK_a1 WITH ( KEY_STORE = localkms, KEY_PATH = \"key_path_value11\" , ALGORITHM = SM2)");
stmt.execute("CREATE COLUMN ENCRYPTION KEY ImgCEK_a1 WITH VALUES (CLIENT_MASTER_KEY = ImgCMK_a1, ALGORITHM = SM4_SM3);");
stmt.execute("CREATE TABLE creditcard_info (id_number int, name varchar(50) encrypted with (column_encryption_key = ImgCEK_a1, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = ImgCEK_a1, encryption_type = DETERMINISTIC));");
stmt.execute("INSERT INTO creditcard_info VALUES (1,'joe','6217986500001288393');");
rs = stmt.executeQuery("select * from creditcard_info where name = 'joe';");
List<String>list = new ArrayList<String>();
while (rs.next()){
list.add(rs.getString(2));
}
if (list != null && list.size()>0){
String[] arr = new String[list.size()];
for (int i=0;i<list.size();i++){ arr[i]="list.get(i);" }
for (String s : arr){ System.out.println(s);};
}
stmt.close();
} catch(Exception exception){
exception.printStackTrace();
}
}
}
↑上下滑动查看更多↓
Vastbase G100全密态数据库,让用户自己持有数据加解密密钥,有效化解恶意攻击,保障企业数据全生命周期的隐私安全。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!