Use o driver de criptografia de coluna da Alibaba Cloud (JDBC) para acessar dados criptografados no seu banco de dados a partir de uma aplicação Java. O driver utiliza uma chave mestra de criptografia (MEK) válida para descriptografar o texto cifrado em texto simples de forma automática e transparente.
Pré-requisitos
-
A criptografia de coluna deve estar ativada. Para mais informações, consulte column encryption.
NotaApós ativar a criptografia de coluna, 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'); Você precisa ter 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 View and change the endpoints and port numbers.
O usuário do banco de dados deve ter a ciphertext permission (JDBC decryption) para criptografia de coluna. Para mais informações, consulte column encryption.
Observações de uso
Armazene a
MEKcom segurança.Use o JDK 1.8 ou uma versão posterior.
Procedimento
Este tópico usa um projeto Java baseado em Maven como exemplo.
Etapa 1: Configurar 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: Configurar a URL e a MEK
Antes de acessar dados criptografados com JDBC, configure parâmetros como a MEK e a URL.
Parâmetro | Exemplo | Descrição |
MEK | 00112233445566778899aabbccddeeff | Uma 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 coluna, altere o prefixo da URL para |
Configurar a MEK
Existem três formas de configurar a MEK. Se você configurar mais de um método na sua conexão JDBC, a prioridade será a seguinte: configuração de JDBC Properties > configuração de arquivo > configuração de URL.
No método de configuração por URL, concatene vários parâmetros usando o caractere "e" comercial (
&).Nos três métodos de conexão, o cliente processa a
MEKlocalmente e a distribui com segurança para o servidor usando criptografia de envelope, o que impede a sua exposição.
JDBC properties
O JDBC padrão permite configurar atributos personalizados em um objeto Properties ao estabelecer uma conexão. Por 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 ...
Arquivo
Importe parâmetros como a MEK a partir de um arquivo de configuração. Para isso, defina a propriedade encJdbcConfigFile com o caminho do arquivo. Se essa propriedade não estiver definida, o driver usará o arquivo encjdbc.conf por padrão.
O arquivo de configuração contém o seguinte:
MEK=****
Coloque o arquivo de configuração em um dos dois locais a seguir:
Coloque o arquivo
encjdbc.confno diretório resources do seu projeto.Coloque o arquivo no diretório raiz do projeto, que é o diretório de execução da aplicação.
Após configurar a MEK em um arquivo, não é necessário adicionar nenhum código extra. Por 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 na URL. Por 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 mostra um exemplo completo de configuração da MEK usando a configuração de JDBC Properties. Antes de executar este código, certifique-se de que a criptografia de coluna 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.
}
}