依應用程式的金鑰管理

本主題說明應用程式如何管理直欄加密金鑰。 它說明如何提供主要金鑰以及如何使用這些主要金鑰來寫入及讀取加密資料。

提供主要金鑰

若要提供主要金鑰,請執行下列作業:

  1. 設定實作 EncryptionPropertiesFactory 的類別:

    parameter name: "parquet.crypto.factory.class"
    parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory"
    
  2. 傳遞採用下列格式的明確主要金鑰:

    parameter name: "parquet.encryption.key.list"
    parameter value: "<master key ID>:<master key (base64)> , <master key ID>:<master key (base64)>.."
    

    例如:

    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==")
    

    在進行 base64 編碼之前的主要金鑰長度可以為 16、24 或 32 個位元組(128、192 或 256 個位元)。

寫入加密的資料

若要寫入加密資料,請執行下列動作:

  1. 指定要加密哪些直欄,以及要使用哪些主要金鑰:

    parameter name:  "parquet.encryption.column.keys"
    parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,..."
    
  2. 指定標底金鑰:

    parameter name:  "parquet.encryption.footer.key"
    parameter value:  "<master key ID>"
    

    例如:

    dataFrame.write
    .option("parquet.encryption.footer.key" , "k1")
    .option("parquet.encryption.column.keys" , "k2:SSN,Address;k3:CreditCard")
    .parquet("<path to encrypted files>")
    

    附註: 如果未設定 "parquet.encryption.column.keys" 參數或 "parquet.encryption.footer.key" 參數,則會擲出異常狀況。

讀取加密的資料

必要的 meta 資料儲存在已加密的 Parquet 檔中。

若要讀取加密資料,請執行下列動作:

  1. 設定實作 EncryptionPropertiesFactory 的類別:
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    
  2. 提供加密金鑰:
    sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==")
    
  3. 呼叫一般的 parquet 讀取指令,例如:
    val dataFrame = spark.read.parquet("<path to encrypted files>")
    

金鑰輪換

如果需要金鑰輪替,則必須設定下列 Hadoop 配置內容:

  • 參數 "parquet.encryption.key.list""parquet.encryption.new.key.list"
  • 參數 "parquet.encryption.key.material.store.internally" 必須設為 "false"
  • 參數 "parquet.encryption.kms.client.class" 必須設為 "com.ibm.parquet.key.management.InMemoryKMS"
  • 參數 "parquet.crypto.factory.class" 必須設為 "com.ibm.parquet.key.management.IBMKeyToolsFactory"

例如:

sc.hadoopConfiguration.set("parquet.encryption.key.list", OLD_KEYS)
sc.hadoopConfiguration.set("parquet.encryption.new.key.list", NEW_KEYS)
sc.hadoopConfiguration.set("parquet.encryption.key.material.store.internally", "false")
sc.hadoopConfiguration.set("parquet.encryption.kms.client.class", "com.ibm.parquet.key.management.InMemoryKMS")
sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")

KeyToolkit.rotateMasterKeys("<path to encrypted files>", sc.hadoopConfiguration)

附註: 只有在 "parquet.encryption.key.material.store.internally" 參數設為 "false" 的情況下寫入的檔案才能執行金鑰輪替。