Biblioteca de complementos de cifrado para el SDK de Java para Azure Cosmos DB para Java
El complemento azure Cosmos Encryption se usa para cifrar datos con una clave proporcionada por el usuario antes de guardarlos en Cosmos DB y descifrarlos al volver a leer de la base de datos.
Código | fuentePaquete (Maven) | Documentación | de referencia de API | Documentación del productoMuestras
Introducción
Inclusión del paquete
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-cosmos-encryption</artifactId>
<version>2.6.0</version>
</dependency>
Consulte maven central para obtener versiones anteriores.
Consulte javadocs para más información sobre el paquete.
Requisitos previos
- Kit de desarrollo de Java (JDK) con la versión 8 o posterior
- Una cuenta de Azure activa. Si no tiene una, puede registrarse para obtener una cuenta gratuita. Como alternativa, puede usar el Emulador de Azure Cosmos DB para el desarrollo y las pruebas. Como el certificado HTTPS del emulador está autofirmado, debe importar su certificado en el almacén de certificados de confianza de Java, como se explica aquí.
- (Opcional) SLF4J es una fachada de registro.
- (Opcional) El enlace SLF4J se utiliza para asociar una plataforma de registro específica a SLF4J.
- (Opcional) Maven
SLF4J solo es necesario si planea utilizar el registro; descargue también un enlace SLF4J que vinculará SLF4J API con la implementación de registro de su elección. Consulte el manual del usuario de SLF4J para más información.
El SDK proporciona API asincrónicas basadas en Reactor Core. Puede obtener más información sobre los tipos Reactor Core y Flux/Mono aquí.
Conceptos clave
El complemento azure Cosmos Encryption se usa para cifrar datos con una clave proporcionada por el usuario antes de guardarlos en Cosmos DB y descifrarlos al volver a leer de la base de datos. Debajo se usa el SDK de Java de Azure Cosmos DB, que proporciona representación lógica del lado cliente para acceder a la API de SQL de Azure Cosmos DB. Una cuenta de Cosmos DB contiene cero o más bases de datos, una base de datos (DB) contiene cero o más contenedores y un contenedor contiene cero o más elementos. Puede leer más sobre bases de datos, contenedores y elementos aquí. Algunas propiedades importantes se definen en el nivel del contenedor, entre ellas, el rendimiento aprovisionado y la clave de partición.
Ejemplos
En la sección siguiente se proporcionan varios fragmentos de código que abarcan algunas de las tareas más comunes de Cosmos Encryption API, entre las que se incluyen:
- Creación de un cliente de cifrado de Cosmos
- Creación de una base de datos de cifrado de Cosmos
- Creación de un contenedor de cifrado
- Operación CRUD en elementos
Creación de un cliente de cifrado de Cosmos
// Create a new CosmosEncryptionAsyncClient
CosmosAsyncClient cosmosAsyncClient = new CosmosClientBuilder()
.endpoint("<YOUR ENDPOINT HERE>")
.key("<YOUR KEY HERE>")
.buildAsyncClient();
KeyEncryptionKeyClientBuilder keyEncryptionKeyClientBuilder = new KeyEncryptionKeyClientBuilder().credential(tokenCredentials);
CosmosEncryptionAsyncClient cosmosEncryptionAsyncClient =
new CosmosEncryptionClientBuilder().cosmosAsyncClient(cosmosAsyncClient).keyEncryptionKeyResolver(
keyEncryptionKeyClientBuilder).keyEncryptionKeyResolverName(CosmosEncryptionClientBuilder.KEY_RESOLVER_NAME_AZURE_KEY_VAULT).buildAsyncClient();
Creación de una base de datos de cifrado de Cosmos
En primer lugar, debe crear una base de datos y usar el cliente de cifrado de Cosmos creado en el ejemplo anterior, puede crear un objeto proxy de base de datos de cifrado cosmos como este:
// This will create a database with the regular cosmosAsyncClient.
CosmosEncryptionAsyncDatabase cosmosEncryptionAsyncDatabase = cosmosEncryptionAsyncClient.getCosmosAsyncClient()
.createDatabaseIfNotExists("<YOUR DATABASE NAME>")
// TIP: Our APIs are Reactor Core based, so try to chain your calls
.map(databaseResponse ->
// Get a reference to the encryption database
// This will create a cosmos encryption database proxy object.
cosmosEncryptionAsyncClient.getCosmosEncryptionAsyncDatabase(databaseResponse.getProperties().getId()))
.block(); // Blocking for demo purposes (avoid doing this in production unless you must)
Creación de un contenedor de cifrado de Cosmos
En primer lugar, debe crear un contenedor con ClientEncryptionPolicy y usar el objeto de base de datos de cifrado de cosmos creado en el ejemplo anterior, puede crear un objeto proxy de contenedor de cifrado de cosmos como este:
//Create Client Encryption Key
EncryptionKeyWrapMetadata metadata = new EncryptionKeyWrapMetadata(this.cosmosEncryptionAsyncClient.getKeyEncryptionKeyResolverName(), "key", "tempmetadata", EncryptionAlgorithm.RSA_OAEP.toString());
CosmosEncryptionAsyncContainer cosmosEncryptionAsyncContainer = cosmosEncryptionAsyncDatabase
.createClientEncryptionKey("key", CosmosEncryptionAlgorithm.AEAD_AES_256_CBC_HMAC_SHA256.getName(), metadata)
// TIP: Our APIs are Reactor Core based, so try to chain your calls
.then(Mono.defer(() -> {
//Create Encryption Container
ClientEncryptionIncludedPath includedPath = new ClientEncryptionIncludedPath();
includedPath.setClientEncryptionKeyId("key");
includedPath.setPath("/sensitiveString");
includedPath.setEncryptionType(CosmosEncryptionType.DETERMINISTIC.toString());
includedPath.setEncryptionAlgorithm(CosmosEncryptionAlgorithm.AEAD_AES_256_CBC_HMAC_SHA256.getName());
List<ClientEncryptionIncludedPath> paths = new ArrayList<>();
paths.add(includedPath);
ClientEncryptionPolicy clientEncryptionPolicy = new ClientEncryptionPolicy(paths);
CosmosContainerProperties properties = new CosmosContainerProperties("<YOUR CONTAINER NAME>", "/mypk");
properties.setClientEncryptionPolicy(clientEncryptionPolicy);
return cosmosEncryptionAsyncDatabase.getCosmosAsyncDatabase().createContainer(properties);
}))
.map(containerResponse ->
// Create a reference to the encryption container
// This will create a cosmos encryption container proxy object.
cosmosEncryptionAsyncDatabase.getCosmosEncryptionAsyncContainer(containerResponse.getProperties().getId()))
.block(); // Blocking for demo purposes (avoid doing this in production unless you must)
Operación CRUD en elementos
// Create an item
Pojo pojo = new Pojo();
pojo.setSensitiveString("Sensitive Information need to be encrypted");
cosmosEncryptionAsyncContainer.createItem(pojo)
.flatMap(response -> {
System.out.println("Created item: " + response.getItem());
// Read that item 👓
return cosmosEncryptionAsyncContainer.readItem(response.getItem().getId(),
new PartitionKey(response.getItem().getId()),
Pojo.class);
})
.flatMap(response -> {
System.out.println("Read item: " + response.getItem());
// Replace that item 🔁
Pojo p = response.getItem();
pojo.setSensitiveString("New Sensitive Information");
return cosmosEncryptionAsyncContainer.replaceItem(p, response.getItem().getId(),
new PartitionKey(response.getItem().getId()));
})
// delete that item 💣
.flatMap(response -> cosmosEncryptionAsyncContainer.deleteItem(response.getItem().getId(),
new PartitionKey(response.getItem().getId())))
.subscribe();
Tenemos una aplicación de ejemplo de introducción disponible aquí.
Solución de problemas
General
Azure Cosmos DB es una base de datos distribuida rápida y flexible que se escala sin problemas con una latencia y un rendimiento garantizados. No es necesario realizar cambios de arquitectura importantes ni escribir código complejo para escalar la base de datos con Azure Cosmos DB. Escalar y reducir verticalmente es tan sencillo como realizar una única llamada API o una llamada al método SDK. Sin embargo, como el acceso a Azure Cosmos DB se realiza mediante llamadas de red, puede realizar optimizaciones en el lado cliente para conseguir un rendimiento máximo al usar la versión 4 del SDK de Java de Azure Cosmos DB.
La guía de rendimiento trata estas optimizaciones del lado cliente.
En la Guía de solución de problemas se tratan problemas comunes, soluciones alternativas, pasos de diagnóstico y herramientas al usar el SDK de Java v4 de Azure Cosmos DB con cuentas de SQL API de Azure Cosmos DB.
Habilitación del registro de cliente
El SDK de Azure Cosmos DB para Java v4 usa SLF4j como fachada de registro, que admite el registro en plataformas de registro populares como log4j y logback.
Por ejemplo, si quiere usar log4j como plataforma de registro, agregue las siguientes bibliotecas en la classpath de Java.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
Además, agregue una configuración log4j.
# this is a sample log4j configuration
# Set root logger level to INFO and its only appender to A1.
log4j.rootLogger=INFO, A1
log4j.category.com.azure.cosmos=INFO
#log4j.category.io.netty=OFF
#log4j.category.io.projectreactor=OFF
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %5X{pid} [%t] %-5p %c - %m%n
Pasos siguientes
- El programa de ejemplo de cifrado de Cosmos está aquí
- Inicio rápido del sdk de Java principal de Cosmos DB: Creación de una aplicación java para administrar datos de SQL API de Cosmos DB
- Más información sobre el servicio Azure Cosmos DB
Contribuciones
Este proyecto agradece las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Contrato de licencia para el colaborador (CLA) que declara que tiene el derecho a concedernos y nos concede los derechos para usar su contribución.
Cuando se envía una solicitud de incorporación de cambios, un bot de CLA determinará de forma automática si tiene que aportar un CLA y completar la PR adecuadamente (por ejemplo, la etiqueta, el comentario). Solo siga las instrucciones que le dará el bot. Solo será necesario que lo haga una vez en todos los repositorios con nuestro CLA.
Este proyecto ha adoptado el Código de conducta de Microsoft Open Source. Para más información, consulte las preguntas más frecuentes del código de conducta o póngase en contacto con opencode@microsoft.com si tiene cualquier otra pregunta o comentario.