Utilisez le pilote de chiffrement de colonne Alibaba Cloud (JDBC) pour accéder aux données chiffrées de votre base de données depuis une application Java. Ce pilote utilise une clé de chiffrement principale (MEK) valide pour déchiffrer automatiquement et de manière transparente les textes chiffrés en texte clair.
Prérequis
-
Activez le chiffrement de colonne. Pour plus d'informations, consultez la rubrique Chiffrement de colonne.
RemarqueUne fois le chiffrement de colonne activé, l'extension rds_encdb est installée par défaut dans la base de données cible. Exécutez l'instruction SQL suivante pour vérifier l'état de l'extension rds_encdb :
SELECT EXISTS (SELECT * FROM pg_extension WHERE extname = 'rds_encdb'); Récupérez les informations de connexion à la base de données chiffrée, notamment le nom d'hôte, le port, le nom de la base de données, le nom d'utilisateur et le mot de passe. Pour savoir comment obtenir le point de terminaison interne ou public d'une instance, consultez la rubrique Afficher et modifier les points de terminaison et les numéros de port.
L'utilisateur de la base de données doit disposer de l'autorisation ciphertext permission (JDBC decryption) pour le chiffrement de colonne. Pour plus d'informations, consultez la rubrique Chiffrement de colonne.
Remarques sur l'utilisation
Stockez la
MEKde manière sécurisée.Utilisez JDK 1.8 ou une version ultérieure.
Procédure
Cette rubrique utilise un projet Java basé sur Maven comme exemple.
Étape 1 : Configurer la dépendance Maven
Ajoutez la dépendance suivante au fichier pom.xml de votre projet Maven.
<dependencies>
...
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-cls-jdbc</artifactId>
<version>1.0.10-1</version>
</dependency>
...
</dependencies>
Étape 2 : Configurer l'URL et la MEK
Avant d'accéder aux données chiffrées avec JDBC, configurez des paramètres tels que la MEK et l'URL.
Paramètre | Exemple | Description |
MEK | 00112233445566778899aabbccddeeff | Clé de chiffrement principale définie par l'utilisateur.
Avertissement Pour des raisons de sécurité, la base de données ne stocke, ne gère, ne génère ni ne sauvegarde votre MEK. Vous êtes responsable de la génération et de la sauvegarde des clés. La perte de la MEK entraîne la perte permanente de l'accès à vos données chiffrées. |
URL | jdbc:postgresql:encdb://%s:%s/%s | Pour utiliser le pilote de chiffrement de colonne, modifiez le préfixe de l'URL en |
Configurer la MEK
Vous pouvez configurer la MEK de trois manières. Si vous configurez plusieurs méthodes dans votre connexion JDBC, la priorité est la suivante : configuration des propriétés JDBC > configuration par fichier > configuration par URL.
Dans la méthode de configuration par URL, concaténez plusieurs paramètres à l'aide du caractère esperluette (
&).Dans les trois méthodes de connexion, la
MEKest traitée localement sur le client et distribuée en toute sécurité au serveur à l'aide du chiffrement sous enveloppe, ce qui empêche son exposition.
Propriétés JDBC
JDBC standard vous permet de configurer des attributs personnalisés dans un objet Properties lors de l'établissement d'une connexion. Par exemple :
// 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 ...
Fichier
Importez des paramètres tels que la MEK à partir d'un fichier de configuration. Pour ce faire, définissez la propriété encJdbcConfigFile sur le chemin d'accès au fichier. Si cette propriété n'est pas définie, le pilote utilise par défaut le fichier encjdbc.conf.
Le fichier de configuration contient les éléments suivants :
MEK=****
Placez le fichier de configuration à l'un des deux emplacements suivants :
Placez le fichier
encjdbc.confdans le répertoire resources de votre projet.Placez le fichier dans le répertoire racine du projet, qui correspond au répertoire d'exécution de l'application.
Une fois la MEK configurée dans un fichier, aucun code supplémentaire n'est nécessaire. Par exemple :
// 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
Intégrez des paramètres tels que la MEK et ENC_ALGO dans l'URL. Par exemple :
// 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 ...
Exemple de code
Le code suivant présente un exemple complet de configuration de la MEK à l'aide de la configuration des propriétés JDBC. Avant d'exécuter ce code, assurez-vous que le chiffrement de colonne est configuré dans la base de données cible.
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.
}
}