MaxCompute SQL提供了加密函数和解密函数,您可以根据实际需要选择合适的函数,进行加密或解密。本文为您提供MaxCompute SQL支持的加密函数的命令格式、参数说明及示例,指导您使用加密函数完成开发。
MaxCompute数据加密能力介绍
单一密钥加密:支持生成单一密钥,需要自行保存生成的密钥,适用于对指定列做随机性加密或解密。
MaxCompute SQL单一密钥加解密函数介绍如下。
函数
功能
对表里的指定已经随机性加密的列做解密,返回BINARY类型的明文。
对表里的指定列做随机性加密,返回BINARY类型的密文。
多密钥加密:MaxCompute密钥管理对象Keyset,可以存放1个或多个密钥,您可以手动在Keyset中增加密钥,密钥的轮转和查看原始密钥。
MaxCompute SQL多密钥加解密函数介绍如下。
函数
功能
根据指定的算法类型,创建对应的密钥Keyset。
在Keyset中新增密钥,并将新增的密钥设置为主密钥。
将BINARY类型的密钥Keyset转化为可读的JSON格式,以便查看密钥Keyset详情。
将JSON类型的keyset转化为BINARY类型。
系统自动生产一个新密钥并将新密钥设置为主密钥。
结合KMS封装的多密钥加密:MaxCompute支持结合KMS进行数据加密,系统会自动生成加解密数据的密钥集(Keyset),该Keyset与KMS密钥结合生成Keyset_KMS,用户需要保存keyset_KMS。若需要数据解密时,需要提供Keyset_KMS,然后系统会结合KMS密钥对Keyset_KMS进行解密,还原成加密数据的Keyset并对数据进行解密。
MaxCompute SQL结合KMS封装的多密钥加解密函数介绍如下。
函数
功能
将有权使用KMS用户主密钥资源名称(kms_cmk_arn)角色的
role_arn
授权给MaxCompute,用来新建一个封装密钥集(KEYSET),也可通过角色链(role_chain
)方式授权给其他阿里云账号解密KEYSET的权限。通过指定的KMS密钥重新加密封装密钥集(KEYSET)。
解密已有的加密密钥集(KEYSET),并进行密钥轮转,然后通过新密钥加密。
将封装密钥集转换为基础密钥集,作为加解密函数的参数使用,您也可通过此函数,获得封装密钥集相关的信息,并保存起来,便于维护。
指定密钥集进行数据加密。
指定密钥集进行数据解密。
注意事项
升级到MaxCompute 2.0后,产品扩展了部分函数。如果您用到的函数涉及新数据类型(TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMP或BINARY),在使用扩展函数时,需要执行如下语句开启新数据类型开关:
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-256、AES-SIV-CMAC-128和AES-SIV-CMAC-256。
description:可选,数据密钥的描述。
返回值说明
返回BINARY类型的KeySet。
示例
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-256、AES-SIV-CMAC-128和AES-SIV-CMAC-256。
raw_key:必填,待新增的密钥,并将此密钥设置为主密钥,类型为:BINARY。
description:可选,对数据密钥的描述。
返回值说明
返回BINARY类型的KeySet。
示例
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。
示例
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-256、AES-SIV-CMAC-128和AES-SIV-CMAC-256。
description:可选,数据密钥的描述。
返回值说明
返回BINARY类型的KeySet。
示例
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-256、AES-SIV-CMAC-128和AES-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-256、AES-SIV-CMAC-128和AES-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_KEYSET
或NEW_WRAPPED_KEYSET
函数生成的基础密钥集或封装密钥集,详情请参见NEW_KEYSET、NEW_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
列加密:生成封装密钥集并写入表中:
--创建表并把加密后的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 | +----+-----+
使用封装密钥集对
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_KEYSET
或NEW_WRAPPED_KEYSET
函数生成的基础密钥集或封装密钥集,详情请参见NEW_KEYSET、NEW_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 | +------------+------+--------+------------+------+