package com.ulisesbocchio.jasyptspringboot.encryptor; import com.ulisesbocchio.jasyptspringboot.util.Singleton; import lombok.extern.slf4j.Slf4j; import org.jasypt.encryption.StringEncryptor; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; import org.springframework.core.env.Environment; /** * @author Ulises Bocchio */ @Slf4j public class DefaultLazyEncryptor implements StringEncryptor { private final Singleton<StringEncryptor> singleton; public DefaultLazyEncryptor(Environment e) { singleton = new Singleton<>(() -> { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(getRequiredProperty(e, "jasypt.encryptor.password")); config.setAlgorithm(getProperty(e, "jasypt.encryptor.algorithm", "PBEWithMD5AndDES")); config.setKeyObtentionIterations(getProperty(e, "jasypt.encryptor.keyObtentionIterations", "1000")); config.setPoolSize(getProperty(e, "jasypt.encryptor.poolSize", "1")); config.setProviderName(getProperty(e, "jasypt.encryptor.providerName", null)); config.setSaltGeneratorClassName(getProperty(e, "jasypt.encryptor.saltGeneratorClassname", "org.jasypt.salt.RandomSaltGenerator")); config.setStringOutputType(getProperty(e, "jasypt.encryptor.stringOutputType", "base64")); encryptor.setConfig(config); return encryptor; }); } private static String getProperty(Environment environment, String key, String defaultValue) { if (!propertyExists(environment, key)) { log.info("Encryptor config not found for property {}, using default value: {}", key, defaultValue); } return environment.getProperty(key, defaultValue); } private static boolean propertyExists(Environment environment, String key) { return environment.getProperty(key) != null; } private static String getRequiredProperty(Environment environment, String key) { if (!propertyExists(environment, key)) { throw new IllegalStateException(String.format("Required Encryption configuration property missing: %s", key)); } return environment.getProperty(key); } @Override public String encrypt(String message) { return singleton.get().encrypt(message); } @Override public String decrypt(String encryptedMessage) { return singleton.get().decrypt(encryptedMessage); } }