Para acessar dados em colunas protegidas por criptografia de coluna a partir de uma aplicação Java, use o driver EncJDBC para se conectar ao banco de dados. Esse driver oferece uma maneira prática e econômica de trabalhar com dados criptografados. Este tópico demonstra como usar o EncJDBC para recuperar texto simples de colunas criptografadas do banco de dados.
Ao fornecer a chave mestra de criptografia, o canal de transmissão de dados fica totalmente criptografado. O cliente EncJDBC descriptografa automaticamente os dados e retorna o texto simples, permitindo que a aplicação exiba as informações com configurações mínimas.
Pré-requisitos
Execute uma varredura de detecção de dados sensíveis para identificar as colunas que exigem criptografia.
Configure a criptografia de coluna para o banco de dados de destino e defina a permissão da conta do banco de dados como Ciphertext Permission (JDBC Decryption). Para obter instruções detalhadas, consulte Criptografia de coluna.
Gerar uma MEK
Intervalo de valores: string hexadecimal de 16 bytes, com exatamente 32 caracteres.
Com base no key type selecionado durante a configuração da criptografia de coluna, use uma KMS Key ou gere uma local key como MEK para descriptografar o banco de dados.
Chave KMS
Garanta que o service KMS esteja disponível ao usar uma chave KMS. Caso contrário, o driver de cliente always-confidential EncJDBC não funcionará.
Obtenha o endpoint da instância KMS proprietária da KMS key selecionada na configuração de criptografia de coluna do banco de dados, além do AccessKey ID e do AccessKey secret da conta Alibaba Cloud ou do usuário RAM (que deve ter permissão de descriptografia do KMS) para ler essa chave KMS a partir do cliente. Siga estas etapas:
Faça login no console usando uma conta Alibaba Cloud ou um usuário RAM.
-
-
-
Chave local
Quando o Encryption Method na configuração de criptografia de coluna do banco de dados estiver definido como Local Key, gere uma MEK. Exemplo: 00112233445566778899aabbccddeeff.
Os métodos comuns de geração incluem geradores de senhas ou funções aleatórias em linguagens de programação.
Exemplos:
No Linux, use a ferramenta OpenSSL integrada executando
openssl rand -hex 16para gerar uma chave.No Windows, instale o pacote de software OpenSSL.
Instruções de integração do cliente
Use o JDK 1.8 ou superior para Java.
No lado do cliente, altere o driver de conexão do banco de dados para EncJDBC, atualize a URL de conexão do banco de dados e especifique a MEK para acessar texto simples a partir de colunas criptografadas do banco de dados.
1. Instale dependências
Adicione a seguinte dependência ao arquivo de configuração do projeto Maven pom.xml.
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-cls-jdbc</artifactId>
<version>1.0.10-3</version>
</dependency>
2. Configure a MEK para conectar ao banco de dados
Os métodos a seguir descrevem como configurar a MEK: configuração de propriedades JDBC, configuração por arquivo e configuração por URL. Se mais de um método for configurado simultaneamente, a ordem de prioridade será: configuração de propriedades JDBC > configuração por arquivo > configuração por URL.
Na configuração por URL, separe múltiplos parâmetros com
&.Em todas as configurações e métodos de conexão abaixo, a
MEKé processada localmente no cliente e enviada com segurança ao servidor usando criptografia de envelope para evitar vazamento daMEK.
Escolha conectar-se ao banco de dados usando uma chave local ou uma chave KMS com base no Encryption method definido na configuração de criptografia de coluna do banco de dados.
Conectar ao banco de dados usando uma chave KMS
Se usar credenciais temporárias STS para recuperar uma MEK gerenciada pelo KMS, use o SDK STS para obter o token de credencial temporária STS. Para exemplos do SDK STS, consulte Visão geral do SDK STS.
Não codifique as credenciais de acesso (AccessKey ID e AccessKey secret) diretamente no código da aplicação. Este exemplo usa variáveis de ambiente do sistema para gerenciar as credenciais de acesso. Para mais detalhes, consulte Configurar variáveis de ambiente no Linux, macOS e Windows.
Configuração de propriedades JDBC
O JDBC padrão permite definir propriedades personalizadas usando Properties durante a conexão. O exemplo a seguir mostra como configurar as propriedades JDBC e executar o JDBC:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Retrieve access credentials (AccessKey ID and AccessKey secret) from environment variables.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// If using STS temporary credentials to read the KMS key, also provide the obtained STS token.
// String stsToken = "yourSecurityToken";
// KMS instance endpoint. Use the public endpoint if public network access is enabled. Use the VPC endpoint for VPC access.
String kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_ID", accessKeyId);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET", accessKeySecret);
props.setProperty("ALIBABA_CLOUD_KMS_ENDPOINT", kmsEndpoint);
// props.setProperty("ALIBABA_CLOUD_STS_TOKEN", "stsToken");
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Load the EncJDBC driver for MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Execute queries ...
Configuração por URL
Incorpore parâmetros para recuperar a chave KMS diretamente na URL, conforme mostrado abaixo:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Retrieve access credentials (AccessKey ID and AccessKey secret) from environment variables.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// If using STS temporary credentials to read the KMS key, also provide the obtained STS token.
// String stsToken = "yourSecurityToken";
// KMS instance endpoint. Use the public endpoint if public network access is enabled. Use the VPC endpoint for VPC access.
String kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";
// Connection URL format for MySQL.
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s", hostname, port, dbname, accessKeyId, accessKeySecret, kmsEndpoint);
// With STS token.
// String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s&ALIBABA_CLOUD_STS_TOKEN=%s", hostname, port, dbname, accessKeyId, accessKeySecret, kmsEndpoint, stsToken);
// Load the EncJDBC driver for MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Execute queries ...
Conectar ao banco de dados usando uma chave local
Configuração de propriedades JDBC
O JDBC padrão permite definir propriedades personalizadas usando Properties durante a conexão. O exemplo a seguir mostra como configurar as propriedades JDBC e executar o JDBC:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Master encryption key.
String mek = "00112233445566778899aabbccddeeff";
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s". For PostgreSQL, use "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Load the EncJDBC driver for MySQL. For PostgreSQL, use "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Execute queries ...
Configuração por arquivo
Importe parâmetros como a MEK necessária por meio de um arquivo de configuração.
A configuração por arquivo aplica-se apenas a MEKs de chave local.
Defina uma property chamada encJdbcConfigFile no projeto e defina seu valor como o caminho do arquivo de configuração (por padrão, o arquivo encjdbc.conf é utilizado). O conteúdo do arquivo de configuração é o seguinte:
MEK=00112233445566778899aabbccddeeff
Coloque o arquivo de configuração em um destes dois locais:
-
Insira o arquivo no diretório resources do projeto, conforme mostrado abaixo:
src main java resources encjdbc.conf Insira o arquivo no diretório raiz do projeto (o diretório de tempo de execução do programa).
Após configurar o arquivo, nenhuma configuração adicional é necessária no código, conforme mostrado abaixo:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s". For PostgreSQL, use "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Load the EncJDBC driver for MySQL. For PostgreSQL, use "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Execute queries ...
Configuração por URL
Incorpore parâmetros como a MEK diretamente na URL, conforme mostrado abaixo:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Master encryption key.
String mek = "00112233445566778899aabbccddeeff";
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s?MEK=%s". For PostgreSQL, use "jdbc:postgresql:encdb://%s:%s/%s?MEK=%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s", hostname, port, dbname, mek);
// Load the EncJDBC driver for MySQL. For PostgreSQL, use "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Execute queries ...
3. Consultar dados em texto simples de colunas criptografadas
Após conectar-se com sucesso ao banco de dados, opere-o exatamente como em uma consulta JDBC padrão. O EncJDBC descriptografa automaticamente as colunas criptografadas e retorna os dados em texto simples.
Código de exemplo:
// Execute the query.
// Create a query statement.
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name");
// Traverse the result set.
while (resultSet.next()) {
for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
System.out.print(rs.getString(i + 1));
System.out.print("\t");
}
System.out.print("\n");
}