El controlador de cifrado de columnas basado en JDBC permite que las aplicaciones Java lean columnas cifradas en ApsaraDB RDS for PostgreSQL sin modificar la lógica de las consultas. Cuando se configura una clave maestra de cifrado (MEK) válida y la cuenta tiene el permiso de texto cifrado necesario, el controlador descifra automáticamente el texto cifrado y devuelve el texto sin formato.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
-
column encryption habilitado en su instancia de RDS
Tras habilitar el cifrado de columnas, el sistema instala automáticamente la extensión
rds_encdb. Ejecute la siguiente sentencia SQL para confirmar que la extensión está activa: ``sql SELECT EXISTS (SELECT * FROM pg_extension WHERE extname = 'rds_encdb');`` Los detalles de conexión de su instancia de RDS: endpoint, puerto, nombre de la base de datos, nombre de usuario y contraseña. Consulte Visualización y modificación de endpoints y números de puerto
El ciphertext permission (JDBC decryption) otorgado a la cuenta que usa para conectarse
JDK 1.8 o posterior
Almacene su MEK de forma segura y manténgala confidencial. La instancia de RDS no genera, almacena, gestiona ni respalda su MEK. Si pierde la MEK, no podrá recuperar los datos cifrados existentes.
Funcionamiento
El controlador intercepta las llamadas JDBC y realiza el descifrado en el lado del cliente mediante su MEK. La MEK se distribuye al servidor mediante cifrado de sobre para garantizar que no se filtre.
Paso 1: Agregar la dependencia de Maven
Agregue la siguiente dependencia al archivo pom.xml de su proyecto Maven:
<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-cls-jdbc</artifactId>
<version>1.0.10-1</version>
</dependency>
</dependencies>
Paso 2: Configurar la URL de conexión y la MEK
El controlador requiere dos configuraciones:
|
Configuración |
Formato/ejemplo |
Descripción |
|
URL |
|
La URL debe comenzar con |
|
MEK |
|
Cadena hexadecimal de 32 caracteres (16 bytes). Genérela con una herramienta como |
Métodos de configuración de la MEK
Existen tres métodos disponibles. Cuando se usa más de uno, el controlador los aplica en el siguiente orden de prioridad:
Configuración mediante propiedades JDBC (mayor prioridad)
Configuración mediante archivo
Configuración mediante URL (menor prioridad)
Configuración mediante propiedades JDBC (recomendado)
Pase la MEK como propiedad JDBC al crear la conexión:
String mek = "<your-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);
Configuración mediante archivo
Almacene la MEK en un archivo de configuración y refiriérala mediante la propiedad encJdbcConfigFile. Si no establece esta propiedad, el controlador busca encjdbc.conf de forma predeterminada.
Contenido del archivo de configuración:
MEK=<your-mek>
Coloque el archivo en cualquiera de las siguientes ubicaciones:
El directorio
resourcesde su proyectoEl directorio raíz que usa la aplicación en tiempo de ejecución
Una vez colocado el archivo, no se requieren cambios adicionales en el código:
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s", hostname, port, dbname);
Connection connection = DriverManager.getConnection(dbUrl, username, password);
Configuración mediante URL
Anexe la MEK directamente a la URL de conexión. Use & para concatenar varios parámetros:
String mek = "<your-mek>";
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s?MEK=%s", hostname, port, dbname, mek);
Connection connection = DriverManager.getConnection(dbUrl, username, password);
Paso 3: Consultar datos cifrados
En el siguiente ejemplo se usa la configuración mediante propiedades JDBC para establecer la MEK.
Consulta de columnas cifradas
// Replace the placeholder values with your actual connection details.
String hostname = "pgm-****.pg.rds.aliyuncs.com";
String port = "5432";
String dbname = "testdb";
String username = "user"; // Must have the ciphertext permission (JDBC decryption).
String password = "password";
String mek = "<your-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);
// Run a query. Encrypted columns are decrypted automatically.
ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM test_table");
while (rs.next()) {
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { // Column index starts from 1.
System.out.print(rs.getString(i) + "\t");
}
System.out.println();
}
rs.close();
connection.close();
Problemas comunes
Se perdió la MEK. No es posible recuperar los datos cifrados sin la MEK. Respalde la MEK antes de cifrar cualquier dato.
La URL de conexión no comienza con jdbc:postgresql:encdb://. El controlador solo intercepta conexiones que usan el prefijo de URL encdb. Debe especificar una URL que comience con jdbc:postgresql:encdb://.
La cuenta no tiene el permiso de texto cifrado (descifrado JDBC). Las consultas a columnas cifradas devuelven un error. Otorgue el permiso como se describe en Use the column encryption feature.
Pasos siguientes
Column encryption: habilite el cifrado de columnas y gestione las columnas cifradas en su instancia de RDS