全部产品
Search
文档中心

云原生大数据计算服务 MaxCompute:加密函数

更新时间:Oct 23, 2023

MaxCompute SQL提供了加密函数和解密函数,您可以根据实际需要选择合适的函数,进行加密或解密。本文为您提供MaxCompute SQL支持的加密函数的命令格式、参数说明及示例,指导您使用加密函数完成开发。

MaxCompute数据加密能力介绍

  • 单一密钥加密:支持生成单一密钥,需要自行保存生成的密钥,适用于对指定列做随机性加密或解密。

    单一密钥加密.jpg

    MaxCompute SQL单一密钥加解密函数介绍如下。

    函数

    功能

    SYM_DECRYPT

    对表里的指定已经随机性加密的列做解密,返回BINARY类型的明文。

    SYM_ENCRYPT

    对表里的指定列做随机性加密,返回BINARY类型的密文。

  • 多密钥加密:MaxCompute密钥管理对象Keyset,可以存放1个或多个密钥,您可以手动在Keyset中增加密钥,密钥的轮转和查看原始密钥。

    多密钥加密.jpg

    MaxCompute SQL多密钥加解密函数介绍如下。

    函数

    功能

    NEW_KEYSET

    根据指定的算法类型,创建对应的密钥Keyset。

    ADD_KEY_TO_KEYSET

    在Keyset中新增密钥,并将新增的密钥设置为主密钥。

    KEYSET_TO_JSON

    将BINARY类型的密钥Keyset转化为可读的JSON格式,以便查看密钥Keyset详情。

    KEYSET_FROM_JSON

    将JSON类型的keyset转化为BINARY类型。

    ROTATE_KEYSET

    系统自动生产一个新密钥并将新密钥设置为主密钥。

  • 结合KMS封装的多密钥加密:MaxCompute支持结合KMS进行数据加密,系统会自动生成加解密数据的密钥集(Keyset),该Keyset与KMS密钥结合生成Keyset_KMS,用户需要保存keyset_KMS。若需要数据解密时,需要提供Keyset_KMS,然后系统会结合KMS密钥对Keyset_KMS进行解密,还原成加密数据的Keyset并对数据进行解密。

    keyset.jpg

    MaxCompute SQL结合KMS封装的多密钥加解密函数介绍如下。

    函数

    功能

    NEW_WRAPPED_KEYSET

    将有权使用KMS用户主密钥资源名称(kms_cmk_arn)角色的role_arn授权给MaxCompute,用来新建一个封装密钥集(KEYSET),也可通过角色链(role_chain)方式授权给其他阿里云账号解密KEYSET的权限。

    REWRAP_KEYSET

    通过指定的KMS密钥重新加密封装密钥集(KEYSET)。

    ROTATE_WRAPPED_KEYSET

    解密已有的加密密钥集(KEYSET),并进行密钥轮转,然后通过新密钥加密。

    USE_WRAPPED_KEYSET

    将封装密钥集转换为基础密钥集,作为加解密函数的参数使用,您也可通过此函数,获得封装密钥集相关的信息,并保存起来,便于维护。

    ENHANCED_SYM_ENCRYPT

    指定密钥集进行数据加密。

    ENHANCED_SYM_DECRYPT

    指定密钥集进行数据解密。

注意事项

升级到MaxCompute 2.0后,产品扩展了部分函数。如果您用到的函数涉及新数据类型(TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMP或BINARY),在使用扩展函数时,需要执行如下语句开启新数据类型开关:

  • Session级别:如果使用新数据类型,您需要在SQL语句前加上set odps.sql.type.system.odps2=true;,并与SQL语句一起提交执行。

  • Project级别:Project Owner可根据需要对Project进行设置,等待10~15分钟后才会生效。命令如下。

    setproject odps.sql.type.system.odps2=true;

    setproject的详细说明请参见项目空间操作。关于开启Project级别数据类型的注意事项,请参见数据类型版本说明

SYM_DECRYPT

  • 命令格式

    binary sym_decrypt(binary <value_to_decrypt>,
                       binary <key>
                       [,string <encryption_method> ,
                        [ string <additional_authenticated_data> ]
                       ]
                      )
  • 命令说明

    对表里的指定已经随机性加密的列做解密。

  • 参数说明

    • value_to_decrypt:必填。待解密数据。目前只支持对BINARY类型的数据进行解密。

    • key:必填。解密使用的密钥。支持的数据类型为BINARY,长度为256bits。

    • encryption_method:可选。数据用指定模式加密,解密时需要选择同样的模式进行解密。

    • additional_authenticated_data:可选。附加身份验证数据AAD,可以用来验证数据的真实性和完整性,数据在加密时用了ADD,解密时就需要输入ADD。

  • 返回值说明

    返回BINARY类型的明文,若有需要您可以自行通过CAST将BINARY类型转换为STRING类型。

  • 示例

    以下示例以SYM_ENCRYPT中加密后的表为样例数据,为您演示如何解密。

    • 示例1:解密明文密钥加密数据。

      • 使用AEAD加密算法进行解密。

        --对id_card_no解密
        insert overwrite table mf_user_info
        select id,
            name,
            gender,
               cast(sym_decrypt(unbase64(id_card_no),
                           cast('b75585cf321cdcad42451690cdb7bfc4' as binary)
                          ) as string) as id_card_no,
               tel
        from mf_user_info;
        
        --查询解密后的明文数据
        select * from mf_user_info;

        返回结果:

        +------------+------+--------+------------+-------------+
        | id         | name | gender | id_card_no | tel         |
        +------------+------+--------+------------+-------------+
        | 1          | bob  | male   | 0001       | 13900001234 |
        | 2          | allen| male   | 0011       | 13900001111 |
        | 3          | kate | female | 0111       | 13900002222 |
        | 4          | annie| female | 1111       | 13900003333 |
        +------------+------+--------+------------+-------------+
      • 使用AAD加密算法进行解密。

        --对id_card_no解密
        insert overwrite table mf_user_info
        select id,
                     name,
                     gender,
               sym_decrypt(unbase64(id_card_no),
                           cast('b75585cf321cdcad42451690cdb7bfc4' as binary),
                           'AES-GCM-256',
                               'test'
                          )as id_card_no,
               tel
        from mf_user_info;
        
        --查询解密后的明文数据
        select * from mf_user_info;

        返回结果:

        +------------+------+--------+------------+------------+
        | id         | name | gender | id_card_no |    tel     |
        +------------+------+--------+------------+------------+
        | 1          | bob  | male   | 0001       | 13900001234|
        | 2          | allen| male   | 0011       | 13900001111|
        | 3          | kate | female | 0111       | 13900002222|
        | 4          | annie| female | 1111       | 13900003333|
        +------------+------+--------+------------+------------+
    • 示例2:解密密钥表加密数据。

      --对目标表的列进行解密
      insert overwrite table mf_user_info
      select /*+mapjoin(b)*/
            a.id,
            a.name,
            a.gender,
            cast(sym_decrypt(unbase64(a.id_card_no), b.key) as string) as id_card_no,
            a.tel
       from mf_user_info as a join mf_id_key as b on a.id>=b.id;
      
      --查询解密后的数据
      select * from mf_user_info;

      返回结果:

      +------------+------+--------+------------+-------------+
      | id         | name | gender | id_card_no | tel         |
      +------------+------+--------+------------+-------------+
      | 1          | bob  | male   | 0001       | 13900001234 |
      | 2          | allen| male   | 0011       | 13900001111 |
      | 3          | kate | female | 0111       | 13900002222 |
      | 4          | annie| female | 1111       | 13900003333 |
      +------------+------+--------+------------+-------------+

