• 【好文推荐】openGauss 5.0.0 数据库安全——全密态探究


    前言

    写此文章的目的,主要是验证:

    • openGauss 5.0.0 数据库能够实现哪种加密方式的全密态

    • 全密态数据库的特点

    一、全密态介绍

    ffc984858dbb5ecc6a24446e3822b6a3.jpeg
    b40739ab6f9754eda08083b23549f1ca.jpeg
    全密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传输、运算以及存储的各个环节始终都处于密文状态。当数据拥有者在客户端完成数据加密并发送给服务端后,在攻击者借助系统脆弱点窃取用户数据的状态下仍然无法获得有效的价值信息,从而起到保护数据隐私的能力。

    由于整个业务数据流在数据处理过程中都是以密文形态存在,通过全密态数据库,可以实现:

    • 1)保护数据在云上全生命周期的隐私安全。无论数据处于何种状态,攻击者都无法从数据库服务端获取有效信息。

    • 2)帮助云服务提供商获取第三方信任。无论是企业服务场景下的业务管理员、运维管理员,还是消费者云业务下的应用开发者,用户通过将密钥掌握在自己手上,使得高权限用户无法获取数据有效信息。

    • 3)让云数据库服务借助全密态能力更好的遵守个人隐私保护方面的法律法规。

    全密态数据库目前支持两种连接方式:gsql连接和jdbc连接。

    二、环境准备

    本次实验使用的操作系统是centos7.9,openGauss版本是5.0.0,实验直接在一台服务器上面进行。

    • 操作系统
      6f2e09cc7e9b6670c9b6975acda76943.jpeg

    • 数据库版本

      c6f0776fe78897625896ed770584606f.jpeg

    三、实验过程

    1、创建用户

    使用管理员用户登录,然后参加一个qmttest用户,密码设置为"qwer1234!@#$"

    CREATE USER qmttest PASSWORD 'qwer1234!@#$';

    b220c016fd820bec189f816e0ee2aab1.jpeg

    使用qmttest用户登录,连接密态数据库.

    -C:是打开密态开关

    gsql -p 15400 -d postgres -U qmttest -r -C

    14587669c17e3a62deff98864aacc3f1.jpeg

    2、创建用户密钥

    全密态数据库有两种密钥,即客户端主密钥CMK和数据加密密钥CEK。CMK用于加密CEK,CEK用于加密用户数据。密钥创建的顺序和依赖依次为:创建CMK > 创建CEK。

    从这里开始验证加密方式的组合。

    序号 主密钥CMK 数据加密密钥CEK 1 RSA_2048 AEAD_AES_256_CBC_HMAC_SHA256 2 RSA_3072 AEAD_AES_128_CBC_HMAC_SHA256 3 SM2 SM4_SM3 2.1 创建客户端主密钥CMK

    密钥存储路径:默认情况下,localkms将在(LOCALKMS_FILE_PATH)路径下生成/读取/删除密钥文件,用户可手动配置该环境变量。但是,用户也可以不用单独配置该环境变量,在尝试获取LOCALKMS_FILE_PATH失败时,localkms会尝试获取($GAUSSHOME/etc/localkms/)路径,如果该路径存在,则将其作为密钥存储路径。密钥相关文件名:使用CREATE CMK语法时,localkms将会创建四个与存储密钥相关的文件。示例:当KEY_PATH = “key_path_value”, 四个文件的名称分别为key_path_value.pub、key_path_value.pub.rand、 key_path_value.priv、 key_path_value.priv.rand。所以,为了能够成功创建密钥相关文件,在密钥存储路径下,应该保证没有已存在的与密钥相关文件名同名的文件。

    2.1.1 RSA_2048
    使用RSA_2048加密算法进行创新CMK 名称:qmt_rsa2048CREATE CLIENT MASTER KEY qmt_rsa2048 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_rsa2048", ALGORITHM = RSA_2048);

    91ac3418c7a89d854c2c6a995dd1cf1f.jpeg
    查看生成的相应加密文件

    421c82129f1467ee54c9f211fbc2795e.jpeg

    2.1.2 RSA_3072
    使用RSA_3072加密算法进行创建CMK 名称:qmt_RSA3072CREATE CLIENT MASTER KEY qmt_RSA3072 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_RSA3072", ALGORITHM = RSA_3072);
    c14b3def2e2eb5e415cee3f0263685e6.jpeg
    查看生成的相应加密文件
    c7a4a4ea4b09be7ba7febd6cef8d0cad.jpeg
    2.1.3 SM2
    使用SM2加密算法进行创建CMK 名称:qmt_SM2CREATE CLIENT MASTER KEY qmt_SM2 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_SM2", ALGORITHM = SM2);

    81349a80d16c5dc34c5d477a22bae570.jpeg
    查看生成的相应加密文件
    dee39844c07444e10d053476ea4cd412.jpeg

    2.2 创建数据加密密钥CEK

    2.2.1 AEAD_AES_256_CBC_HMAC_SHA256
    使用 RSA_2048 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK 名称:RSA_2048_256_CEKCREATE COLUMN ENCRYPTION KEY RSA_2048_256_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_rsa2048, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);

    c470fc5332fdaa646375497953400b80.jpeg

    使用 RSA_3072 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK 名称:RSA_3072_256_CEKCREATE COLUMN ENCRYPTION KEY RSA_3072_256_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_RSA3072, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);

    0f0a4a2430ad918cab0b320be1f47e4c.jpeg

    使用 SM2 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK 名称:SM2_256_CEK 创建失败CREATE COLUMN ENCRYPTION KEY SM2_256_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_SM2, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);

    有报错

    ERROR(CLIENT): National secret algorithm must be used together.

    国家密码算法必须一起使用

    e118e16a444cf742f618949c4586adba.jpeg

    2.2.2 AEAD_AES_128_CBC_HMAC_SHA256
    使用 RSA_2048 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK 名称:RSA_2048_128_CEKCREATE COLUMN ENCRYPTION KEY RSA_2048_128_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_rsa2048, ALGORITHM = AEAD_AES_128_CBC_HMAC_SHA256);

    a81ce2a0e0531c370ff1b072da98f98d.jpeg

    使用 RSA_3072 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK

    名称:RSA_3072_128_CEK

    CREATE COLUMN ENCRYPTION KEY RSA_3072_128_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_RSA3072, ALGORITHM = AEAD_AES_128_CBC_HMAC_SHA256);

    6e1db1989e47a5972efcb80ebd168ca3.jpeg

    使用 SM2 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK 名称:SM2_128_CEK 创建失败CREATE COLUMN ENCRYPTION KEY SM2_128_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_SM2, ALGORITHM = AEAD_AES_128_CBC_HMAC_SHA256);

    有报错

    ERROR(CLIENT): National secret algorithm must be used together.

    国家密码算法必须一起使用

    032722a009d9a41e208555b4e663d15a.jpeg

    2.2.3 SM4_SM3
    使用 RSA_2048 + SM4_SM3 创建CEK 名称:RSA_2048_SM4_SM3_CEK 创建失败CREATE COLUMN ENCRYPTION KEY RSA_2048_SM4_SM3_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_rsa2048, ALGORITHM =SM4_SM3);

    有报错

    ERROR(CLIENT): National secret algorithm must be used together.

    国家密码算法必须一起使用

    6062c181303c46588c99b6e128f73687.jpeg
    使用 RSA_3072 + SM4_SM3 创建CEK

    名称:RSA_3072_SM4_SM3_CEK

    创建失败

    CREATE COLUMN ENCRYPTION KEY RSA_3072_SM4_SM3_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_RSA3072, ALGORITHM = SM4_SM3);

    有报错

    ERROR(CLIENT): National secret algorithm must be used together.

    国家密码算法必须一起使用

    9b0897529a93ac7f7d803797f97fc316.jpeg

    使用 SM2 + SM4_SM3 创建CEK

    名称:SM2_SM4_SM3_CEK

    CREATE COLUMN ENCRYPTION KEY SM2_SM4_SM3_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_SM2, ALGORITHM = SM4_SM3);

    d21d5a68ed4a4a199f50a446cea1b6ac.jpeg

    2.3 总结

    序号 数据加密密钥CEK 主密钥CMK 组合名称 是否创建成功 1 AEAD_AES_256_CBC_HMAC_SHA256 RSA_2048 RSA_2048_256_CEK 2 AEAD_AES_256_CBC_HMAC_SHA256 RSA_3072 RSA_3072_256_CEK 3 AEAD_AES_256_CBC_HMAC_SHA256 SM2 SM2_256_CEK 4 AEAD_AES_128_CBC_HMAC_SHA256 RSA_2048 RSA_2048_128_CEK 5 AEAD_AES_128_CBC_HMAC_SHA256 RSA_3072 RSA_3072_128_CEK 6 AEAD_AES_128_CBC_HMAC_SHA256 SM2 RSM2_128_CEK 7 SM4_SM3 RSA_2048 RSA_2048_SM4_SM3_CEK 8 SM4_SM3 RSA_3072 SA_3072_SM4_SM3_CEK 9 SM4_SM3 SM2 SM2_SM4_SM3_CEK

    国密加密算法 SM2 SM4_SM3 不能和其他加密方式组合。

    目前创建数据加密密钥CEK是成功的,下面进行使用测试。

    3、表加密测试

    3.1 使用RSA_2048_256_CEK创建加密表

    • 表名称:RSA_2048_256_TB

    CREATE TABLE RSA_2048_256_TB (id_number int, name text encrypted with (column_encryption_key = RSA_2048_256_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_2048_256_CEK, encryption_type = DETERMINISTIC));

    2ada8ffb6aecf0046224ff94d3842515.jpeg

    • 插入数据

    INSERT INTO RSA_2048_256_TB VALUES (1,'joe','6217986500001288393');
    INSERT INTO RSA_2048_256_TB VALUES (2,'joy','6219985678349800033');

    57ce31e203e654ddec606cb64a1951fb.jpeg

    • 客户端查询数据

    select * from RSA_2048_256_TB;

    e7aa31939bc1791d9bd767f7603af8ee.jpeg

    • 通过不加 -C 登录查询数据

    gsql -p 15400 -d postgres -U qmttest -r
    select * from RSA_2048_256_TB;

    246efe5e8314b22e0c667b9c85293da6.jpeg
    可以看出,数据已经加密。

    加密成功,查询成功

    3.2 使用RSA_3072_256_CEK创建加密表

    名称:RSA_3072_256_TB

    CREATE TABLE RSA_3072_256_TB (id_number int, name text encrypted with (column_encryption_key = RSA_3072_256_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_3072_256_CEK, encryption_type = DETERMINISTIC));

    7ff5b4c0a760a54ef03bc40ca03291d6.jpeg

    • 插入数据

    INSERT INTO RSA_3072_256_TB VALUES (1,'joe','6217986500001288393');
    INSERT INTO RSA_3072_256_TB VALUES (2,'joy','6219985678349800033');

    af03d6546dbfc8ff6f08b9ff6523aefe.jpeg

    • 客户端查询数据

    select * from RSA_3072_256_TB;

    cf89c91e786d4fcc0151a16e08664638.jpeg

    • 通过不加 -C 登录查询数据

    gsql -p 15400 -d postgres -U qmttest -r
    select * from RSA_3072_256_TB;

    040738819d17b1f12bab3c61ce08b97f.jpeg

    3.3 使用RSA_2048_128_CEK创建加密表

    名称:RSA_2048_128_TB

    CREATE TABLE RSA_2048_128_TB (id_number int, name text encrypted with (column_encryption_key = RSA_2048_128_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_2048_128_CEK, encryption_type = DETERMINISTIC));

    c345f7c2eebcc56ce49cb48e5e436250.jpeg

    • 插入数据

    INSERT INTO RSA_2048_128_TB VALUES (1,'joe','6217986500001288393');
    INSERT INTO RSA_2048_128_TB VALUES (2,'joy','6219985678349800033');

    9eb311bf3a02a40bec9b327b996813d1.jpeg

    • 客户端查询数据

    select * from RSA_2048_128_TB;

    f2b6b6df5cf2b42a71ec952ae015770b.jpeg

    • 通过不加 -C 登录查询数据

    gsql -p 15400 -d postgres -U qmttest -r
    select * from RSA_2048_128_TB;

    7aa8fff7fd2904024dc25dd8cf3a60dc.jpeg

    3.4 使用RSA_3072_128_CEK创建加密表

    名称:RSA_3072_128_TB

    CREATE TABLE RSA_3072_128_TB (id_number int, name text encrypted with (column_encryption_key = RSA_3072_128_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_3072_128_CEK, encryption_type = DETERMINISTIC));

    8fabcc33831f48a46c67e96a1528cd44.jpeg

    • 插入数据

    INSERT INTO RSA_3072_128_TB VALUES (1,'joe','6217986500001288393');
    INSERT INTO RSA_3072_128_TB VALUES (2,'joy','6219985678349800033');

    f1087556823d1742ac03ac7f064e9d18.jpeg

    • 客户端查询数据

    select * from RSA_3072_128_TB;

    d7f642633f3d5d190d981e617438a8a6.jpeg

    • 通过不加 -C 登录查询数据

    gsql -p 15400 -d postgres -U qmttest -r
    select * from RSA_3072_128_TB;

    40b14bf87c9d06b13a9b21e46377dd8d.jpeg

    3.5 使用SM2_SM4_SM3_CEK创建加密表

    名称:SM2_SM4_SM3_TB

    CREATE TABLE SM2_SM4_SM3_TB (id_number int, name text encrypted with (column_encryption_key = SM2_SM4_SM3_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = SM2_SM4_SM3_CEK, encryption_type = DETERMINISTIC));

    8c93eb067b5e769b7c6411a3932f025c.jpeg

    • 插入数据

    INSERT INTO SM2_SM4_SM3_TB VALUES (1,'joe','6217986500001288393');
    INSERT INTO SM2_SM4_SM3_TB VALUES (2,'joy','6219985678349800033');

    f0c3d8e762241e4ee146e59408c43c36.jpeg

    • 客户端查询数据

    select * from SM2_SM4_SM3_TB;

    96c6ea1a682a73f7b079ea7c0a4dda9d.jpeg

    • 通过不加 -C 登录查询数据

    gsql -p 15400 -d postgres -U qmttest -r
    select * from SM2_SM4_SM3_TB;

    5aaf882b139d05ade9f7f2388e7615e2.jpeg

    4、组合加密方式验证

    同一个表中,不同的列使用不同的加密方式。

    • 表名称:all_TB

    说明:不同的列,使用不同的加密方式。
    列id_number:不使用加密
    列name1:RSA_2048_256_CEK,列credit_card1:RSA_3072_256_CEK,
    列name2:RSA_2048_128_CEK,列credit_card2:RSA_3072_128_CEK,
    列name3:SM2_SM4_SM3_CEK

    CREATE TABLE all_TB (id_number int, name1 text encrypted with (column_encryption_key = RSA_2048_256_CEK, encryption_type = DETERMINISTIC),credit_card1 varchar(19) encrypted with (column_encryption_key = RSA_3072_256_CEK, encryption_type = DETERMINISTIC),name2 text encrypted with (column_encryption_key = RSA_2048_128_CEK, encryption_type = DETERMINISTIC),credit_card2 varchar(19) encrypted with (column_encryption_key = RSA_3072_128_CEK, encryption_type = DETERMINISTIC),name3 text encrypted with (column_encryption_key = SM2_SM4_SM3_CEK, encryption_type = DETERMINISTIC));

    365555d2d0230fbe39e01c91409e6277.jpeg

    • 插入数据

    INSERT INTO all_TB VALUES (1,'joe1','6217986500001288393','joe2','6217986500001288393','joe3');
    INSERT INTO all_TB VALUES (2,'joy1','6219985678349800033','joy2','6219985678349800033','joy3');

    badd334632a73d84dc57c428ad9199f1.jpeg

    • 客户端查询数据

    select * from all_TB;

    3c4852fb9e842178fd5322b1c426d1e2.jpeg

    • 通过不加 -C 登录查询数据

    gsql -p 15400 -d postgres -U qmttest -r
    select * from all_TB;

    bbc95a39f4befa023915b9cb4c6467fe.jpeg

    四、总结

    1. 在openGauss 3.0 版本中,国密SM2+SM4_SM3组合使用中,在查询时,是有问题的,openGauss 5.0.0 这个版本中,这个问题已经解决。

    2. 同一个表中,列可以是加密的,也可以是不加密的。

    3. 同一个表中,可以有不同的加密方式。

    4. 想要查询到明文,客户端必须有密钥文件,密钥文件需要进行妥善保管。


  • 相关阅读:
    java计算机毕业设计ssm+vue基本微信小程序的手机预约维修系统
    java计算机毕业设计社区卫生预约挂号系统源码+系统+mysql数据库+lw文档+部署
    【Java】中Maven依赖详解
    大话STL第一期——初识相见恨晚
    Java毕设项目基于的智慧小区计算机(附源码+系统+数据库+LW)
    如何购买阿里云香港服务器?又有什么什么好处呢?
    渗透工具-内网权限维持-Cobalt strike
    mysql报错Table ‘xxxx‘ doesn‘t exist
    一文了解循环神经网络
    行为型模式-策略模式
  • 原文地址:https://blog.csdn.net/renxyz/article/details/133275201