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支援結合Key Management Service做密鑰管理,通過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,您可以在Key Management Service控制台的密鑰詳情頁面擷取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支援結合Key Management Service做密鑰管理,通過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,您可以在Key Management Service控制台的密鑰詳情頁面擷取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支援結合Key Management Service做密鑰管理,通過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,您可以在Key Management Service控制台的密鑰詳情頁面擷取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支援結合Key Management Service做密鑰管理,通過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,您可以在Key Management Service控制台的密鑰詳情頁面擷取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)再次進行加密,結合Key Management Service做密鑰管理,相比基礎密鑰集會更加安全。使用
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)再次進行加密,結合Key Management Service做密鑰管理,相比基礎密鑰集會更加安全。使用
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 | +------------+------+--------+------------+------+