Couchbase フィールドレベル暗号化

Couchbase はフィールドレベルの暗号化 (英語) をサポートします。このセクションでは、Spring Data Couchbase での使用方法について説明します。

要件

  • Spring Data Couchbase 5.0.0-RC1 以上。

概要

com.couchbase.client.java.encryption.annotation.Encrypted (@Encrypted) のアノテーションが付けられたフィールドは、書き込み時に自動的に暗号化され、読み取り時に復号化されます。@Encrypted(migration = Encrypted.Migration.FROM_UNENCRYPTED) を指定すると、暗号化されていないフィールドを暗号化されたフィールドに移行できます。

はじめにと設定

依存関係

フィールドレベル暗号化は依存関係で利用可能です ( フィールドレベルの暗号化 (英語) を参照してください)

    <groupId>com.couchbase.client</groupId>
    <artifactId>couchbase-encryption</artifactId>

HashiCorp Vault 交通機関の統合には Spring Vault が必要です

    <groupId>org.springframework.vault</groupId>
    <artifactId>spring-vault-core</artifactId>

CryptoManager の提供

CryptoManager は、AbstractCouchbaseConfiguration の cryptoManager() メソッドをオーバーライドして提供する必要があります。この CryptoManager は、Spring Data Couchbase によって使用され、CouchbaseClientFactory から行われる Couchbase Java SDK 直接呼び出しによっても使用されます。

@Override
protected CryptoManager cryptoManager() {
  KeyStore javaKeyStore = KeyStore.getInstance("MyKeyStoreType");
  FileInputStream fis = new java.io.FileInputStream("keyStoreName");
  char[] password = { 'a', 'b', 'c' };
  javaKeyStore.load(fis, password);
  Keyring keyring = new KeyStoreKeyring(javaKeyStore, keyName -> "swordfish");

  // AES-256 authenticated with HMAC SHA-512. Requires a 64-byte key.
  AeadAes256CbcHmacSha512Provider provider = AeadAes256CbcHmacSha512Provider.builder().keyring(keyring).build();

  CryptoManager cryptoManager = DefaultCryptoManager.builder().decrypter(provider.decrypter())
    .defaultEncrypter(provider.encrypterForKey("myKey")).build();
  return cryptoManager;
}

フィールドを暗号化済みとして定義します。

  1. @Encrypted は、フィールドを暗号化されたものとして定義します。

  2. @Encrypted(migration = Encrypted.Migration.FROM_UNENCRYPTED) は、読み取り時に暗号化される場合とされない場合があるフィールドを定義します。書き込み時に暗号化されます。

  3. @Encrypted(encrypter="<encrypterAlias>") は、暗号化に使用する暗号化ツールのエイリアスを指定します。これはアルゴリズムではなく、CryptoManager に暗号化機能を追加するときに指定した名前であることに注意してください。

サンプル

例 1: AbstractCouchbaseConfiguration
@Configuration
@EnableCouchbaseRepositories("<parent-dir-of-repository-interfaces>")
@EnableReactiveCouchbaseRepositories("<parent-dir-of-repository-interfaces>")
static class Config extends AbstractCouchbaseConfiguration {

  // Usual Setup
  @Override public String getConnectionString() { /* ... */ }
  @Override public String getUserName() { /* ... */ }
  @Override public String getPassword() { /* ... */ }
  @Override public String getBucketName() { /* ... */ }

  /* provide a cryptoManager */
  @Override
  protected CryptoManager cryptoManager() {
    KeyStore javaKeyStore = KeyStore.getInstance("MyKeyStoreType");
    FileInputStream fis = new java.io.FileInputStream("keyStoreName");
    char[] password = { 'a', 'b', 'c' };
    javaKeyStore.load(fis, password);
    Keyring keyring = new KeyStoreKeyring(javaKeyStore, keyName -> "swordfish");

    // AES-256 authenticated with HMAC SHA-512. Requires a 64-byte key.
    AeadAes256CbcHmacSha512Provider provider = AeadAes256CbcHmacSha512Provider.builder().keyring(keyring).build();

    CryptoManager cryptoManager = DefaultCryptoManager.builder().decrypter(provider.decrypter())
      .defaultEncrypter(provider.encrypterForKey("myKey")).build();
    return cryptoManager;
  }

}
例 2: ドキュメント内のアノテーション
@Document
public class AddressWithEncStreet extends Address {

    private @Encrypted String encStreet;
    .
    .
例 3: コードでの使用箇所
AddressWithEncStreet address = new AddressWithEncStreet(); // plaintext address with encrypted street
address.setCity("Santa Clara");
address.setEncStreet("Olcott Street");
addressEncryptedRepository.save(address);
例 4: 結果として得られるドキュメント
{
  "_class": "AddressWithEncStreet",
   "city": "Santa Clara",
   "encrypted$encStreet": {
     "alg": "AEAD_AES_256_CBC_HMAC_SHA512",
     "ciphertext": "A/tJALmtixTxqj77ZUcUgMklIt3372DKD7l5FvbCzHNJMplbgQEv0RgSbxIfiRNr+uW2H7cokkcCW/F5YnQoXA==",
     "kid": "myKey"
   }
}