全部產品
Search
文件中心

MaxCompute:SYM_ENCRYPT

更新時間:Jun 19, 2024

對錶裡的指定列做隨機性加密,並返回加密後的BINARY類型密文。

注意事項

升級到MaxCompute 2.0後,產品擴充了部分函數。如果您用到的函數涉及新資料類型(TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMP或BINARY),在使用擴充函數時,需要執行如下語句開啟新資料類型開關:

  • Session層級:如果使用新資料類型,您需要在SQL語句前加上set odps.sql.type.system.odps2=true;,並與SQL語句一起提交執行。

  • Project層級:Project Owner可根據需要對Project進行設定,等待10~15分鐘後才會生效。命令如下。

    setproject odps.sql.type.system.odps2=true;

    setproject的詳細說明請參見專案空間操作。關於開啟Project層級資料類型的注意事項,請參見資料類型版本說明

命令格式

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函數屬於加密函數,更多加密、解密的相關函數請參見加密函數