SYM_ENCRYPT

  • 命令格式

    binary sym_encrypt(string|binary <value_to_encrypt>,
                       binary <key>
                       [,string <encryption_method> ,
                          [ string <additional_authenticated_data> ]
                        ]
                      )
  • 命令说明

    对表里的指定列做随机性加密。

  • 参数说明

    • value_to_encrypt:必填。待加密数据。目前只支持对STRING和BINARY类型的数据进行加密。

    • key:必填。加密使用的密钥。支持的数据类型为BINARY,长度为256bits。

    • encryption_method:可选。加密模式选择。目前只提供了一种加密模式,即AES-GCM-256加密算法,默认使用AES-GCM-256。

    • additional_authenticated_data:可选。附加身份验证数据AAD,可以用来验证数据的真实性和完整性。目前只支持AEAD的加密算法,比如AES GCM才支持AAD。

  • 返回值说明

    返回BINARY类型的密文。

    • 返回值中按顺序包含初始向量(IV),密文,带附加数据的加密和验证算法标签(AEAD Tag)。

    • 相同的明文和密码,每次生成的密文也是随机的不同的。

  • 示例数据

    --创建表
    create table mf_user_info(id bigint,
                              name string,
                              gender string,
                              id_card_no string,
                              tel string);
    --插入数据
    insert overwrite table mf_user_info values(1,"bob","male","0001","13900001234"),
                                           (2,"allen","male","0011","13900001111"),
                                         (3,"kate","female","0111","13900002222"),
                                         (4,"annie","female","1111","13900003333");
    --查询数据
    select * from mf_user_info;
    +------------+------+--------+------------+------------+
    | id         | name | gender | id_card_no |    tel     |
    +------------+------+--------+------------+------------+
    | 1          | bob  | male   | 0001       | 13900001234|
    | 2          | allen| male   | 0011       | 13900001111|
    | 3          | kate | female | 0111       | 13900002222|
    | 4          | annie| female | 1111       | 13900003333|
    +------------+------+--------+------------+------------+
  • 示例1:基于明文密钥加密

    基于示例数据,对表mf_user_info中的列进行加密。命令如下:

    • 使用AEAD加密算法进行加密。

      --对id_card_no加密
      insert overwrite table mf_user_info
      select id,
          name,
          gender,
             base64(sym_encrypt(id_card_no,
                         cast('b75585cf321cdcad42451690cdb7bfc4' as binary)
                        ))as id_card_no,
            tel
      from mf_user_info;
      
      select * from mf_user_info;

      返回结果:

      +------------+------+--------+------------+-----+
      | id         | name | gender | id_card_no | tel |
      +------------+------+--------+------------+-----+
      | 1          | bob  | male   | frgJZAEAQMeEuHqpS8lK9VxQhgPYpZ317V+oUla/xEc= | 13900001234|
      | 2          | allen| male   | frgJZAIAQMeEuHqpLeXQfETsFSLJxBwHhPx6tpzWUg4= | 13900001111|
      | 3          | kate | female | frgJZAMAQMeEuHqpdphXAU6iWelWenlDnVy+R0HMvAY= | 13900002222|
      | 4          | annie| female | frgJZAQAQMeEuHqpR5c8bj21dYCeM0C25bLRZIrP71c= | 13900003333|
      +------------+------+--------+------------+-----+
    • 使用AAD加密算法进行加密。

      --对id_card_no加密
      insert overwrite table mf_user_info
      select id,
                   name,
                   gender,
             base64(sym_encrypt(id_card_no,
                    cast('b75585cf321cdcad42451690cdb7bfc4' as binary),
                    'AES-GCM-256',
                    'test'
                    ))as id_card_no,
            tel
      from mf_user_info;
      select * from mf_user_info;

      返回结果:

      +------------+------+--------+------------+-----+
      | id         | name | gender | id_card_no | tel |
      +------------+------+--------+------------+-----+
      | 1          | bob  | male   | frgJZAEAQMeEuHqpS8lK9VxQhgPYpZ317V+oUla/xEc= | 13900001234|
      | 2          | allen| male   | frgJZAIAQMeEuHqpLeXQfETsFSLJxBwHhPx6tpzWUg4= | 13900001111|
      | 3          | kate | female | frgJZAMAQMeEuHqpdphXAU6iWelWenlDnVy+R0HMvAY= | 13900002222|
      | 4          | annie| female | frgJZAQAQMeEuHqpR5c8bj21dYCeM0C25bLRZIrP71c= | 13900003333|
      +------------+------+--------+------------+-----+
  • 示例2:基于密钥表加密

    基于示例数据,借助构造密钥表,实现密钥管理。

    • 原理。

      • 对于数据加密场景,您可以将密钥存储在MaxCompute表中,在进行数据加密时,通过JOIN加密表的方式,完成数据加密。这样可以避免由于在查询中直接传递密钥导致的泄漏问题。

      • 在数据解密时,项目管理员不要直接将密钥(表)授权给数据使用方,而是应该创建一个(secure)view,在view内部通过访问解密表并调用解密函数,完成数据解密。通过控制view权限来控制数据使用方对数据明文的访问。同时在view中不包含密钥明文,避免密钥泄漏。

    • 注意事项。

      • 整套方案密钥的创建管理都来自客户,需要您自行保存关键密钥,平台不保存密钥以及密钥与密文的直接对应关系。密钥一旦丢失,会导致无法解密数据。

      • 明文密钥参数传递存在泄漏风险,需要您在使用过程中进行特殊处理。

      • 涉及BINARY类型,可能需要使用MaxCompute 2.0,请使用set odps.sql.type.system.odps2=true;开启2.0数据类型开关。

    命令如下:

    --创建密钥表
    create table mf_id_key(id bigint,key binary);
    --插入一个密钥
    insert overwrite table mf_id_key
      values (1,cast('b75585cf321cdcad42451690cdb7bfc4' as binary));
    --查询密钥
    select * from mf_id_key;
    +------------+------+
    | id         | key  |
    +------------+------+
    | 1          | b75585cf321cdcad42451690cdb7bfc4 |
    +------------+------+
    
    --查询需要加密的表数据
    select * from mf_user_info;
    +------------+------+--------+------------+------------+
    | id         | name | gender | id_card_no |    tel     |
    +------------+------+--------+------------+------------+
    | 1          | bob  | male   | 0001       | 13900001234|
    | 2          | allen| male   | 0011       | 13900001111|
    | 3          | kate | female | 0111       | 13900002222|
    | 4          | annie| female | 1111       | 13900003333|
    +------------+------+--------+------------+------------+
    
    --对目标表的列进行加密
    insert overwrite table mf_user_info
    select /*+mapjoin(b)*/
          a.id,
          a.name,
          a.gender,
          base64(
            (sym_encrypt(a.id_card_no, b.key))
          ) as id_card_no,
          a.tel
     from mf_user_info as a join mf_id_key as b on a.id>=b.id;
    
    --查询加密后的数据
    select * from mf_user_info;

    返回结果:

    +------------+------+--------+------------+-----+
    | id         | name | gender | id_card_no | tel |
    +------------+------+--------+------------+-----+
    | 1          | bob  | male   | 9esKZAEAoBquXVJo3ZptvoI09XuM4bSFTqF1mXH1BO4= | 13900001234|
    | 2          | allen| male   | 9esKZAIAoBquXVJoJYqnXieAANih7FR59luePvdHB9U= | 13900001111|
    | 3          | kate | female | 9esKZAMAoBquXVJoppwxgVwPYBnvjIMklWLmJ/sU0Y8= | 13900002222|
    | 4          | annie| female | 9esKZAQAoBquXVJoB85RUFCLMbdyEBSz7LdS4M3Guvk= | 13900003333|
    +------------+------+--------+------------+-----+

