通过应用程序管理密钥

本主题描述如何通过应用程序管理列加密密钥。 它解释了如何提供主密钥以及如何使用这些主密钥来写入和读取加密数据。

提供主密钥

要提供主密钥:

  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" 参数,那么将抛出异常。

读取加密数据

必需的元数据将存储在加密的 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)

注: 只能对使用设置为 "false""parquet.encryption.key.material.store.internally" 参数编写的文件执行密钥轮换。