全部產品
Search
文件中心

ApsaraDB RDS:個人隱私保護

更新時間:Jun 19, 2024

全密態資料庫可以用於個人隱私保護,防止使用者隱私泄露,本文介紹將全密態資料庫用於個人隱私保護的最佳實務。

情境介紹

以某保險公司業務情境為例,保險公司投保人員資訊表(person)如下,記錄了使用者隱私資料,現需對這些隱私資料進行加密:

姓名(name)

手機號(phone)

社會安全號碼(ID)

銀行卡號(debit_card)

家庭住址(address)

淘小寶

13900001111

111222190002309999

6225888888888888

杭州市ABC路888號

釘三多

13900002222

111222190002308888

6225666666666666

杭州市DEF路666號

說明

上表中資料僅為樣本。

保險公司投保人員資訊表中,投保人員敏感資訊在離開手機端時,被資料部門加密保護。銷售部門、應用服務以及資料庫側只能看到密文資料,無法泄露投保人員隱私資料。

  • 使用者可以通過保險公司手機APP,對資料進行加密後,寫入或者更新個人資訊。

  • 保險公司銷售部門直接連接查詢資料庫,僅能看到資料密文,看不到明文內容。

加密流程

前提條件

  • 已完全瞭解並掌握全密態資料庫的基本使用,更多資訊,請參見產品概述

  • 已下載並配置全密態資料庫提供的用戶端SDK或JDBC,更多資訊,請參見用戶端使用說明

  • 已下載EncDB Tool工具,該工具主要用於輔助完成使用者主要金鑰匯入、認證(公私密金鑰對)註冊、BCL簽發和撤銷等操作。

    EncDB Tool工具基於傳入參數,產生可直接在資料庫中執行的SQL命令。您可以將EncDB Tool工具下載並解壓後,使用./genEncdbSQLCommand.sh --help命令查看更多解釋。

    說明

    BCL的更多資訊,請參見授權多使用者訪問

準備工作

說明

本文以CentOS環境為例進行命令配置。

  1. 密碼套件配置。

    1. 配置密碼套件變數。

      cipher_suite=RSA_WITH_AES_128_CBC_SHA256
    2. 組建檔案模板。

      說明

      本樣本基於檔案模板,通過如下命令在sample目錄下產生後續樣本所需要的設定檔,其中包括使用者密鑰檔案、授權檔案等。

      ./generateSampleKeyAndBCLs.sh -c ${cipher_suite}
  2. 初始化資料庫。

    1. 建立資料庫。

      CREATE DATABASE demo;
      說明

      本文以demo為例,您可以根據實際情況命名資料庫,請注意在後續命令中進行同步修改。

    2. 在資料庫下建立全密態資料庫擴充。

      CREATE EXTENSION encdb;
    3. 擷取全密態資料庫執行個體密鑰憑證並寫入到本地檔案中。

      SELECT encode(db_process_msg_api('{"request_type":0,"version":"1.2.8"}'),'escape')::json->'server_info'->'public_key'
      說明
      • 本文以本地檔案default_enclave_public_key.pem為例進行示範,您可以根據實際情況命名本地檔案,請注意在後續命令中進行同步修改。

      • 密鑰憑證內容不包含頭尾""

    4. 轉換為標準密鑰憑證檔案格式。

      1. 執行以下命令將\\n替換為分行符號(\n):

        sed -i 's/\\\\n/\n/g' default_enclave_public_key.pem
      2. 執行以下命令去除所有空行:

        sed -i '/^[ ]*$/d' default_enclave_public_key.pem

個人隱私保護流程樣本