NEW_KEYSET

  • 命令格式

    binary NEW_KEYSET(string <key_type>, [string <description>])
  • 命令说明

    根据指定的算法类型,创建对应的密钥Keyset。

  • 参数说明

    • key_type:必填,创建数据密钥时,指定的算法类型。目前支持:AES-GCM-256AES-SIV-CMAC-128AES-SIV-CMAC-256

    • description:可选,数据密钥的描述。

  • 返回值说明

    返回BINARY类型的KeySet。

    说明

    若您有需要,可以通过HEX将BINARY类型转换为STRING类型,通过UNHEX将STRING类型转化为BINARY类型。

  • 示例

    select hex(NEW_KEYSET('AES-GCM-256', 'hello world'));

    返回结果如下。

    +------------+
    | _c0        |
    +------------+
    | 0A10577567735A514541554D42776E684C4212580A330A0B4145532D47434D2D323536122017F7A430B9D4B59B55454FD4B486216059F1B748CE0502D901EBEACEAB6569191801200210011A10577567735A514541554D42776E684C4220022A0B68656C6C6F20776F726C64 |
    +------------+

ADD_KEY_TO_KEYSET

  • 命令格式

    binary ADD_KEY_TO_KEYSET(binary <keyset>, string <key_type>, binary <raw_key>, [string <description>])
  • 命令说明

    在Keyset中新增密钥,并将新增的密钥设置为主密钥。

  • 参数说明

    • keyset:必填,已有密钥,类型为:BINARY

    • key_type:必填:添加密钥的算法类型。目前支持:AES-GCM-256AES-SIV-CMAC-128AES-SIV-CMAC-256

    • raw_key:必填,待新增的密钥,并将此密钥设置为主密钥,类型为:BINARY

    • description:可选,对数据密钥的描述。

  • 返回值说明

    返回BINARY类型的KeySet。

    说明

    若您有需要,可以通过HEX将BINARY类型转换为STRING类型,通过UNHEX将STRING类型转化为BINARY类型。

  • 示例

    select hex(ADD_KEY_TO_KEYSET(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), 'AES-SIV-CMAC-128', unhex('b75585cf321cdcad42451690cdb7bfc49c26092f60f854e72d43244c55620a3d'),'description') );

    返回结果如下。

    +------------+
    | _c0        |
    +------------+
    | 0A10596530735A5145414150447273424C4212580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64125D0A380A104145532D5349562D434D41432D3132381220B75585CF321CDCAD42451690CDB7BFC49C26092F60F854E72D43244C55620A3D1801200110011A10596530735A5145414150447273424C4220022A0B6465736372697074696F6E |
    +------------+

