ulisesbocchio / jasypt-spring-boot

Jasypt integration for Spring boot
MIT License
2.88k stars 516 forks source link

Support kebab-case application properties for jasypt.encryptor.privateKey* #152

Closed membersound closed 5 years ago

membersound commented 5 years ago

It should be possible to provide the private-key properties as follows:

jasypt.encryptor.private-key-format=
jasypt.encryptor.private-key-location=

Instead only the following format is possible:

jasypt.encryptor.privateKeyFormat=
jasypt.encryptor.privateKeyLocation=

In fact, it would be best if the same relaxed-binding defaults would apply to jasypt config: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-relaxed-binding

But at least kebeb-case should be supported, as it is the preferred way defining properties (and kebab-case is also used by many IDEs like Intellij for autocompletion in application.properties)!

When trying the first approach, the following ex is thrown on startup when having an ENC(...) field in application.properties:

Caused by: java.lang.IllegalStateException: either 'jasypt.encryptor.password' or one of ['jasypt.encryptor.privateKeyString', 'jasypt.encryptor.privateKeyLocation'] must be provided for Password-based or Asymmetric encryption
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.lambda$null$5(DefaultLazyEncryptor.java:51)
    at java.base/java.util.Optional.orElseThrow(Optional.java:408)
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.lambda$createDefault$6(DefaultLazyEncryptor.java:51)
    at java.base/java.util.Optional.orElseGet(Optional.java:369)
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.createDefault(DefaultLazyEncryptor.java:47)
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.lambda$null$2(DefaultLazyEncryptor.java:35)
    at java.base/java.util.Optional.orElseGet(Optional.java:369)
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.lambda$new$3(DefaultLazyEncryptor.java:33)
    at com.ulisesbocchio.jasyptspringboot.util.Singleton.lambda$new$6(Singleton.java:42)
    at com.ulisesbocchio.jasyptspringboot.util.Singleton.get(Singleton.java:53)
    at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.decrypt(DefaultLazyEncryptor.java:111)
    at com.ulisesbocchio.jasyptspringboot.resolver.DefaultPropertyResolver.resolvePropertyValue(DefaultPropertyResolver.java:35)
    at com.ulisesbocchio.jasyptspringboot.resolver.DefaultLazyPropertyResolver.resolvePropertyValue(DefaultLazyPropertyResolver.java:38)
    at com.ulisesbocchio.jasyptspringboot.EncryptablePropertySource.getProperty(EncryptablePropertySource.java:20)
    at com.ulisesbocchio.jasyptspringboot.caching.CachingDelegateEncryptablePropertySource.lambda$getProperty$0(CachingDelegateEncryptablePropertySource.java:34)
    at org.springframework.cache.concurrent.ConcurrentMapCache.lambda$get$0(ConcurrentMapCache.java:146)
    ... 48 more
ulisesbocchio commented 5 years ago

I noticed that didn't work and I really don't know why... DefeaultLazyEncryptor#createAsymmetricDefault is retrieving the config using kebab if you take a look:

private StringEncryptor createAsymmetricDefault(Environment e) {
        SimpleAsymmetricConfig config = new SimpleAsymmetricConfig();
        config.setPrivateKey(getProperty(e, "jasypt.encryptor.private-key-string", null));
        config.setPrivateKeyLocation(getProperty(e, "jasypt.encryptor.private-key-location", null));
        config.setPrivateKeyFormat(AsymmetricCryptography.KeyFormat.valueOf(getProperty(e, "jasypt.encryptor.private-key-format", "DER")));
        return new SimpleAsymmetricStringEncryptor(config);
    }

I'll dig into it

ulisesbocchio commented 5 years ago

should be fixed next release. Checkout the tests: https://github.com/ulisesbocchio/jasypt-spring-boot-samples/tree/master/jasypt-spring-boot-demo-simple-asymmetric/src/test/java/demo