【问题标题】:Does spring-data-couchbase support Field Level Encryption with @EncryptField annotation?spring-data-couchbase 是否支持带有 @EncryptField 注释的字段级加密?
【发布时间】:2019-05-28 10:18:40
【问题描述】:

我正在尝试通过 CrudRepository 或 CouchbaseTemplate 在 couchbase 中保存/检索带有加密字段的文档

devguide of couchbase 中的示例开始,我在我的 spring 配置中添加了加密提供程序,如下所示

@Configuration
@EnableCouchbaseRepositories(basePackages = { "com.example.demo.db" })
public class MyCouchbaseConfig extends AbstractCouchbaseConfiguration {

    private static final Logger log = LoggerFactory.getLogger(MyCouchbaseConfig.class);

    @Override
    protected List<String> getBootstrapHosts() {
        return Arrays.asList("localhost", "127.0.0.1");
    }

    @Override
    protected String getBucketName() {
        return "TEST";
    }

    @Override
    protected String getUsername() {
        return "user";
    }

    @Override
    protected String getBucketPassword() {
        return "p4$$w0rd";
    }

    @Override
    public String typeKey() {
        return MappingCouchbaseConverter.TYPEKEY_SYNCGATEWAY_COMPATIBLE;
    }

    @Override
    protected CouchbaseEnvironment getEnvironment() {
        try {
            JceksKeyStoreProvider kp = new JceksKeyStoreProvider("secret");
            kp.publicKeyName("mypublickey");
            kp.storeKey("mypublickey", "!mysecretkey#9^5usdk39d&dlf)03sL".getBytes(Charset.forName("UTF-8")));
            kp.signingKeyName("HMACsecret");
            kp.storeKey("HMACsecret", "myauthpassword".getBytes(Charset.forName("UTF-8")));
            AES256CryptoProvider aes256CryptoProvider = new AES256CryptoProvider(kp);
            CryptoManager cryptoManager = new CryptoManager();
            cryptoManager.registerProvider("MyAESProvider", aes256CryptoProvider);
            return DefaultCouchbaseEnvironment.builder().cryptoManager(cryptoManager).build();
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
            return null;
        }
    }

这是要持久化的文档

@Document
public class Person {

    @Id
    public String id;

    @EncryptedField(provider = "MyAESProvider")
    public String password;

    //The rest will be transported and stored unencrypted
    public String firstName;
    public String lastName;
    public String userName;
    public int age;
}

这是存储库

public interface PersonRepository extends CrudRepository<Person, String> {

}

调用(自动连线)

personRepository.save(person);

couchbaseTemplate.insert(person);

将对象以清晰的形式存储

{
  "firstName": "John",
  "lastName": "Doe",
  "password": "password",
  "javaClass": "com.example.demo.db.Person",
  "userName": "jdoe",
  "age": 20
}

这段代码(来自示例,但使用我的 spring 配置)

Bucket bucket = couchConfig.couchbaseClient();
EntityDocument<Person> document = EntityDocument.create(person);
bucket.repository().upsert(document);
EntityDocument<Person> stored = bucket.repository().get(person.id, Person.class);
System.out.println("Password: " + stored.content().password);

存储这个对象

{
  "firstName": "John",
  "lastName": "Doe",
  "__crypt_password": {
    "sig": "h1QS9JacNxTBrep4TEkZj/N7EsV3zJQ6vXmYtzADdG8=",
    "ciphertext": "G3rAivta7NOnLP5Qb1nEfw==",
    "alg": "AES-256-HMAC-SHA256",
    "iv": "cGjOOgA4M+wg4WcM0pHAFw==",
    "kid": "mypublickey"
  },
  "userName": "jdoe",
  "age": 20
}

在我看来,Spring Data Couchbase 使用 Bucket 接口(忽略文档上的注释)而不是 Bucket.repository()(将 FLE 考虑在内)。

所以最后的问题是:“如何使用 spring Spring Data Couchbase RepositoryCouchbaseTemplate 来存储 @EncryptedField@Document 与 Couchbase 的 FLE 功能?”

【问题讨论】:

    标签: spring-data-couchbase


    【解决方案1】:

    我现在也有同样的问题,但不幸的是,我发现这是 SpringDataCouchbase 团队 Jira 板的未来改进。

    https://jira.spring.io/projects/DATACOUCH/issues/DATACOUCH-455?filter=allopenissuess.

    所以,暂时没有什么可做的。您找到比使用bucket.repository().upsert(document);@Domenico U. 更好的方法了吗?

    【讨论】:

    • 那个 Jira 是我的 :) .. 但是由于其他原因我们已经切换到 mongoDB..
    • :-).... @DomenicoU。实际上,我必须使用 Spring AOP 实现一个基本的加密功能,并创建我自己的注释来标记我想要加密的字段。它非常基本,但无需 couchbase SDK 所需的修改即可按预期工作。
    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    相关资源
    最近更新 更多