KEYSET_FROM_JSON

  • 命令格式

    binary KEYSET_FROM_JSON(string <json_keyset>)
  • 命令说明

    将JSON类型的keyset转化为BINARY类型。

  • 参数说明

    json_keyset:必填,JSON类型的Keyset。

  • 返回值说明

    返回BINARY类型的KeySet。

    说明

    若您有需要,可以通过HEX将BINARY类型转换为STRING类型,通过UNHEX将STRING类型转化为BINARY类型。

  • 示例

    select hex(KEYSET_FROM_JSON('{
        "key": [{
                "description": "hello world",
                "key_id": "r8MqZAEA8PDd3QSL",
                "key_meta_data": {
                    "key_material_origin": "Origin_ALIYUN_MAXCOMPUTE",
                    "key_material_type": "SYMMETRIC",
                    "type": "AES-GCM-256",
                    "value": "Jqj7ESbfT1td0DwYDmkZVl13FsuykYFe+1u/MPi++a8="},
                "output_prefix_type": "PREFIX_ALIYUN_MAXCOMPUTE",
                "status": "ENABLED"}],
        "primary_key_id": "r8MqZAEA8PDd3QSL"}')) ;

    返回结果如下。

    +------------+
    | _c0        |
    +------------+
    | 0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64 |
    +------------+

KEYSET_TO_JSON

  • 命令格式

    string KEYSET_TO_JSON(binary <keyset>,)
  • 命令说明

    将BINARY类型的密钥Keyset转化为可读的JSON格式,以便查看密钥Keyset详情。

  • 参数说明

    keyset:必填,已有的Keyset,类型为:BINARY

  • 返回值说明

    返回JSON格式的Keyset,部分参数说明如下:

    • key_id:密钥ID。

    • key_material_origin:密钥来源。

    • key_material_type:密钥对应的加密类型。

    • type:密钥的算法类型。

    • value:密钥值。

    • output_prefix_type:加密后密文对应的格式。

  • 示例

    select KEYSET_TO_JSON(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64')) ;

    返回结果如下。

     +------------+
    | _c0        |
    +------------+
    | {
        "key": [{
                "description": "hello world",
                "key_id": "r8MqZAEA8PDd3QSL",
                "key_meta_data": {
                    "key_material_origin": "Origin_ALIYUN_MAXCOMPUTE",
                    "key_material_type": "SYMMETRIC",
                    "type": "AES-GCM-256",
                    "value": "Jqj7ESbfT1td0DwYDmkZVl13FsuykYFe+1u/MPi++a8="},
                "output_prefix_type": "PREFIX_ALIYUN_MAXCOMPUTE",
                "status": "ENABLED"}],
        "primary_key_id": "r8MqZAEA8PDd3QSL"} |
    +------------+

ROTATE_KEYSET

  • 命令格式

    binary ROTATE_KEYSET(binary <keyset>, string <key_type>, [string <description> ])
  • 命令说明

    系统自动生产一个新密钥并将新密钥设置为主密钥。

  • 参数说明

    • keyset:必填,待更新的Keyset,类型为BINARY

    • key_type:必填,新的密钥算法类型,目前支持:AES-GCM-256AES-SIV-CMAC-128AES-SIV-CMAC-256

    • description:可选,数据密钥的描述。

  • 返回值说明

    返回BINARY类型的KeySet。

    说明

    若您有需要,可以通过HEX将BINARY类型转换为STRING类型,通过UNHEX将STRING类型转化为BINARY类型。

  • 示例

    select ROTATE_KEYSET(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), 'AES-SIV-CMAC-256', 'hello world') ;

    返回结果如下。

    +------------+
    | _c0        |
    +------------+
    | =0A=10BVIuZQEAcHHPLfn1=12X=0A3=0A=0BAES-GCM-256=12=20&=A8=FB=11&=DFO[]=D0<=18=0Ei=19V]w=16=CB=B2=91=81^=FB[=BF0=F8=BE=F9=AF=18=01=20=02=10=01=1A=10r8MqZAEA8PDd3QSL=20=02*=0Bhello=20world=12}=0AX=0A=10AES-SIV-CMAC-256=12@=9D=AD=B7=D6=AF=01=B2=9D=CE=C3=02y=A9=DB=E1=17q>'F=DC=F5=EF=FFI=7F=F0w)=95F=07>=9C=EDqn=DF=0E=1E=16bP&=D3=7F>gV=CBl=8AGJCm=93=FF=F9=96=AD=1A=C0=BC=18=01=20=02=10=01=1A=10BVIuZQEAcHHPLfn1=20=02*=0Bhello=20world |
    +-----------

