暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss 6.0 密态等值查询实现数据保护

openGauss 2024-11-26
184

介绍

密态数据库将解决数据整个生命周期中的隐私保护问题,涵盖网络传输、数据存储以及数据运行态;更进一步,密态数据库可以实现云化场景下的数据隐私权限分离,即实现数据拥有者和实际数据管理者的数据读取能力分离。密态等值查询将优先解决密文数据的等值类查询问题。密态等值查询目前支持客户端工具gsql和JDBC。

实现步骤如下:
1、使用gsql工具生成2个类型本地的key文件
2、创建表,在需要加密列使用列key
3、表插入数据,利用key对数据加密(数据库自动加密,此时数据库已经为加密数据)
4、查询数据,利用key查询明文(无key查询密文)

下面演示一下具体实践步骤。

实践步骤

创建密钥

密钥有两种,客户端主密钥对象和列加密密钥对象,客户端主密钥可用于加密列加密密钥对象;列加密密钥,用于加密表中指定列。
下面创建一起创建两种密钥。

客户端主密钥

当使用gsql连接数据库服务器时,需使用‘-C’参数,打开全密态数据库的开关,才能使用本语法。

由本语法创建的CMK对象中,仅存储从独立的密钥管理工具/服务/组件中读取密钥的方法,而不存储密钥本身。

    # 创建客户端主密钥,没有加-C
    [omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=/home/omm/zskey
    [omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow <======没有加-C,创建失败
    ....
    bicewow@192.168.20.253 [db1]=>CREATE CLIENT MASTER KEY ZsCMK1 WITH (KEY_STORE = localkms, KEY_PATH = "zskey1", ALGORITHM = RSA_2048);
    ERROR(CLIENT): disable client-encryption feature, please use -C to enable it.
    bicewow@192.168.20.253 [db1]=>\q


    # 创建客户端主密钥,加-C
    [omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
    Password for user bicewow:
    gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr )
    SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
    Type "help" for help.


    bicewow@192.168.20.253 [db1]=>CREATE CLIENT MASTER KEY ZsCMK1 WITH (KEY_STORE = localkms, KEY_PATH = "zskey1", ALGORITHM = RSA_2048);
    CREATE CLIENT MASTER KEY
    bicewow@192.168.20.253 [db1]=>
    # 创建后,出现如下文件
    [omm@dmdem zskey]$ ll
    total 16
    -rw------- 1 omm dbgrp 1752 Oct 31 14:38 zskey1.priv
    -rw------- 1 omm dbgrp 84 Oct 31 14:38 zskey1.priv.rand
    -rw------- 1 omm dbgrp 536 Oct 31 14:38 zskey1.pub
    -rw------- 1 omm dbgrp   84 Oct 31 14:38 zskey1.pub.rand

    语法格式

      语法格式
      CREATE CLIENT MASTER KEY client_master_key_name WITH (KEY_STORE = key_store_name, KEY_PATH = "key_path_value", ALGORITHM = algorithm_type)

      参数说明

      • client_master_key_name

      该参数作为密钥对象名,在同一命名空间下,需满足命名唯一性约束。
      取值范围:字符串,需符合标识符的命名规范。

      • KEY_STORE

      指定管理CMK的密钥工具或组件;取值:目前仅支持localkms。

      • KEY_PATH

      KEY_STORE负责管理多个CMK密钥,KEY_PATH选项用于在KEY_STORE中唯一标识CMK。取值类似:“key_path_value”。

      • ALGORITHM

      由本语法创建的用于加密COLUMN ENCRYPTION KEY,该参数用于指定加密算法的类型。取值范围:RSA_2048、RSA_3072和SM2。

      密钥说明

      • 密钥存储路径:默认情况下,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。所以,为了能够成功创建密钥相关文件,在密钥存储路径下,应该保证没有已存在的与密钥相关文件名同名的文件。

      列加密密钥

      当使用gsql连接数据库服务器时,需使用‘-C’参数,打开全密态数据库的开关,才能使用本语法。

      由该语法创建CEK对象可用于列级加密。在定义表中列字段时,可指定一个CEK对象,用于加密该列。

        [omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
        Password for user bicewow:
        gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr )
        SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
        Type "help" for help.


        bicewow@192.168.20.253 [db1]=>CREATE COLUMN ENCRYPTION KEY ZsCEK1 WITH VALUES (CLIENT_MASTER_KEY = ZsCMK1, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);
        CREATE COLUMN ENCRYPTION KEY
        bicewow@192.168.20.253 [db1]=>
        [omm@dmdem zskey]$ ll
        total 16
        -rw------- 1 omm dbgrp 1752 Oct 31 14:38 zskey1.priv
        -rw------- 1 omm dbgrp 84 Oct 31 14:38 zskey1.priv.rand
        -rw------- 1 omm dbgrp 536 Oct 31 14:38 zskey1.pub
        -rw------- 1 omm dbgrp   84 Oct 31 14:38 zskey1.pub.rand

        参数说明

        • 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;

        • ENCRYPTED_VALUE(可选项)

        该值为用户指定的密钥口令,密钥口令长度范围为28 ~ 256位,28位派生出来的密钥安全强度满足AES128,若用户需要用AES256,密钥口令的长度需要39位,如果不指定,则会自动生成256字符的密钥。

        密钥信息查询

          bicewow@192.168.20.253 [db1]=>SELECT * FROM gs_client_global_keys;
          global_key_name | key_namespace | key_owner | key_acl | create_date
          -----------------+---------------+-----------+---------+----------------------------
          zscmk1 | 2200 | 16389 | | 2024-10-31 14:38:14.631795
          (1 row)


          bicewow@192.168.20.253 [db1]=>SELECT column_key_name,column_key_distributed_id ,global_key_id,key_owner FROM gs_column_keys;
          column_key_name | column_key_distributed_id | global_key_id | key_owner
          -----------------+---------------------------+---------------+-----------
          zscek1 | 3923749860 | 16393 | 16389
          (1 row)

          创建加密表



            bicewow@192.168.20.253 [db1]=>CREATE TABLE zscard_info (id_number int, name text encrypted with (column_encryption_key = zscek1, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = zscek1, encryption_type = DETERMINISTIC));
            CREATE TABLE
            bicewow@192.168.20.253 [db1]=>\d
            List of relations
            Schema | Name | Type | Owner | Storage
            --------+-------------+-------+---------+----------------------------------
            public | zscard_info | table | bicewow | {orientation=row,compression=no}
            (1 row)


            bicewow@192.168.20.253 [db1]=>\d+ zscard_info
            Table "public.zscard_info"
            Column | Type | Modifiers | Storage | Stats target | Description
            -------------+-------------------+------------+----------+--------------+-------------
            id_number | integer | | plain | |
            name | text | encrypted | extended | | <======已显示为加密列
            credit_card | character varying | encrypted | extended | | <======已显示为加密列
            Has OIDs: no
            Options: orientation=row, compression=no

            向加密表插入数据

              bicewow@192.168.20.253 [db1]=>INSERT INTO zscard_info VALUES (1,'zs','41133322091002933');
              INSERT 0 1
              bicewow@192.168.20.253 [db1]=>INSERT INTO zscard_info VALUES (2, 'ls','41122222091005555');
              INSERT 0 1

              在密态客户端下查询

              在具有密钥以及设置环境变量LOCALKMS_FILE_PATH的gsql工具中,如愿查到相关明文数据。

                [omm@dmdem zskey]$ pwd
                /home/omm/zskey
                [omm@dmdem zskey]$ ll
                total 16
                -rw------- 1 omm dbgrp 1752 Oct 31 14:38 zskey1.priv
                -rw------- 1 omm dbgrp 84 Oct 31 14:38 zskey1.priv.rand
                -rw------- 1 omm dbgrp 536 Oct 31 14:38 zskey1.pub
                -rw------- 1 omm dbgrp 84 Oct 31 14:38 zskey1.pub.rand
                [omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=/home/omm/zskey
                [omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
                Password for user bicewow:
                gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr )
                SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
                Type "help" for help.


                bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
                id_number | name | credit_card
                -----------+------+-------------------
                1 | zs | 41133322091002933
                2 | ls | 41122222091005555
                (2 rows)

                在非密态客户端下查询

                情况一 没有指定LOCALKMS_FILE_PATH变量

                在没有指定LOCALKMS_FILE_PATH变量或者指定路径不对的情况下,均不能进行明文查询

                  [omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=
                  [omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
                  Password for user bicewow:
                  gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr )
                  SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
                  Type "help" for help.


                  bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
                  ERROR(CLIENT): failed to decrypt column encryption key


                  [omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=/home
                  [omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
                  Password for user bicewow:
                  gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr )
                  SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
                  Type "help" for help.


                  bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
                  ERROR(CLIENT): failed to decrypt column encryption key
                  bicewow@192.168.20.253 [db1]=>

                  情况二 没有指定gsql连接参数 -C

                  在创建密钥和表时,都用到了 -C 参数,特定语法需要,没有此参数,就算有密钥查询也是密文。

                    [omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=/home/omm/zskey           
                    [omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow
                    Password for user bicewow:
                    gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr )
                    SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
                    Type "help" for help.


                    bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
                    id_number | name |
                    credit_card
                    -----------+------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------
                    --------------------------------------------------------------------------------------------------------------------------------------------------
                    1 | \x01e4abdfe94d7f55dc82b44f0782461296f4c257a86a38bf62f3fd9e57e211d98eefd711ff310000000f9414f1356cc6427e3ba32d564e8ab97ea14cfeb604f6a45bf6cde1026a6d01 | \x01e4abdfe9e8ae6808582b6553285192a
                    bcd6717c69692e020b29f717d84c9caacd800365b310000000c3e94db184e56b07af690d4ef545007bb7d8c2d768daf2ceacfd56f67970e93ef4b02aa0e0797fc3146009b26d2b11e
                    2 | \x01e4abdfe93af5a2206a8ce8758a6db13e804e18818846bdf835ca9a8b772a96be9864dc9831000000448c0d247d103ab2d35d813e3d9aaccf32f58c088e199f1eba8a2be28b2aad17 | \x01e4abdfe9ee220c7e626d1f571b780c1
                    d73d54ee70374caed848c371555c2eb8df91ecced31000000df86b1591487e1daeb298a21cbc37e1e1c65f1be2c3c3cc61aa86f012fc8e93d10b0fc8a2ef30982737f756f71bf4b62
                    (2 rows)

                    情况二 既没指定key 也没指定连接参数 -C

                    这种情况查询也是密文。

                      [omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=
                      [omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow
                      Password for user bicewow:
                      gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr )
                      SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
                      Type "help" for help.


                      bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
                      id_number | name |
                      credit_card
                      -----------+------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------
                      --------------------------------------------------------------------------------------------------------------------------------------------------
                      1 | \x01e4abdfe94d7f55dc82b44f0782461296f4c257a86a38bf62f3fd9e57e211d98eefd711ff310000000f9414f1356cc6427e3ba32d564e8ab97ea14cfeb604f6a45bf6cde1026a6d01 | \x01e4abdfe9e8ae6808582b6553285192a
                      bcd6717c69692e020b29f717d84c9caacd800365b310000000c3e94db184e56b07af690d4ef545007bb7d8c2d768daf2ceacfd56f67970e93ef4b02aa0e0797fc3146009b26d2b11e
                      2 | \x01e4abdfe93af5a2206a8ce8758a6db13e804e18818846bdf835ca9a8b772a96be9864dc9831000000448c0d247d103ab2d35d813e3d9aaccf32f58c088e199f1eba8a2be28b2aad17 | \x01e4abdfe9ee220c7e626d1f571b780c1
                      d73d54ee70374caed848c371555c2eb8df91ecced31000000df86b1591487e1daeb298a21cbc37e1e1c65f1be2c3c3cc61aa86f012fc8e93d10b0fc8a2ef30982737f756f71bf4b62
                      (2 rows)

                      总结

                      通过配置密态等值相关设置,可以实现对数据根源加密,没有相关密钥信息,即使数据被拖库也不用太多担心,得到全是加密数据,那么问题来了,密钥丢失怎么办?


                      点击阅读原文跳转作者文章

                      文章转载自openGauss,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论