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 | +------------+------+--------+------------+------+