NEW_WRAPPED_KEYSET

  • 命令格式

    binary NEW_WRAPPED_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <key_type>
    [, string <description>, [string <role_chain>]])
  • 命令说明

    MaxCompute支持结合密钥管理服务做密钥管理,通过KMS密钥对生成的密钥集(KEYSET)再次进行加密,生成封装密钥集。封装密钥集需要您在生成后自行记录保存,使用封装密钥集对数据加解密,需要结合KMS密钥进行,此过程所有密钥由系统自动生成,不可查看原始用于数据加解密的密钥,可以更加安全地实现数据加解密。NEW_WRAPPED_KEYSET函数将有权使用KMS用户主密钥资源名称(kms_cmk_arn)角色的role_arn授权给MaxCompute,用来新建一个封装密钥集,也支持通过角色链(role_chain)方式授权给其他阿里云账号的角色使用封装密钥集的权限。

    使用NEW_WRAPPED_KEYSET函数前需要完成以下操作:

    • 开通KMS创建密钥实例。

    • 创建KMS密钥并获取密钥ARN信息(kms_cmk_arn)。

    • 创建RAM角色并授权MaxCompute访问KMS,获取创建角色的ARN信息(role_arn)。

    操作详情请参见开通KMS并完成配置

  • 参数说明

    • kms_cmk_arn: 必填,加密KEYSET的KMS用户主密钥资源名称,格式为'acs:kms:<RegionId>:<UserId>:key/<CmkId>',包含地域信息、用户ID、用户主密钥ID,您可以在密钥管理服务控制台的密钥详情页面获取ARN,操作详情请参见开通KMS并完成配置

    • role_arn:必填,拥有KMS权限的RAM角色的ARN信息,该角色需授权给MaxCompute,格式为'acs:ram:${<userAID>}:role/${<roleName>}',包含用户ID、角色名称,获取请参见开通KMS并完成配置

    • key_type:必填,新生成的KEYSET密钥算法类型。目前支持:AES-GCM-256AES-SIV-CMAC-128AES-SIV-CMAC-256

    • description: 可选,密钥的描述信息。

    • role_chain:可选,用户授权角色链,格式为'acs:ram:<userAID>:role/<roleName2>,acs:ram:<userBID>:role/<roleName3>},...'。通过角色链的方式,支持跨阿里云账号的封装密钥集调用。

  • 返回值说明

    返回BINARY类型的加密KEYSET,若有需要您可以通过HEX函数将BINARY类型转换为STRING类型,详情请参见HEX

  • 示例

    • 新建封装密钥集:

      select hex(NEW_WRAPPED_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz****************1t','acs:ram::1**************7:role/kms', 'AES-GCM-256', 'hello'));

      返回结果示例如下:

      +-----+
      | _c0 |
      +-----+
      | 613256354C576836656A59314D6D59344E7A6B7A624452754D6D3434627A49786443317A655859786358426F4E6A4D78434A373434582F54756C5A547A4E69337562786F4B3543412F616655573262786D345A41306B464C674A2F5758324F4E514E346746306F303236376D35335A6471797237366E57565A6836387A52687A4A673945784B6E677568794A376E6F4A68573677684B5A555A42786E4A383742536C4D46326A374F71474F4C414A6B665779694557394D58664876576E306C6D49777052746A77325643707A4259517277327944354343396C50586F31346A4351506253612F3044394C4C6E6E622F747A6B57316E4F564A6C5359354B35526130537565584F33507856773D |
      +-----+
    • 新建封装密钥集,并允许其他角色调用:

      select hex(NEW_WRAPPED_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz****************1t','acs:ram::1**************7:role/kms', 'AES-GCM-256', 'hello','acs:ram::1**************7:role/kms1'));

      返回结果示例如下:

      +-----+
      | _c0 |
      +-----+
      | 613256354C576836656A59314D6D59344E7A6B7A624452754D6D3434627A49786443317A655859786358426F4E6A4D784D59716D4C767954716B3562444779574C7A387965774966432F516B4A59616F57623648364A546A62434F7A7A42634F517A687A6E526F36543866714E4E63555546566874696C4A3947713556667A2F7851757A55686467504C517A2B6C433337485A535449744B53714E396B6639587666487A4D7957643842334D3179392F67423774726835437A556F786A74614571612F5A3543447668524A7731426566525647796A77574974476243475A4E594550714E767963532B333432743347396B714777626C54336F57706939706E437A667A4E4D6F4C63714F453D |
      +-----+

REWRAP_KEYSET

  • 命令格式

    binary REWRAP_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <wrapped_keyset>, [string <role_chain>])
  • 命令说明

    MaxCompute支持结合密钥管理服务做密钥管理,通过KMS密钥对生成的密钥集(KEYSET)再次进行加密,生成封装密钥集。REWRAP_KEYSET函数可以对NEW_WRAPPED_KEYSET函数生成的封装密钥集使用新的KMS密钥重新进行封装加密。

    使用REWRAP_KEYSET函数前需要完成以下操作:

    • 已有通过NEW_WRAPPED_KEYSET函数生成的封装密钥集,详情请参见NEW_WRAPPED_KEYSET

    • 创建新KMS密钥并获取密钥ARN信息(kms_cmk_arn),并给RAM角色授权使用新密钥的权限,操作详情请参见开通KMS并完成配置

  • 参数说明

    • kms_cmk_arn: 必填,重新加密KEYSET的KMS用户主密钥资源名称,格式为'acs:kms:<RegionId>:<UserId>:key/<CmkId>',包含地域信息、用户ID、用户主密钥ID,您可以在密钥管理服务控制台的密钥详情页面获取ARN,操作详情请参见开通KMS并完成配置

    • role_arn:必填,同时拥有新旧KMS密钥权限的RAM角色的ARN信息,该角色需授权给MaxCompute,格式为'acs:ram:${<userAID>}:role/${<roleName>}',包含用户ID、角色名称,获取请参见开通KMS并完成配置

    • wrapped_keyset:必填,需要重新加密的封装密钥集。

    • role_chain:可选,用户授权角色链,格式为'acs:ram:<userAID>:role/<roleName2>,acs:ram:<userBID>:role/<roleName3>},...'。通过角色链的方式,支持跨阿里云账号的封装密钥集调用。

  • 返回值说明

    返回BINARY类型的加密KEYSET,若有需要您可以通过HEX函数将BINARY类型转换为STRING类型,详情请参见HEX

  • 示例

    说明

    运行以下包含变量的示例代码请使用脚本模式运行或在SQL语句中将变量替换为实际值。

    • 重新加密封装密钥集:

      @origin_key := unhex('<wrapped_keyset>'); 
      select hex(REWRAP_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz******************', 'acs:ram::1**************7:role/kms', @origin_key));
    • 重新加密封装密钥集,并允许其他阿里云账号的角色调用:

      @origin_key := unhex('<wrapped_keyset>');
      @role_chain := 'acs:ram:${<UserAId>}:role/${<roleName2>},acs:ram:${<UserBId>}:role/${<roleName3>}';
      select hex(REWRAP_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz******************', 'acs:ram:${<UserId>}:role/${<roleName>}', @origin_key, @role_chain));

ROTATE_WRAPPED_KEYSET

  • 命令格式

    binary ROTATE_WRAPPED_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <wrapped_keyset>,string <key_type> [,string description,[string <role_chain>]])
  • 命令说明

    MaxCompute支持结合密钥管理服务做密钥管理,通过KMS密钥对生成的密钥集(KEYSET)再次进行加密,生成封装密钥集。ROTATE_WRAPPED_KEYSET函数可以对NEW_WRAPPED_KEYSET函数生成的封装密钥集使用新的KMS密钥和密钥算法重新进行封装加密。即ROTATE_WRAPPED_KEYSET函数相比REWRAP_KEYSET函数还可以对密钥算法进行更新。

    使用ROTATE_WRAPPED_KEYSET函数前需要完成以下操作:

    • 已有通过NEW_WRAPPED_KEYSET函数生成的封装密钥集,详情请参见NEW_WRAPPED_KEYSET

    • 创建新KMS密钥并获取密钥ARN信息(kms_cmk_arn),并给RAM角色授权使用新密钥的权限,操作详情请参见开通KMS并完成配置

  • 参数说明

    • kms_cmk_arn: 必填,新加密KEYSET的KMS用户主密钥资源名称,格式为'acs:kms:<RegionId>:<UserId>:key/<CmkId>',包含地域信息、用户ID、用户主密钥ID,您可以在密钥管理服务控制台的密钥详情页面获取ARN,操作详情请参见开通KMS并完成配置

    • role_arn:必填,同时拥有新旧KMS密钥权限的RAM角色的ARN信息,格式为'acs:ram:${<userAID>}:role/${<roleName>}',包含用户ID、角色名称,获取请参见开通KMS并完成配置

    • wrapped_keyset:必填,需要重新加密的封装密钥集。

    • key_type:必填,新生成的KEYSET密钥算法类型。目前支持:AES-GCM-256AES-SIV-CMAC-128AES-SIV-CMAC-256

    • description: 可选项,密钥的描述信息。

    • role_chain:可选,用户授权角色链,格式为'acs:ram:<userAID>:role/<roleName2>,acs:ram:<userBID>:role/<roleName3>},...'。通过角色链的方式,支持跨阿里云账号的封装密钥集调用。

  • 返回值说明

    返回BINARY类型的加密KEYSET,若有需要您可以通过HEX函数将BINARY类型转换为STRING类型,详情请参见HEX

  • 示例

    说明

    运行以下包含变量的示例代码请使用脚本模式运行或在SQL语句中将变量替换为实际值。

    • 重新加密封装密钥集:

      @kms_resource_keyId := 'acs:kms:${<RegionId>}:${<UserId>}:key/${<CmkId>}';
      @role_arn := 'acs:ram:${<UserId>}:role/${<roleName>}';
      @origin_key := unhex('<wrapped_keyset>');
      select hex(ROTATE_WRAPPED_KEYSET(@kms_resource_keyId, @role_arn, @origin_key, 'AES-GCM-256', 'hello world'));
    • 重新加密封装密钥集,并允许其他角色调用:

      @kms_resource_keyId := 'acs:kms:${<RegionId>}:${<UserId>}:key/${<CmkId>}';
      @role_arn := 'acs:ram:${<UserId>}:role/${<roleName>}';
      @origin_key := unhex('<wrapped_keyset>');
      @role_chain := 'acs:ram:${<UserAId>}:role/${<roleName2>},acs:ram:${<UserBId>}:role/${<roleName3>}';
      select hex(ROTATE_WRAPPED_KEYSET(@kms_resource_keyId, @role_arn, @origin_key, 'AES-GCM-256', 'hello world', @role_chain));

USE_WRAPPED_KEYSET

  • 命令格式

    binary USE_WRAPPED_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <wrapped_keyset> [,string <role_chain>])
  • 命令说明

    MaxCompute支持结合密钥管理服务做密钥管理,通过KMS密钥对生成的密钥集(KEYSET)再次进行加密,生成封装密钥集。USE_WRAPPED_KEYSET函数将NEW_WRAPPED_KEYSET函数生成的封装密钥集转换为基础密钥集,作为加解密函数的参数,用于对数据加解密。您也可通过此函数,获得封装密钥集相关的信息,并保存起来,便于后期维护。

    使用USE_WRAPPED_KEYSET函数前需要完成以下操作:

    • 已有通过NEW_WRAPPED_KEYSET函数生成的封装密钥集,详情请参见NEW_WRAPPED_KEYSET

    • 创建新KMS密钥并获取密钥ARN信息(kms_cmk_arn),并给RAM角色授权使用新密钥的权限,操作详情请参见开通KMS并完成配置

  • 参数说明

    • kms_cmk_arn:必填,加密KEYSET的KMS用户主密钥资源名称,格式为'acs:kms:<RegionId>:<UserId>:key/<CmkId>',包含地域信息、用户ID、用户主密钥ID,您可以在密钥管理服务控制台的密钥详情页面获取ARN,操作详情请参见开通KMS并完成配置

    • role_arn:必填,拥有KMS权限的RAM角色的ARN信息,该角色需授权给MaxCompute,格式为'acs:ram:${<userAID>}:role/${<roleName>}',包含用户ID、角色名称,获取请参见开通KMS并完成配置

    • wrapped_keyset:必填,已生成的封装密钥集。

    • role_chain:可选,用户授权角色链,格式为'acs:ram:<userAID>:role/<roleName2>,acs:ram:<userBID>:role/<roleName3>},...'。通过角色链的方式,支持跨阿里云账号的封装密钥集调用。

  • 返回值说明

    返回STRUCT类型的脱敏后的密钥集,若有需要您可以通过get_json_object函数获得密钥集相关字段。

  • 示例

    说明

    运行以下包含变量的示例代码请使用脚本模式运行或在SQL语句中将变量替换为实际值。

    获取封装密钥集的密钥算法信息:

    @kms_resource_keyId := 'acs:kms:${<RegionId>}:${<UserId>}:key/${<CmkId>}';
    @role_arn := 'acs:ram:${<UserId>}:role/${<roleName>}';
    @origin_key := unhex('<wrapped_keyset>');
    @role_chain := 'acs:ram:${<UserAId>}:role/${<roleName2>},acs:ram:${<UserBId>}:role/${<roleName3>}';
    @use_keyset_new := USE_WRAPPED_KEYSET(@kms_resource_keyId, @role_arn, @origin_key, @role_chain);
    
    select get_json_object(get_json_object(use_keyset_new.wrapped_keyset_info,'$.masked_keyset'), '$.key[0].key_meta_data.type');

    返回结果示例如下:

    +-----+
    | _c0 |
    +-----+
    | AES-GCM-256 |
    +-----+

ENHANCED_SYM_ENCRYPT

  • 命令格式

    binary ENHANCED_SYM_ENCRYPT(binary <keyset> , string|binary <plaintext> [,string <additional_data>])
  • 命令说明

    MaxCompute支持使用ENHANCED_SYM_ENCRYPT函数指定生成的基础密钥集或封装密钥集对数据进行加密。封装密钥集是通过KMS密钥对生成的密钥集(KEYSET)再次进行加密,结合密钥管理服务做密钥管理,相比基础密钥集会更加安全。

    使用ENHANCED_SYM_ENCRYPT函数前需要完成以下操作:

    • 已有通过NEW_KEYSETNEW_WRAPPED_KEYSET函数生成的基础密钥集或封装密钥集,详情请参见NEW_KEYSETNEW_WRAPPED_KEYSET

    • 如果使用封装密钥集加密数据,需要先使用USE_WRAPPED_KEYSET函数获取基础密钥集,基础密钥集作为ENHANCED_SYM_ENCRYPT函数的参数进行数据加密。同时需要有使用封装密钥集对应角色的权限,操作详情请参见开通KMS并完成配置

  • 参数说明

    • keyset:必填,用户密钥集, 类型为BINARY或者封装密钥集的STRUCT类型。

    • plaintext:必填,待加密的STRING或BINARY类型的明文。

    • additional_data: 可选,算法支持的STRING类型验证信息。

  • 返回值说明

    返回BINARY类型的密文。

  • 示例数据

    --创建表
    create table mf_user_info(id bigint,
                              name string,
                              gender string,
                              id_card_no string,
                              tel string);
    --插入数据
    insert overwrite table mf_user_info values(1,"bob","male","0001","13900001234"),
                                           (2,"allen","male","0011","13900001111"),
                                         (3,"kate","female","0111","13900002222"),
                                         (4,"annie","female","1111","13900003333");
    --查询数据
    select * from mf_user_info;
    +------------+------+--------+------------+------------+
    | id         | name | gender | id_card_no |    tel     |
    +------------+------+--------+------------+------------+
    | 1          | bob  | male   | 0001       | 13900001234|
    | 2          | allen| male   | 0011       | 13900001111|
    | 3          | kate | female | 0111       | 13900002222|
    | 4          | annie| female | 1111       | 13900003333|
    +------------+------+--------+------------+------------+
  • 示例

    • 使用基础密钥集对mf_user_info表的id_card_no列加密:

      insert overwrite table mf_user_info
      select id,
          name,
          gender,
             base64(ENHANCED_SYM_ENCRYPT(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), id_card_no ))as id_card_no,
            tel
      from mf_user_info;

      查询加密结果示例如下:

      select * from mf_user_info;
      
      --返回结果示例
      +------------+------+--------+------------+-----+
      | id         | name | gender | id_card_no | tel |
      +------------+------+--------+------------+-----+
      | 1          | bob  | male   | nLcdDFdjO2T4aATtirvDMVeBD8oSuu4BfM3t+Y8ny0kwQjJlAQAwkVhYOocPQll8LmdzSwkRf3v2iTow+TAmnQ== | 13900001234 |
      | 2          | allen | male   | nLcdDFdjO2T4aATtirvDMVeBD8oSuu4BfM3t+Y8ny0kwQjJlAQBgj1hYOodIPdnyZ0ijZ9RmT+50xbxXh5cwcg== | 13900001111 |
      | 3          | kate | female | nLcdDFdjO2T4aATtirvDMVeBD8oSuu4BfM3t+Y8ny0kwQjJlAQCwp1hYOoentQgkfUqctPbmX96k9eD018xg9Q== | 13900002222 |
      | 4          | annie | female | nLcdDFdjO2T4aATtirvDMVeBD8oSuu4BfM3t+Y8ny0kwQjJlAQDQqFhYOodexhRmfh6VieEwePZscC4nUVTJXQ== | 13900003333 |
      +------------+------+--------+------------+-----+
    • 使用封装密钥集对mf_user_info表的tel列加密:

      1. 生成封装密钥集并写入表中:

        --创建表并把加密后的keyset写入
        create table mf_keyset_kms (id string,ks binary);
        --生产keyset加密后写入表
        insert into mf_keyset_kms 
              select '1',
                     NEW_WRAPPED_KEYSET(
                        'acs:kms:cn-hangzhou:1**************7:key/key-hzz****************1t', 
                        'acs:ram::1**************7:role/kms', 
                        'AES-GCM-256', 
                       'description');
        --查询表
        select id,hex(ks) from mf_keyset_kms;
        
        --返回结果示例
        +----+-----+
        | id | _c1 |
        +----+-----+
        | 1  | 613256354C576836656A59314D6D59344E7A6B7A624452754D6D3434627A49786443317A655859786358426F4E6A4D78447654524C4632635077766E74554654584579715242583953724167446D2F397131786F57456E6F5474516739633853766242674456773565736674714A4D5435524455382F6F6A2B4E61766D774344494C734B6A416B6B675A42496F5568656F566D38564C4F30506D4778767137646956517453447A5467395147775639533161305A464A6D6A45562B6742722F56386653444D6E424D2B71493779784668303866594E6D336578775744423949726B645A3469784F2B532B476E6750523854524A58326E5768666478347034473468687248684A514D615071332F526C342B67427652773D3D |
        +----+-----+
      2. 使用封装密钥集对tel列加密:

        select /*+ MAPJOIN(a) */ 
               id,
               name,
        	   gender,
        	   id_card_no,
               ENHANCED_SYM_ENCRYPT(
                   USE_WRAPPED_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz****************1t', 
                                      'acs:ram::1**************7:role/kms', 
                                      unhex('613256354C576836656A59314D6D59344E7A6B7A624452754D6D3434627A49786443317A655859786358426F4E6A4D78447654524C4632635077766E74554654584579715242583953724167446D2F397131786F57456E6F5474516739633853766242674456773565736674714A4D5435524455382F6F6A2B4E61766D774344494C734B6A416B6B675A42496F5568656F566D38564C4F30506D4778767137646956517453447A5467395147775639533161305A464A6D6A45562B6742722F56386653444D6E424D2B71493779784668303866594E6D336578775744423949726B645A3469784F2B532B476E6750523854524A58326E5768666478347034473468687248684A514D615071332F526C342B67427652773D3D')
                                     ),
                   tel
               ) as tel 
         FROM mf_user_info;

        返回结果示例如下:

        +------------+------+--------+------------+------+
        | id         | name | gender | id_card_no | tel  |
        +------------+------+--------+------------+------+
        | 1          | bob  | male   | 0001       | =F1=EEa=13V9=CCsB=90=E7=F3fl=D2=CB=F31=D8=3D=88=B7=F7=0CnG=E3\R=FC)=F2=10=3D2e=01=00=90=86=05=94z;=18=A6j=1CN=E5=9F=AC)=8D=D6=D8=0D=A2Y{kq=EE=F4~=C4=A7=9BS=A1w |
        | 2          | allen | male   | 0011       | =F1=EEa=13V9=CCsB=90=E7=F3fl=D2=CB=F31=D8=3D=88=B7=F7=0CnG=E3\R=FC)=F2=10=3D2e=01=00=20=AA=05=94z;=85=D8=08a=A2]=02d=20=B1=C3=AE=AF=1C{=EB=EA=C4=81=B5A=15=1BR=F7g=9B |
        | 3          | kate | female | 0111       | =F1=EEa=13V9=CCsB=90=E7=F3fl=D2=CB=F31=D8=3D=88=B7=F7=0CnG=E3\R=FC)=F2=10=3D2e=01=00=20=B6=05=94z;[C=12=81=8B<=C1=9D=E2=CF=CE=BC=AE=A7=84=0F[=7CI=B9=B7=9D=DD=89=A8=FD! |
        | 4          | annie | female | 1111       | =F1=EEa=13V9=CCsB=90=E7=F3fl=D2=CB=F31=D8=3D=88=B7=F7=0CnG=E3\R=FC)=F2=10=3D2e=01=00=00=A2=05=94z;E=03A=BC=7C=88=CFJ=14=B9=BD=A1=BF=ED=20=11=A3=A6/+%=0Fe=DD=C7=C8=0A |
        +------------+------+--------+------------+------+

ENHANCED_SYM_DECRYPT

  • 命令格式

    binary ENHANCED_SYM_DECRYPT(binary <keyset> , binary <ciphertext> [,string <additional_data>])
  • 命令说明

    MaxCompute支持使用ENHANCED_SYM_DECRYPT函数指定生成的基础密钥集或封装密钥集对数据进行解密,解密使用的基础密钥集或封装密钥集需与加密时使用的一致。封装密钥集是通过KMS密钥对生成的密钥集(KEYSET)再次进行加密,结合密钥管理服务做密钥管理,相比基础密钥集会更加安全。

    使用ENHANCED_SYM_DECRYPT函数前需要完成以下操作:

    • 已有通过NEW_KEYSETNEW_WRAPPED_KEYSET函数生成的基础密钥集或封装密钥集,详情请参见NEW_KEYSETNEW_WRAPPED_KEYSET

    • 如果使用封装密钥集解密数据,需要有使用封装密钥集对应角色的权限,操作详情请参见开通KMS并完成配置

  • 参数说明

    • keyset:必填,用户密钥集, 类型为BINARY或者密钥集的STRUCT类型。

      重要

      解密使用的基础密钥集或封装密钥集需与加密时使用的一致。

    • ciphertext: 必填,经过密钥集加密过待解密的BINARY类型密文。

    • additional_data: 可选,算法支持的STRING类型验证信息。

  • 返回值说明

    返回BINARY类型的明文。

  • 示例数据

    --创建表
    create table mf_user_info(id bigint,
                              name string,
                              gender string,
                              id_card_no string,
                              tel string);
    --插入数据
    insert overwrite table mf_user_info values(1,"bob","male","0001","13900001234"),
                                           (2,"allen","male","0011","13900001111"),
                                         (3,"kate","female","0111","13900002222"),
                                         (4,"annie","female","1111","13900003333");
    --查询数据
    select * from mf_user_info;
    +------------+------+--------+------------+------------+
    | id         | name | gender | id_card_no |    tel     |
    +------------+------+--------+------------+------------+
    | 1          | bob  | male   | 0001       | 13900001234|
    | 2          | allen| male   | 0011       | 13900001111|
    | 3          | kate | female | 0111       | 13900002222|
    | 4          | annie| female | 1111       | 13900003333|
    +------------+------+--------+------------+------------+
  • 示例

    • 使用普通密钥集对mf_user_info表已加密的id_card_no列解密:

      重要

      解密前请确保已对数据加密,且解密使用的基础密钥集或封装密钥集需与加密时使用的一致,加密操作示例请参见ENHANCED_SYM_ENCRYPT

      insert overwrite table mf_user_info 
      select id,
          name,
          gender,
             ENHANCED_SYM_DECRYPT(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), unbase64(id_card_no) )as id_card_no,
            tel
      from mf_user_info;

      查询解密结果示例如下:

      select * from mf_user_info;
      
      --返回结果示例
      +------------+------+--------+------------+------------+
      | id         | name | gender | id_card_no |    tel     |
      +------------+------+--------+------------+------------+
      | 1          | bob  | male   | 0001       | 13900001234|
      | 2          | allen| male   | 0011       | 13900001111|
      | 3          | kate | female | 0111       | 13900002222|
      | 4          | annie| female | 1111       | 13900003333|
      +------------+------+--------+------------+------------+
    • 使用封装密钥集对mf_user_info表已加密的tel列解密:

       select /*+ MAPJOIN(a) */ 
             id,
             name,
      	   gender,
      	   id_card_no,
             ENHANCED_SYM_DECRYPT(
               USE_WRAPPED_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz****************1t', 
                                    'acs:ram::1**************7:role/kms', 
                                    unhex('613256354C576836656A59314D6D59344E7A6B7A624452754D6D3434627A49786443317A655859786358426F4E6A4D78447654524C4632635077766E74554654584579715242583953724167446D2F397131786F57456E6F5474516739633853766242674456773565736674714A4D5435524455382F6F6A2B4E61766D774344494C734B6A416B6B675A42496F5568656F566D38564C4F30506D4778767137646956517453447A5467395147775639533161305A464A6D6A45562B6742722F56386653444D6E424D2B71493779784668303866594E6D336578775744423949726B645A3469784F2B532B476E6750523854524A58326E5768666478347034473468687248684A514D615071332F526C342B67427652773D3D')
                                   ),
             	 ENHANCED_SYM_ENCRYPT(
                 USE_WRAPPED_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz****************1t', 
                                    'acs:ram::1**************7:role/kms', 
                                    unhex('613256354C576836656A59314D6D59344E7A6B7A624452754D6D3434627A49786443317A655859786358426F4E6A4D78447654524C4632635077766E74554654584579715242583953724167446D2F397131786F57456E6F5474516739633853766242674456773565736674714A4D5435524455382F6F6A2B4E61766D774344494C734B6A416B6B675A42496F5568656F566D38564C4F30506D4778767137646956517453447A5467395147775639533161305A464A6D6A45562B6742722F56386653444D6E424D2B71493779784668303866594E6D336578775744423949726B645A3469784F2B532B476E6750523854524A58326E5768666478347034473468687248684A514D615071332F526C342B67427652773D3D')
                                   ),
                 tel
             ),
             ''
            )
             as tel 
       FROM mf_user_info;

      返回结果示例如下:

      +------------+------+--------+------------+------+
      | id         | name | gender | id_card_no | tel  |
      +------------+------+--------+------------+------+
      | 1          | bob  | male   | 0001       | 13900001234 |
      | 2          | allen | male   | 0011       | 13900001111 |
      | 3          | kate | female | 0111       | 13900002222 |
      | 4          | annie | female | 1111       | 13900003333 |
      +------------+------+--------+------------+------+

相关文档