Use o driver de criptografia de colunas da Alibaba Cloud (JDBC) para acessar dados criptografados no banco de dados a partir de uma aplicação Java. O driver utiliza uma chave mestra de criptografia (MEK) válida para descriptografar automaticamente o texto cifrado em texto simples, de forma transparente.
Pré-requisitos
-
A criptografia de colunas deve estar ativada. Para mais informações, consulte Criptografia de colunas.
NotaAo ativar a criptografia de colunas, a extensão rds_encdb é instalada por padrão no banco de dados de destino. Execute a seguinte instrução SQL para verificar o status da extensão rds_encdb:
SELECT EXISTS (SELECT * FROM pg_extension WHERE extname = 'rds_encdb'); Tenha as informações de conexão do banco de dados criptografado, incluindo hostname, porta, nome do banco de dados, nome de usuário e senha. Para saber como obter o endpoint interno ou público de uma instância, consulte Visualizar e alterar os endpoints e números de porta.
O usuário do banco de dados precisa ter a ciphertext permission (JDBC decryption) para criptografia de colunas. Para mais detalhes, consulte Criptografia de colunas.
Notas de uso
Armazene a
MEKcom segurança.Use o JDK 1.8 ou versão superior.
Procedimento
Este tópico usa um projeto Java baseado em Maven como exemplo.
Etapa 1: Configure a dependência do Maven
Adicione a seguinte dependência ao arquivo pom.xml do seu projeto Maven.
<dependencies>
...
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-cls-jdbc</artifactId>
<version>1.0.10-1</version>
</dependency>
...
</dependencies>
Etapa 2: Configure URL e MEK
Antes de acessar dados criptografados via JDBC, configure parâmetros como a MEK e a URL.
|
Parâmetro |
Exemplo |
Descrição |
|
MEK |
00112233445566778899aabbccddeeff |
Chave mestra de criptografia definida pelo usuário.
Aviso
Por questões de segurança, o banco de dados não armazena, gerencia, gera nem faz backup da sua MEK. Você é responsável pela geração e pelo backup da chave. A perda da MEK resulta na perda permanente do acesso aos seus dados criptografados. |
|
URL |
jdbc:postgresql:encdb://%s:%s/%s |
Para usar o driver de criptografia de colunas, altere o prefixo da URL para |
Configure a MEK
É possível configurar a MEK de três formas. Se você configurar mais de um método na conexão JDBC, a prioridade será: Configuração via JDBC Properties > Configuração via Arquivo > Configuração via URL.
No método de configuração via URL, concatene vários parâmetros usando o caractere "e" comercial (
&).Em todos os três métodos de conexão, a
MEKé processada localmente no cliente e distribuída com segurança ao servidor por meio de criptografia de envelope, o que evita sua exposição.
JDBC properties
O JDBC padrão permite configurar atributos personalizados em um objeto Properties ao estabelecer uma conexão. Exemplo:
// Prepare connection information, such as hostname, port, dbname, username, and password.
// ...
String mek="****";
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s", hostname, port, dbname);
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Initiate a query ...
File
Importe parâmetros como a MEK de um arquivo de configuração. Para isso, defina a propriedade encJdbcConfigFile com o caminho do arquivo. Caso essa propriedade não seja definida, o driver usará o arquivo encjdbc.conf por padrão.
O arquivo de configuração contém o seguinte:
MEK=****
Salve o arquivo de configuração em um dos dois locais abaixo:
Salve o arquivo
encjdbc.confno diretório resources do seu projeto.Salve o arquivo no diretório raiz do projeto, que corresponde ao diretório de execução da aplicação.
Após configurar a MEK em um arquivo, nenhum código adicional é necessário. Exemplo:
// Prepare connection information, such as hostname, port, dbname, username, and password.
// ...
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s", hostname, port, dbname);
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Initiate a query ...
URL
Incorpore parâmetros como MEK e ENC_ALGO diretamente na URL. Exemplo:
// Prepare connection information, such as hostname, port, dbname, username, and password.
// ...
String mek="****";
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s?MEK=%s", hostname, port, dbname, mek);
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Initiate a query ...
Exemplo de código
O código a seguir apresenta um exemplo completo de configuração da MEK usando JDBC Properties. Antes de executar este código, certifique-se de que a criptografia de colunas esteja configurada no banco de dados de destino.
package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class Main {
public static void main(String[] args) throws SQLException {
// Update the following connection information (hostname, port, dbname, username, password) based on your actual environment.
String hostname = "pgm-****.pg.rds.aliyuncs.com"; // The instance endpoint. Replace with your actual value.
String port = "5432"; // The database port. Replace with your actual value.
String dbname = "testdb"; // The database name. Replace with your actual value.
String username = "user"; // The database username. Use a user that has the ciphertext permission (JDBC decryption).
String password = "password"; // The password for the database user.
// This is a sample key. We recommend using a stronger key to improve security.
String MEK = "00112233445566778899aabbccddeeff";
// Create database connection properties.
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", MEK);
// Format the database connection URL.
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s", hostname, port, dbname);
// Get the database connection using DriverManager.
Connection connection = DriverManager.getConnection(dbUrl, props);
// Execute a query to retrieve data from the test table.
ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM test_table");
while (rs.next()) {
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { // Column indexes start from 1.
System.out.print(rs.getString(i) + "\t");
}
System.out.println(); // New line.
}
// Close resources.
rs.close(); // Close the result set.
connection.close(); // Close the connection.
}
}