Gerenciamento de chave por aplicativo
Este tópico descreve como gerenciar as chaves de criptografia de coluna por aplicativo. Ela explica como fornecer chaves mestras e como gravar e ler dados criptografados usando essas chaves mestras.
Fornecendo chaves mestras
Para fornecer chaves mestras:
-
Configure a classe implementa EncryptionPropertiesFactory:
parameter name: "parquet.crypto.factory.class" parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory" -
Passe as chaves mestras explícitas, no formato a seguir:
parameter name: "parquet.encryption.key.list" parameter value: "<master key ID>:<master key (base64)> , <master key ID>:<master key (base64)>.."Por exemplo:
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==")O comprimento das chaves mestras antes da codificação em base64 pode ser de 16, 24 ou 32 bytes (128, 192 ou 256 bits).
Gravando dados criptografados
Para gravar dados criptografados:
-
Especifique quais colunas serão criptografadas e quais chaves mestras serão usadas:
parameter name: "parquet.encryption.column.keys" parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,..." -
Especifique a chave de rodapé:
parameter name: "parquet.encryption.footer.key" parameter value: "<master key ID>"Por exemplo:
dataFrame.write .option("parquet.encryption.footer.key" , "k1") .option("parquet.encryption.column.keys" , "k2:SSN,Address;k3:CreditCard") .parquet("<path to encrypted files>")Nota: se o parâmetro
"parquet.encryption.column.keys"ou o parâmetro"parquet.encryption.footer.key"não for configurado, uma exceção será lançada.
Lendo dados criptografados
Os metadados necessários são armazenados nos arquivos Parquet criptografados.
Para ler os dados criptografados:
- Configure a classe implementa EncryptionPropertiesFactory:
sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory") - Forneça as chaves de criptografia:
sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==") - Chame os comandos de leitura regulares do parquet, como:
val dataFrame = spark.read.parquet("<path to encrypted files>")
Rotação de chaves
Se a rotação de chave for necessária, as propriedades de configuração a seguir do Hadoop deverão ser configuradas:
- Os parâmetros
"parquet.encryption.key.list","parquet.encryption.new.key.list" - O parâmetro
"parquet.encryption.key.material.store.internally"deve ser configurado como"false" - O parâmetro
"parquet.encryption.kms.client.class"deve ser configurado como"com.ibm.parquet.key.management.InMemoryKMS" - O parâmetro
"parquet.crypto.factory.class"deve ser configurado como"com.ibm.parquet.key.management.IBMKeyToolsFactory"
Por exemplo:
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)
Nota: a rotação de chaves pode ser executada apenas para arquivos gravados com o parâmetro "parquet.encryption.key.material.store.internally" configurado como "false".