保險公司資料部門

  1. 保險公司資料部門準備投保人員資訊。

    -------- 建立使用者 --------
    -- 資料部門,對使用者資料負責
    CREATE USER ins_data;
    -- 銷售部門
    CREATE USER ins_sale;
    
    -------- 建立表 --------
    -- 為資料部門建立投保人員資訊表
    CREATE TABLE person (
        name enc_text,
        phone enc_text,
        ID enc_text,
        debit_card enc_text,
        address enc_text
    );
    -- 授權資料部門訪問資料表
    GRANT ALL ON person TO ins_data;
  2. 註冊保險公司資料部門使用者。

    說明

    EncDB Tool工具將會基於傳入的參數自動產生SQL語句,您需要將產生的SQL在資料庫中執行。

    ./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_data.bin -e default_enclave_public_key.pem -c ${cipher_suite}
    
    # 擷取資料部門帳號MEKID,可以通過SQL查詢獲得:SELECT encdb_get_current_mek_id();
    # 本文以178079820457738240為例
    mekid_data=178079820457738240 
    
    ./genEncdbSQLCommand.sh -r BCL_REGISTER --mekid ${mekid_data} --mek sample/default_mek_data.bin --puk sample/usr_puk_data.pem --pri sample/usr_pri_data.pem -c ${cipher_suite}
  3. 保險公司資料部門為投保資訊表建立加密金鑰。

    說明
    • 如下命令需使用ins_data使用者執行。

    • 命令中的encdb.dek_xxx()encdb.keyname_xxx()為類型轉換函式,更多用法,請參見類型轉換函式說明

    -- 建立dek,記錄groupid,例如 b6785611-0c49-4f13-87a9-13f151de9b4d
    SELECT encdb.dek_generate(encdb.keyname_generate('ins_data','demo','public','person','name'));
    
    -- 此處僅為樣本,同步給所有列,即共用一個dek
    SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','phone'),encdb.keyname_generate('ins_data','demo','public','person','name'));
    SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','ID'),encdb.keyname_generate('ins_data','demo','public','person','name'));
    SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','debit_card'),encdb.keyname_generate('ins_data','demo','public','person','name'));
    SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','address'),encdb.keyname_generate('ins_data','demo','public','person','name'));

    正常情況下,不允許使用者直接通過SQL加密資料(不安全),使用者需要明確授權該行為。

    1. 編輯BCL內容,將目標dek的授權範圍(包括groupid)更新到BCL中。

      ./setGroupIdBCL.sh -d b6785611-0c49-4f13-87a9-13f151de9b4d
      說明

      本樣本中的b6785611-0c49-4f13-87a9-13f151de9b4d僅為樣本,實際取值請從如下命令中擷取:

      SELECT encdb.dek_generate(encdb.keyname_generate('ins_data','demo','public','person','name'));
    2. 簽發BCL。

      ./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_data.pem --spuk sample/usr_puk_data.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_for_data_insert.txt -c ${cipher_suite}
      ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_data.pem --spuk sample/usr_puk_data.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_for_data_insert.txt -c ${cipher_suite}
  4. 保險公司資料部門寫入資料。

    說明

    如下命令需使用ins_data使用者執行。

    INSERT INTO person VALUES(encdb.enc_text_encrypt('淘小寶',encdb.keyname_generate('ins_data','demo','public','person','name')),
                              encdb.enc_text_encrypt('13900001111',encdb.keyname_generate('ins_data','demo','public','person','phone')),
                              encdb.enc_text_encrypt('111222190002309999',encdb.keyname_generate('ins_data','demo','public','person','ID')),
                              encdb.enc_text_encrypt('6225888888888888',encdb.keyname_generate('ins_data','demo','public','person','debit_card')),
                              encdb.enc_text_encrypt('杭州市ABC路888號',encdb.keyname_generate('ins_data','demo','public','person','address')));
    INSERT INTO person VALUES(encdb.enc_text_encrypt('釘三多',encdb.keyname_generate('ins_data','demo','public','person','name')),
                              encdb.enc_text_encrypt('13900002222',encdb.keyname_generate('ins_data','demo','public','person','phone')),
                              encdb.enc_text_encrypt('111222190002308888',encdb.keyname_generate('ins_data','demo','public','person','ID')),
                              encdb.enc_text_encrypt('6225666666666666',encdb.keyname_generate('ins_data','demo','public','person','debit_card')),
                              encdb.enc_text_encrypt('杭州市DEF路666',encdb.keyname_generate('ins_data','demo','public','person','address')));
  5. 保險公司資料部門查詢資料。

    • 直接查看資訊表,查詢結果均為密文。

      SELECT name,phone FROM person;
                                        name                                    |                                  phone                                   
      --------------------------------------------------------------------------+--------------------------------------------------------------------------
       \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c 
       \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890  
      (2 行記錄)
    • 使用ins_data使用者執行如下命令,查詢結果為明文。

      SELECT encdb.decrypt(name) FROM person WHERE name LIKE encdb.enc_text_encrypt('淘%',encdb.keyname_generate('ins_data','demo','public','person','name'));
       decrypt
      ---------
       淘小寶
      (1 row)

保險公司銷售部門

  1. 註冊保險公司銷售部門帳號。

    說明

    EncDB Tool工具將會基於傳入的參數自動產生SQL語句,您需要將產生的SQL在資料庫中執行。

    ./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_sale.bin -e default_enclave_public_key.pem -c ${cipher_suite}
    
    # 擷取銷售部門帳號MEKID,可以通過SQL查詢獲得:SELECT encdb_get_current_mek_id();
    # 本文以2715553450389700608為例
    mekid_sale=2715553450389700608
    
    ./genEncdbSQLCommand.sh -r BCL_REGISTER --mekid ${mekid_sale} --mek sample/default_mek_sale.bin --puk sample/usr_puk_sale.pem --pri sample/usr_pri_sale.pem -c ${cipher_suite}
  2. 保險公司銷售部門查詢資料。

    銷售部門未得到資料部門授權,無法查看資料內容,投保人員隱私資料得到保護。

    • 直接查看資訊表,查詢結果均為密文。

      SELECT name,phone FROM person;
                                        name                                    |                                  phone                                   
      --------------------------------------------------------------------------+--------------------------------------------------------------------------
       \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c 
       \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890  
      (2 行記錄)
      說明

      如果出現ERROR: permission denied for table person的錯誤時,執行GRANT SELECT ON person TO ins_sale;授權訪問表。

    • 使用ins_sale使用者執行如下命令,提示未進行BCL授權。

      SELECT encdb.decrypt(name) FROM person;
       WARNING:  -- encdb -- -- Untrusted log -- 4 - src/core/untrusted/src/encdb_untrusted_enclave.cpp,256,encdb_ecall: Select BCL (subject_mekid: 2715553450389700608, issuer_mekid: 178079820457738240) from table fail - returned 0xfa030000
       ERROR:  encdb_ext_enc_text_decrypt: enc_text decrypt errno:fa030000