對錶裡的指定列做隨機性加密,並返回加密後的BINARY類型密文。
注意事項
升級到MaxCompute 2.0後,產品擴充了部分函數。如果您用到的函數涉及新資料類型(TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMP或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。
傳回值說明
返回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|
+------------+------+--------+------------+-----+
相關函數
SYM_ENCRYPT函數屬於加密函數,更多加密、解密的相關函數請參見加密函數。