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级别数据类型的注意事项,请参见数据类型版本说明

命令格式

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,可以用来验证数据的真实性和完整性,数据在加密时用了AAD,解密时就需要输入AAD。

返回值说明

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

示例

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

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

    基于示例1:基于明文密钥加密,对表mf_user_info中的列进行解密。命令如下:

    • 使用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:解密密钥表加密数据。

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

    --对目标表的列进行解密
    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_DECRYPT函数属于加密函数,更多加密、解密的相关函数请参见加密函数