10、加密函数
0、概述
单一密钥加密:支持生成单一密钥,需要自行保存生成的密钥,适用于对指定列做随机性加密或解密。
分类 | 函数 | 功能 |
---|---|---|
单一密钥加密 | SYM_DECRYPT | 对表里的指定已经随机性加密的列做解密,返回BINARY类型的明文。 |
单一密钥加密 | SYM_ENCRYPT | 对表里的指定列做随机性加密,返回BINARY类型的密文。 |
- 多密钥加密:MaxCompute密钥管理对象Keyset,可以存放1个或多个密钥,您可以手动在Keyset中增加密钥,密钥的轮转和查看原始密钥。
函数 | 功能 |
---|---|
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并对数据进行解密。
函数 | 功能 |
---|---|
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 | 指定密钥集进行数据解密。 |
1、单一密钥加密
SYM_DECRYPT
:对表里的指定已经随机性加密的列做解密,返回BINARY类型的明文。
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。
-- 123456789
SELECT sym_decrypt(
unbase64('XZGEaAEAcHHrhIISRc0IEMP8dIGwmLs3QyApJJG3m6lsb71D3g==')
,cast('b75585cf321cdcad42451690cdb7bfc4' AS binary)
);
-- 123456789
SELECT sym_decrypt(
unbase64('n5GEaAEAsFJ8uYISOWH4f6waLXEYfknvWXqIU4xRxOTiS//HMA==')
,cast('b75585cf321cdcad42451690cdb7bfc4' AS binary)
,'AES-GCM-256'
,'test'
);
SYM_ENCRYPT
:对表里的指定列做随机性加密,返回BINARY类型的密文。
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。
-- XZGEaAEAcHHrhIISRc0IEMP8dIGwmLs3QyApJJG3m6lsb71D3g==
SELECT BASE64(
sym_encrypt('123456789'
,cast('b75585cf321cdcad42451690cdb7bfc4' AS binary)
)
);
-- n5GEaAEAsFJ8uYISOWH4f6waLXEYfknvWXqIU4xRxOTiS//HMA==
SELECT BASE64(
sym_encrypt('123456789'
,cast('b75585cf321cdcad42451690cdb7bfc4' AS binary)
,'AES-GCM-256'
,'test'
)
);
2、多密钥加密
NEW_KEYSET
:根据指定的算法类型,创建对应的密钥Keyset。
binary NEW_KEYSET(string <key_type>, [string <description>])
- 入参
key_type
:必填,创建数据密钥时,指定的算法类型。目前支持:AES-GCM-256、AES-SIV-CMAC-128和AES-SIV-CMAC-256。
description
:可选,数据密钥的描述。
-- 0A10645A61456141454173426F666D59495312520A330A0B4145532D47434D2D3235361220FA2137E09C024F70F6C3D309B86F3FC6E861EF09DDFFD13088CBCC076615AF561801200210011A10645A61456141454173426F666D59495320022A0568656C6C6F
SELECT hex(new_keyset('AES-GCM-256','hello'));
ADD_KEY_TO_KEYSET
:在Keyset中新增密钥,并将新增的密钥设置为主密钥。
binary ADD_KEY_TO_KEYSET(binary <keyset>, string <key_type>, binary <raw_key>, [string <description>])
- 入参
keyset
:必填,已有密钥,类型为:BINARY。key_type
:必填:添加密钥的算法类型。目前支持:AES-GCM-256、AES-SIV-CMAC-128和AES-SIV-CMAC-256。raw_key
:必填,待新增的密钥,并将此密钥设置为主密钥,类型为:BINARY。description
:可选,对数据密钥的描述。
select hex(ADD_KEY_TO_KEYSET(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), 'AES-SIV-CMAC-128', unhex('b75585cf321cdcad42451690cdb7bfc49c26092f60f854e72d43244c55620a3d'),'description') );
KEYSET_TO_JSON
:将BINARY类型的密钥Keyset转化为可读的JSON格式,以便查看密钥Keyset详情。
STRING KEYSET_TO_JSON(BINARY <keyset>)
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"} |
+------------+
KEYSET_FROM_JSON
:将JSON类型的keyset转化为BINARY类型。
binary KEYSET_FROM_JSON(string <json_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"}')) ;
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
:可选,数据密钥的描述。
select ROTATE_KEYSET(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), 'AES-SIV-CMAC-256', 'hello world') ;
3、结合KMS封装的多密钥加密
NEW_WRAPPED_KEYSET
:将有权使用KMS用户主密钥资源名称(kms_cmk_arn)角色的role_arn
授权给MaxCompute,用来新建一个封装密钥集(KEYSET),也可通过角色链(role_chain
)方式授权给其他阿里云账号解密KEYSET的权限。
binary NEW_WRAPPED_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <key_type>
[, string <description>, [string <role_chain>]])
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
:通过指定的KMS密钥重新加密封装密钥集(KEYSET)。
binary REWRAP_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <wrapped_keyset>, [string <role_chain>])
-- 重新加密封装密钥集:
@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
:解密已有的加密密钥集(KEYSET),并进行密钥轮转,然后通过新密钥加密。
binary ROTATE_WRAPPED_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <wrapped_keyset>,string <key_type> [,string description,[string <role_chain>]])
-- 重新加密封装密钥集:
@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>])
-- 获取封装密钥集的密钥算法信息:
@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');
ENHANCED_SYM_ENCRYPT
:指定密钥集进行数据加密。
binary ENHANCED_SYM_ENCRYPT(binary <keyset> , string|binary <plaintext> [,string <additional_data>])
select id,
name,
gender,
base64(ENHANCED_SYM_ENCRYPT(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), id_card_no ))as id_card_no,
tel
from mf_user_info;
ENHANCED_SYM_DECRYPT
:指定密钥集进行数据解密。
binary ENHANCED_SYM_DECRYPT(binary <keyset> , binary <ciphertext> [,string <additional_data>])
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;