Integración de Jasypt para Spring boot 2.x y 3.0.0
Jasypt Spring Boot proporciona soporte de cifrado para fuentes de propiedades en aplicaciones Spring Boot.
Hay 3 formas de integrar jasypt-spring-boot
en su proyecto:
jasypt-spring-boot-starter
a su classpath si usa @SpringBootApplication
o @EnableAutoConfiguration
habilitará propiedades cifrables en todo el entorno Spring.jasypt-spring-boot
a su classpath y agregar @EnableEncryptableProperties
a su clase de configuración principal para habilitar propiedades cifrables en todo el entorno Springjasypt-spring-boot
a su classpath y declarar fuentes de propiedades cifrables individuales con @EncrytablePropertySource
Utilice uno de los siguientes 3 métodos (explicados brevemente arriba):
Simplemente agregue la dependencia jar de inicio a su proyecto si su aplicación Spring Boot usa @SpringBootApplication
o @EnableAutoConfiguration
y las propiedades cifrables se habilitarán en todo el entorno Spring (esto significa cualquier propiedad del sistema, propiedad del entorno, argumento de línea de comando, aplicación.properties, aplicación -*.properties, propiedades yaml y cualquier otra fuente de propiedades pueden contener propiedades cifradas):
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot-starter</ artifactId >
< version >3.0.5</ version >
</ dependency >
SI no utiliza las anotaciones de configuración automática @SpringBootApplication
o @EnableAutoConfiguration
, agregue esta dependencia a su proyecto:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
Y luego agregue @EnableEncryptableProperties
a su clase de configuración. Por ejemplo:
@ Configuration
@ EnableEncryptableProperties
public class MyApplication {
...
}
Y las propiedades cifrables se habilitarán en todo el entorno Spring (esto significa que cualquier propiedad del sistema, propiedad del entorno, argumento de línea de comando, application.properties, propiedades yaml y cualquier otra fuente de propiedad personalizada puede contener propiedades cifradas)
SI no utiliza las anotaciones de configuración automática @SpringBootApplication
o @EnableAutoConfiguration
y no desea habilitar propiedades cifrables en todo el entorno Spring, existe una tercera opción. Primero agregue la siguiente dependencia a su proyecto:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
Y luego agregue tantas anotaciones @EncryptablePropertySource
como desee en sus archivos de configuración. Tal como lo hace con la anotación @PropertySource
de Spring. Por ejemplo:
@ Configuration
@ EncryptablePropertySource ( name = "EncryptedProperties" , value = "classpath:encrypted.properties" )
public class MyApplication {
...
}
Convenientemente, también hay una anotación @EncryptablePropertySources
que se podría usar para agrupar anotaciones de tipo @EncryptablePropertySource
como esta:
@ Configuration
@ EncryptablePropertySources ({ @ EncryptablePropertySource ( "classpath:encrypted.properties" ),
@ EncryptablePropertySource ( "classpath:encrypted2.properties" )})
public class MyApplication {
...
}
Además, tenga en cuenta que a partir de la versión 1.8, @EncryptablePropertySource
admite archivos YAML.
A partir de la versión 1.7 1.15, existe un cuarto método para habilitar propiedades cifrables para algunos casos especiales. Se proporciona una clase ConfigurableEnvironment
personalizada: EncryptableEnvironment
StandardEncryptableEnvironment
y StandardEncryptableServletEnvironment
que se pueden usar con SpringApplicationBuilder
para definir el entorno personalizado de esta manera:
new SpringApplicationBuilder ()
. environment ( new StandardEncryptableEnvironment ())
. sources ( YourApplicationClass . class ). run ( args );
Este método solo requeriría el uso de una dependencia para jasypt-spring-boot
. No se requiere ninguna dependencia del frasco inicial. Este método es útil para el acceso temprano a propiedades cifradas en el arranque. Si bien no es necesario en la mayoría de los escenarios, podría resultar útil al personalizar el comportamiento de inicio de Spring Boot o al integrarlo con ciertas capacidades que se configuran muy temprano, como la configuración de registro. Para un ejemplo concreto, este método de habilitar propiedades cifrables es el único que funciona con el reemplazo de propiedades Spring en archivos logback-spring.xml
, usando la etiqueta springProperty
. Por ejemplo:
< springProperty name = " user " source = " db.user " />
< springProperty name = " password " source = " db.password " />
< appender name = " db " class = " ch.qos.logback.classic.db.DBAppender " >
< connectionSource
class = " ch.qos.logback.core.db.DriverManagerConnectionSource " >
< driverClass >org.postgresql.Driver</ driverClass >
< url >jdbc:postgresql://localhost:5432/simple</ url >
< user >${user}</ user >
< password >${password}</ password >
</ connectionSource >
</ appender >
Este mecanismo podría usarse, por ejemplo (como se muestra) para inicializar el Appender de registro de base de datos que requiere que se pasen credenciales confidenciales. Alternativamente, si es necesario proporcionar un StringEncryptor
personalizado, se proporciona un método de creación estático StandardEncryptableEnvironment#builder
para su personalización (son posibles otras personalizaciones):
StandardEncryptableEnvironment
. builder ()
. encryptor ( new MyEncryptor ())
. build ()
Esto activará la carga de alguna configuración que básicamente hace 2 cosas:
StringEncryptor
predeterminado que se puede configurar a través de propiedades normales, propiedades del sistema o argumentos de línea de comando. Al utilizar los MÉTODOS 1 y 2, puede definir propiedades cifradas en cualquiera de los PropertySource contenidos en el entorno. Por ejemplo, usando la anotación @PropertySource:
@ SpringBootApplication
@ EnableEncryptableProperties
@ PropertySource ( name = "EncryptedProperties" , value = "classpath:encrypted.properties" )
public class MyApplication {
...
}
Y su archivo encrypted.properties se vería así:
secret.property =ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)
Ahora, cuando haces environment.getProperty("secret.property")
o usas @Value("${secret.property}")
lo que obtienes es la versión descifrada de secret.property
.
Cuando usa el MÉTODO 3 ( @EncryptablePropertySource
), puede acceder a las propiedades cifradas de la misma manera, la única diferencia es que debe colocar las propiedades en el recurso que se declaró dentro de la anotación @EncryptablePropertySource
para que las propiedades se puedan descifrar correctamente.
Jasypt utiliza un StringEncryptor
para descifrar propiedades. Para los 3 métodos, si no se encuentra ningún StringEncryptor
personalizado (consulte la sección Custom Encryptor para obtener más detalles) en Spring Context, se crea uno automáticamente que se puede configurar a través de las siguientes propiedades (Sistema, archivo de propiedades, argumentos de línea de comando, variable de entorno, etc.):
Llave | Requerido | Valor predeterminado |
jasypt.encryptor.contraseña | Verdadero | - |
algoritmo.jasypt.encryptor. | FALSO | PBEWITHMACSHA512ANDAES_256 |
jasypt.encryptor.iteraciones-de-obtención-de-claves | FALSO | 1000 |
jasypt.encryptor.tamaño del grupo | FALSO | 1 |
jasypt.encryptor.nombre-proveedor | FALSO | SolJCE |
jasypt.encryptor.nombre-clase-proveedor | FALSO | nulo |
jasypt.encryptor.nombre-clase-generador-de-sal | FALSO | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-generador-nombre-clase | FALSO | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.tipo-salida-cadena | FALSO | base64 |
jasypt.encryptor.proxy-propiedad-fuentes | FALSO | FALSO |
jasypt.encryptor.skip-property-sources | FALSO | lista vacía |
La única propiedad requerida es la contraseña de cifrado; el resto se puede dejar usando valores predeterminados. Si bien todas estas propiedades pueden declararse en un archivo de propiedades, la contraseña del cifrador no debe almacenarse en un archivo de propiedades, sino que debe pasarse como propiedad del sistema, argumento de línea de comando o variable de entorno y, en la medida en que su nombre sea jasypt.encryptor.password
funcionará.
La última propiedad, jasypt.encryptor.proxyPropertySources
se utiliza para indicar jasyp-spring-boot
cómo se interceptarán los valores de propiedad para su descifrado. El valor predeterminado, false
utiliza implementaciones contenedoras personalizadas de PropertySource
, EnumerablePropertySource
y MapPropertySource
. Cuando se especifica true
para esta propiedad, el mecanismo de interceptación utilizará proxies CGLib en cada implementación PropertySource
específica. Esto puede resultar útil en algunos escenarios en los que se debe conservar el tipo de PropertySource
original.
Para una configuración personalizada del cifrador y la fuente de la contraseña del cifrador, siempre puede definir su propio bean StringEncryptor en su contexto Spring y se ignorará el cifrador predeterminado. Por ejemplo:
@ Bean ( "jasyptStringEncryptor" )
public StringEncryptor stringEncryptor () {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor ();
SimpleStringPBEConfig config = new SimpleStringPBEConfig ();
config . setPassword ( "password" );
config . setAlgorithm ( "PBEWITHHMACSHA512ANDAES_256" );
config . setKeyObtentionIterations ( "1000" );
config . setPoolSize ( "1" );
config . setProviderName ( "SunJCE" );
config . setSaltGeneratorClassName ( "org.jasypt.salt.RandomSaltGenerator" );
config . setIvGeneratorClassName ( "org.jasypt.iv.RandomIvGenerator" );
config . setStringOutputType ( "base64" );
encryptor . setConfig ( config );
return encryptor ;
}
Tenga en cuenta que el nombre del bean es obligatorio, ya que jasypt-spring-boot
detecta String Encyptors personalizados por nombre a partir de la versión 1.5
. El nombre del frijol predeterminado es:
jasyptStringEncryptor
Pero también se puede anular esto definiendo la propiedad:
jasypt.encryptor.bean
Entonces, por ejemplo, si define jasypt.encryptor.bean=encryptorBean
, entonces definiría su cifrador personalizado con ese nombre:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
...
}
A partir de jasypt-spring-boot-1.10
hay nuevos puntos de extensión. EncryptablePropertySource
ahora usa EncryptablePropertyResolver
para resolver todas las propiedades:
public interface EncryptablePropertyResolver {
String resolvePropertyValue ( String value );
}
Las implementaciones de esta interfaz son responsables tanto de detectar como de descifrar propiedades. La implementación predeterminada, DefaultPropertyResolver
utiliza el StringEncryptor
mencionado anteriormente y un nuevo EncryptablePropertyDetector
.
EncryptablePropertyDetector
personalizado Puede anular la implementación predeterminada proporcionando un Bean de tipo EncryptablePropertyDetector
con el nombre encryptablePropertyDetector
o, si desea proporcionar su propio nombre de bean, anule la propiedad jasypt.encryptor.property.detector-bean
y especifique el nombre que desea darle al bean. Al proporcionar esto, usted será responsable de detectar las propiedades cifradas. Ejemplo:
private static class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {
@ Override
public boolean isEncrypted ( String value ) {
if ( value != null ) {
return value . startsWith ( "ENC@" );
}
return false ;
}
@ Override
public String unwrapEncryptedValue ( String value ) {
return value . substring ( "ENC@" . length ());
}
}
@ Bean ( name = "encryptablePropertyDetector" )
public EncryptablePropertyDetector encryptablePropertyDetector () {
return new MyEncryptablePropertyDetector ();
}
prefix
y suffix
de propiedad cifrada personalizada Si todo lo que desea hacer es tener un prefijo/sufijo diferente para las propiedades cifradas, puede seguir usando todas las implementaciones predeterminadas y simplemente anular las siguientes propiedades en application.properties
(o application.yml
):
jasypt :
encryptor :
property :
prefix : " ENC@[ "
suffix : " ] "
EncryptablePropertyResolver
personalizado Puede anular la implementación predeterminada proporcionando un Bean de tipo EncryptablePropertyResolver
con el nombre encryptablePropertyResolver
o, si desea proporcionar su propio nombre de bean, anule la propiedad jasypt.encryptor.property.resolver-bean
y especifique el nombre que desea darle al bean. Al proporcionar esto, usted será responsable de detectar y descifrar las propiedades cifradas. Ejemplo:
class MyEncryptablePropertyResolver implements EncryptablePropertyResolver {
private final PooledPBEStringEncryptor encryptor ;
public MyEncryptablePropertyResolver ( char [] password ) {
this . encryptor = new PooledPBEStringEncryptor ();
SimpleStringPBEConfig config = new SimpleStringPBEConfig ();
config . setPasswordCharArray ( password );
config . setAlgorithm ( "PBEWITHHMACSHA512ANDAES_256" );
config . setKeyObtentionIterations ( "1000" );
config . setPoolSize ( 1 );
config . setProviderName ( "SunJCE" );
config . setSaltGeneratorClassName ( "org.jasypt.salt.RandomSaltGenerator" );
config . setIvGeneratorClassName ( "org.jasypt.iv.RandomIvGenerator" );
config . setStringOutputType ( "base64" );
encryptor . setConfig ( config );
}
@ Override
public String resolvePropertyValue ( String value ) {
if ( value != null && value . startsWith ( "{cipher}" )) {
return encryptor . decrypt ( value . substring ( "{cipher}" . length ()));
}
return value ;
}
}
@ Bean ( name = "encryptablePropertyResolver" )
EncryptablePropertyResolver encryptablePropertyResolver ( @ Value ( "${jasypt.encryptor.password}" ) String password ) {
return new MyEncryptablePropertyResolver ( password . toCharArray ());
}
Tenga en cuenta que al anular EncryptablePropertyResolver
, cualquier otra configuración o anulación que pueda tener para prefijos, sufijos, EncryptablePropertyDetector
y StringEncryptor
dejarán de funcionar ya que el solucionador predeterminado es el que los usa. Tendrías que cablear todo eso tú mismo. Afortunadamente, no es necesario anular este bean en la mayoría de los casos; las opciones anteriores deberían ser suficientes.
Pero como puede ver en la implementación, la detección y el descifrado de las propiedades cifradas son internos de MyEncryptablePropertyResolver
jasypt-spring-boot:2.1.0
introduce una nueva característica para especificar filtros de propiedades. El filtro es parte de la API EncryptablePropertyResolver
y le permite determinar qué propiedades o fuentes de propiedades considerar para el descifrado. Esto es incluso antes de examinar el valor real de la propiedad para buscarlo o intentar descifrarlo. Por ejemplo, de forma predeterminada, todas las propiedades cuyo nombre comienza con jasypt.encryptor
quedan excluidas del examen. Esto es para evitar dependencias circulares en el momento de la carga cuando se configuran los beans de biblioteca.
De forma predeterminada, DefaultPropertyResolver
usa DefaultPropertyFilter
, que le permite especificar las siguientes listas de patrones de cadenas:
EncryptablePropertyFilter
personalizado Puede anular la implementación predeterminada proporcionando un Bean de tipo EncryptablePropertyFilter
con el nombre encryptablePropertyFilter
o, si desea proporcionar su propio nombre de bean, anule la propiedad jasypt.encryptor.property.filter-bean
y especifique el nombre que desea darle al bean. Al proporcionar esto, usted será responsable de detectar las propiedades y/o las fuentes de propiedades que desea considerar para el descifrado. Ejemplo:
class MyEncryptablePropertyFilter implements EncryptablePropertyFilter {
public boolean shouldInclude ( PropertySource <?> source , String name ) {
return name . startsWith ( 'encrypted.' );
}
}
@ Bean ( name = "encryptablePropertyFilter" )
EncryptablePropertyFilter encryptablePropertyFilter () {
return new MyEncryptablePropertyFilter ();
}
Tenga en cuenta que para que este mecanismo funcione, no debe proporcionar un EncryptablePropertyResolver
personalizado y en su lugar utilizar el solucionador predeterminado. Si proporciona un solucionador personalizado, usted es responsable de todo el proceso de detección y descifrado de propiedades.
PropertySource
para que no sean introspeccionadasDefina una lista separada por comas de nombres de clases completos que se omitirán de la introspección. Estas clases no serán empaquetadas/representadas por este complemento y, por lo tanto, las propiedades contenidas en ellas no admitirán el cifrado/descifrado:
jasypt.encryptor.skip-property-sources =org.springframework.boot.env.RandomValuePropertySource,org.springframework.boot.ansi.AnsiPropertySource
Las propiedades cifradas se almacenan en caché dentro de su aplicación y, en ciertos escenarios, como cuando se utiliza una configuración externalizada desde un servidor de configuración, las propiedades deben actualizarse cuando cambian. Para esto, jasypt-spring-boot
registra un RefreshScopeRefreshedEventListener
que escucha los siguientes eventos de forma predeterminada para borrar el caché de propiedades cifradas:
public static final List < String > EVENT_CLASS_NAMES = Arrays . asList (
"org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent" ,
"org.springframework.cloud.context.environment.EnvironmentChangeEvent" ,
"org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent"
);
Si necesita registrar eventos adicionales que le gustaría activar una invalidación de caché cifrada, puede agregarlos usando la siguiente propiedad (separados por coma si se necesita más de uno):
jasypt.encryptor.refreshed-event-classes =org.springframework.boot.context.event.ApplicationStartedEvent
Se proporciona un complemento de Maven con una serie de utilidades útiles.
Para usar el complemento, simplemente agregue lo siguiente a su pom.xml:
< build >
< plugins >
< plugin >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-maven-plugin</ artifactId >
< version >3.0.5</ version >
</ plugin >
</ plugins >
</ build >
Al utilizar este complemento, la forma más sencilla de proporcionar su contraseña de cifrado es a través de una propiedad del sistema, es decir, -Djasypt.encryptor.password="la contraseña".
De forma predeterminada, el complemento considerará la configuración de cifrado en los archivos de configuración de arranque Spring estándar en ./src/main/resources. También puede utilizar propiedades del sistema o variables de entorno para proporcionar esta configuración.
Tenga en cuenta que el resto del código y los recursos de su aplicación no están disponibles para el complemento porque los complementos de Maven no comparten un classpath con los proyectos. Si su aplicación proporciona una configuración de cifrado a través de un bean StringEncryptor, esto no será recogido.
En general, se recomienda confiar únicamente en la configuración predeterminada segura.
Para cifrar una ejecución de valor único:
mvn jasypt:encrypt-value -Djasypt.encryptor.password= " the password " -Djasypt.plugin.value= " theValueYouWantToEncrypt "
Para cifrar marcadores de posición en src/main/resources/application.properties
, simplemente ajuste cualquier cadena con DEC(...)
. Por ejemplo:
sensitive.password =DEC(secret value)
regular.property =example
Luego ejecuta:
mvn jasypt:encrypt -Djasypt.encryptor.password= " the password "
Lo que editaría ese archivo en su lugar dando como resultado:
sensitive.password =ENC(encrypted)
regular.property =example
El nombre del archivo y la ubicación se pueden personalizar.
Para descifrar una ejecución de valor único:
mvn jasypt:decrypt-value -Djasypt.encryptor.password= " the password " -Djasypt.plugin.value= " DbG1GppXOsFa2G69PnmADvQFI3esceEhJYbaEIKCcEO5C85JEqGAhfcjFMGnoRFf "
Para descifrar marcadores de posición en src/main/resources/application.properties
, simplemente ajuste cualquier cadena con ENC(...)
. Por ejemplo:
sensitive.password =ENC(encrypted)
regular.property =example
Esto se puede descifrar de la siguiente manera:
mvn jasypt:decrypt -Djasypt.encryptor.password= " the password "
Lo que mostraría el contenido descifrado en la pantalla:
sensitive.password =DEC(decrypted)
regular.property =example
Tenga en cuenta que mostrar el archivo en la pantalla, en lugar de editarlo en el lugar, está diseñado para reducir la confirmación accidental de valores descifrados al control de versiones. Al descifrar, lo más probable es que sólo desee comprobar qué valor se ha cifrado, en lugar de querer descifrar ese valor permanentemente.
Cambiar la configuración de las propiedades cifradas existentes es un poco complicado utilizando los objetivos de cifrar/descifrar. Debe ejecutar el objetivo de descifrado utilizando la configuración anterior, luego copiar la salida descifrada nuevamente en el archivo original y luego ejecutar el objetivo de cifrado con la nueva configuración.
El objetivo de volver a cifrar simplifica esto al volver a cifrar un archivo en el lugar. Se deben proporcionar 2 juegos de configuración. La nueva configuración se proporciona de la misma manera que configuraría los otros objetivos de Maven. La configuración anterior se proporciona a través de propiedades del sistema con el prefijo "jasypt.plugin.old" en lugar de "jasypt.encryptor".
Por ejemplo, para volver a cifrar las propiedades de la aplicación que se cifraron previamente con la contraseña ANTIGUA y luego cifrar con la nueva contraseña NUEVA:
mvn jasypt:reencrypt -Djasypt.plugin.old.password=OLD -Djasypt.encryptor.password=NEW
Nota: Toda la configuración anterior debe pasarse como propiedades del sistema. No se admiten variables de entorno ni archivos de configuración de Spring Boot.
A veces, la configuración de cifrado predeterminada puede cambiar entre versiones de jasypt-spring-boot. Puede actualizar automáticamente sus propiedades cifradas a los nuevos valores predeterminados con el objetivo de actualización. Esto descifrará su archivo application.properties usando la configuración predeterminada anterior y lo volverá a cifrar usando la nueva configuración predeterminada.
mvn jasypt:upgrade -Djasypt.encryptor.password=EXAMPLE
También puede pasar la propiedad del sistema -Djasypt.plugin.old.major-version
para especificar la versión desde la que está actualizando. Esto siempre será predeterminado a la última versión principal donde cambió la configuración. Actualmente, la única versión principal donde los valores predeterminados cambiaron es la versión 2, por lo que no es necesario establecer esta propiedad, pero está ahí para uso futuro.
También puede descifrar un archivo de propiedades y cargar todas sus propiedades en la memoria y hacerlas accesibles para Maven. Esto es útil cuando desea que las propiedades cifradas estén disponibles para otros complementos de Maven.
Puedes encadenar los objetivos de los complementos posteriores directamente después de este. Por ejemplo, con ruta migratoria:
mvn jasypt:load flyway:migrate -Djasypt.encryptor.password= " the password "
También puede especificar un prefijo para cada propiedad con -Djasypt.plugin.keyPrefix=example.
. Esto ayuda a evitar posibles conflictos con otras propiedades de Maven.
Para todas las utilidades anteriores, la ruta del archivo que está cifrando/descifrando tiene como valor predeterminado file:src/main/resources/application.properties
.
Esto se puede cambiar utilizando la propiedad del sistema -Djasypt.plugin.path
.
Puede cifrar un archivo en su directorio de recursos de prueba:
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/test/application.properties " -Djasypt.encryptor.password= " the password "
O con otro nombre:
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/resources/flyway.properties " -Djasypt.encryptor.password= " the password "
O con un tipo de archivo diferente (el complemento admite cualquier formato de archivo de texto sin formato, incluido YAML):
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/resources/application.yaml " -Djasypt.encryptor.password= " the password "
Tenga en cuenta que el objetivo de carga solo admite archivos .property
Puede anular cualquier configuración de Spring que admita en su aplicación al ejecutar el complemento, por ejemplo, seleccionando un perfil de Spring determinado:
mvn jasypt:encrypt -Dspring.profiles.active=cloud -Djasypt.encryptor.password= " the password "
Para cifrar/descifrar propiedades en proyectos de varios módulos, deshabilite la recursividad con -N
o --non-recursive
en el comando maven:
mvn jasypt:upgrade -Djasypt.plugin.path=file:server/src/test/resources/application-test.properties -Djasypt.encryptor.password=supersecret -N
jasypt-spring-boot:2.1.1
introduce una nueva característica para cifrar/descifrar propiedades mediante cifrado asimétrico con un par de claves públicas/privadas en formatos DER o PEM.
Las siguientes son las propiedades de configuración que puede utilizar para configurar el descifrado asimétrico de propiedades;
Llave | Valor predeterminado | Descripción |
jasypt.encryptor.privateKeyString | nulo | clave privada para descifrado en formato String |
jasypt.encryptor.privateKeyLocation | nulo | ubicación de la clave privada para descifrar en formato de recursos de primavera |
jasypt.encryptor.privateKeyFormat | DER | Formato de clave. DER o PEM |
Debe utilizar privateKeyString
o privateKeyLocation
; el formato String tiene prioridad si está configurado. Para especificar una clave privada en formato DER con privateKeyString
, codifique los bytes de la clave en base64
.
Tenga en cuenta que jasypt.encryptor.password
todavía tiene prioridad para el cifrado PBE sobre la configuración asimétrica.
jasypt :
encryptor :
privateKeyString: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCtB/IYK8E52CYMZTpyIY9U0HqMewyKnRvSo6s+9VNIn/HSh9+MoBGiADa2MaPKvetS3CD3CgwGq/+LIQ1HQYGchRrSORizOcIp7KBx+Wc1riatV/tcpcuFLC1j6QJ7d2I+T7RA98Sx8X39orqlYFQVysTw/aTawX/yajx0UlTW3rNAY+ykeQ0CBHowtTxKM9nGcxLoQbvbYx1iG9JgAqye7TYejOpviOH+BpD8To2S8zcOSojIhixEfayay0gURv0IKJN2LP86wkpAuAbL+mohUq1qLeWdTEBrIRXjlnrWs1M66w0l/6JwaFnGOqEB6haMzE4JWZULYYpr2yKyoGCRAgMBAAECggEAQxURhs1v3D0wgx27ywO3zeoFmPEbq6G9Z6yMd5wk7cMUvcpvoNVuAKCUlY4pMjDvSvCM1znN78g/CnGF9FoxJb106Iu6R8HcxOQ4T/ehS+54kDvL999PSBIYhuOPUs62B/Jer9FfMJ2veuXb9sGh19EFCWlMwILEV/dX+MDyo1qQaNzbzyyyaXP8XDBRDsvPL6fPxL4r6YHywfcPdBfTc71/cEPksG8ts6um8uAVYbLIDYcsWopjVZY/nUwsz49xBCyRcyPnlEUJedyF8HANfVEO2zlSyRshn/F+rrjD6aKBV/yVWfTEyTSxZrBPl4I4Tv89EG5CwuuGaSagxfQpAQKBgQDXEe7FqXSaGk9xzuPazXy8okCX5pT6545EmqTP7/JtkMSBHh/xw8GPp+JfrEJEAJJl/ISbdsOAbU+9KAXuPmkicFKbodBtBa46wprGBQ8XkR4JQoBFj1SJf7Gj9ozmDycozO2Oy8a1QXKhHUPkbPQ0+w3efwoYdfE67ZodpFNhswKBgQDN9eaYrEL7YyD7951WiK0joq0BVBLK3rwO5+4g9IEEQjhP8jSo1DP+zS495t5ruuuuPsIeodA79jI8Ty+lpYqqCGJTE6muqLMJDiy7KlMpe0NZjXrdSh6edywSz3YMX1eAP5U31pLk0itMDTf2idGcZfrtxTLrpRffumowdJ5qqwKBgF+XZ+JRHDN2aEM0atAQr1WEZGNfqG4Qx4o0lfaaNs1+H+knw5kIohrAyvwtK1LgUjGkWChlVCXb8CoqBODMupwFAqKL/IDImpUhc/t5uiiGZqxE85B3UWK/7+vppNyIdaZL13a1mf9sNI/p2whHaQ+3WoW/P3R5z5uaifqM1EbDAoGAN584JnUnJcLwrnuBx1PkBmKxfFFbPeSHPzNNsSK3ERJdKOINbKbaX+7DlT4bRVbWvVj/jcw/c2Ia0QTFpmOdnivjefIuehffOgvU8rsMeIBsgOvfiZGx0TP3+CCFDfRVqjIBt3HAfAFyZfiP64nuzOERslL2XINafjZW5T0pZz8CgYAJ3UbEMbKdvIuK+uTl54R1Vt6FO9T5bgtHR4luPKoBv1ttvSC6BlalgxA0Ts/AQ9tCsUK2JxisUcVgMjxBVvG0lfq/EHpL0Wmn59SHvNwtHU2qx3Ne6M0nQtneCCfR78OcnqQ7+L+3YCMqYGJHNFSard+dewfKoPnWw0WyGFEWCg==
jasypt :
encryptor :
privateKeyLocation : classpath:private_key.der
jasypt :
encryptor :
privateKeyFormat : PEM
privateKeyString : |-
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCtB/IYK8E52CYM
ZTpyIY9U0HqMewyKnRvSo6s+9VNIn/HSh9+MoBGiADa2MaPKvetS3CD3CgwGq/+L
IQ1HQYGchRrSORizOcIp7KBx+Wc1riatV/tcpcuFLC1j6QJ7d2I+T7RA98Sx8X39
orqlYFQVysTw/aTawX/yajx0UlTW3rNAY+ykeQ0CBHowtTxKM9nGcxLoQbvbYx1i
G9JgAqye7TYejOpviOH+BpD8To2S8zcOSojIhixEfayay0gURv0IKJN2LP86wkpA
uAbL+mohUq1qLeWdTEBrIRXjlnrWs1M66w0l/6JwaFnGOqEB6haMzE4JWZULYYpr
2yKyoGCRAgMBAAECggEAQxURhs1v3D0wgx27ywO3zeoFmPEbq6G9Z6yMd5wk7cMU
vcpvoNVuAKCUlY4pMjDvSvCM1znN78g/CnGF9FoxJb106Iu6R8HcxOQ4T/ehS+54
kDvL999PSBIYhuOPUs62B/Jer9FfMJ2veuXb9sGh19EFCWlMwILEV/dX+MDyo1qQ
aNzbzyyyaXP8XDBRDsvPL6fPxL4r6YHywfcPdBfTc71/cEPksG8ts6um8uAVYbLI
DYcsWopjVZY/nUwsz49xBCyRcyPnlEUJedyF8HANfVEO2zlSyRshn/F+rrjD6aKB
V/yVWfTEyTSxZrBPl4I4Tv89EG5CwuuGaSagxfQpAQKBgQDXEe7FqXSaGk9xzuPa
zXy8okCX5pT6545EmqTP7/JtkMSBHh/xw8GPp+JfrEJEAJJl/ISbdsOAbU+9KAXu
PmkicFKbodBtBa46wprGBQ8XkR4JQoBFj1SJf7Gj9ozmDycozO2Oy8a1QXKhHUPk
bPQ0+w3efwoYdfE67ZodpFNhswKBgQDN9eaYrEL7YyD7951WiK0joq0BVBLK3rwO
5+4g9IEEQjhP8jSo1DP+zS495t5ruuuuPsIeodA79jI8Ty+lpYqqCGJTE6muqLMJ
Diy7KlMpe0NZjXrdSh6edywSz3YMX1eAP5U31pLk0itMDTf2idGcZfrtxTLrpRff
umowdJ5qqwKBgF+XZ+JRHDN2aEM0atAQr1WEZGNfqG4Qx4o0lfaaNs1+H+knw5kI
ohrAyvwtK1LgUjGkWChlVCXb8CoqBODMupwFAqKL/IDImpUhc/t5uiiGZqxE85B3
UWK/7+vppNyIdaZL13a1mf9sNI/p2whHaQ+3WoW/P3R5z5uaifqM1EbDAoGAN584
JnUnJcLwrnuBx1PkBmKxfFFbPeSHPzNNsSK3ERJdKOINbKbaX+7DlT4bRVbWvVj/
jcw/c2Ia0QTFpmOdnivjefIuehffOgvU8rsMeIBsgOvfiZGx0TP3+CCFDfRVqjIB
t3HAfAFyZfiP64nuzOERslL2XINafjZW5T0pZz8CgYAJ3UbEMbKdvIuK+uTl54R1
Vt6FO9T5bgtHR4luPKoBv1ttvSC6BlalgxA0Ts/AQ9tCsUK2JxisUcVgMjxBVvG0
lfq/EHpL0Wmn59SHvNwtHU2qx3Ne6M0nQtneCCfR78OcnqQ7+L+3YCMqYGJHNFSa
rd+dewfKoPnWw0WyGFEWCg==
-----END PRIVATE KEY-----
jasypt :
encryptor :
privateKeyFormat : PEM
privateKeyLocation : classpath:private_key.pem
No existe ningún programa/comando para cifrar propiedades usando claves asimétricas, pero puede usar el siguiente fragmento de código para cifrar sus propiedades:
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricConfig ;
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricStringEncryptor ;
import org . jasypt . encryption . StringEncryptor ;
public class PropertyEncryptor {
public static void main ( String [] args ) {
SimpleAsymmetricConfig config = new SimpleAsymmetricConfig ();
config . setPublicKey ( "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArQfyGCvBOdgmDGU6ciGPVNB6jHsMip0b0qOrPvVTSJ/x0offjKARogA2tjGjyr3rUtwg9woMBqv/iyENR0GBnIUa0jkYsznCKeygcflnNa4mrVf7XKXLhSwtY+kCe3diPk+0QPfEsfF9/aK6pWBUFcrE8P2k2sF/8mo8dFJU1t6zQGPspHkNAgR6MLU8SjPZxnMS6EG722MdYhvSYAKsnu02Hozqb4jh/gaQ/E6NkvM3DkqIyIYsRH2smstIFEb9CCiTdiz/OsJKQLgGy/pqIVKtai3lnUxAayEV45Z61rNTOusNJf+icGhZxjqhAeoWjMxOCVmVC2GKa9sisqBgkQIDAQAB" );
StringEncryptor encryptor = new SimpleAsymmetricStringEncryptor ( config );
String message = "chupacabras" ;
String encrypted = encryptor . encrypt ( message );
System . out . printf ( "Encrypted message %s n " , encrypted );
}
}
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricConfig ;
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricStringEncryptor ;
import org . jasypt . encryption . StringEncryptor ;
import static com . ulisesbocchio . jasyptspringboot . util . AsymmetricCryptography . KeyFormat . PEM ;
public class PropertyEncryptor {
public static void main ( String [] args ) {
SimpleAsymmetricConfig config = new SimpleAsymmetricConfig ();
config . setKeyFormat ( PEM );
config . setPublicKey ( "-----BEGIN PUBLIC KEY----- n " +
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArQfyGCvBOdgmDGU6ciGP n " +
"VNB6jHsMip0b0qOrPvVTSJ/x0offjKARogA2tjGjyr3rUtwg9woMBqv/iyENR0GB n " +
"nIUa0jkYsznCKeygcflnNa4mrVf7XKXLhSwtY+kCe3diPk+0QPfEsfF9/aK6pWBU n " +
"FcrE8P2k2sF/8mo8dFJU1t6zQGPspHkNAgR6MLU8SjPZxnMS6EG722MdYhvSYAKs n " +
"nu02Hozqb4jh/gaQ/E6NkvM3DkqIyIYsRH2smstIFEb9CCiTdiz/OsJKQLgGy/pq n " +
"IVKtai3lnUxAayEV45Z61rNTOusNJf+icGhZxjqhAeoWjMxOCVmVC2GKa9sisqBg n " +
"kQIDAQAB n " +
"-----END PUBLIC KEY----- n " );
StringEncryptor encryptor = new SimpleAsymmetricStringEncryptor ( config );
String message = "chupacabras" ;
String encrypted = encryptor . encrypt ( message );
System . out . printf ( "Encrypted message %s n " , encrypted );
}
}
A partir de la versión 3.0.5, se admite el cifrado AES 256-GCM. Para utilizar este tipo de cifrado, establezca la propiedad jasypt.encryptor.gcm-secret-key-string
, jasypt.encryptor.gcm-secret-key-location
o jasypt.encryptor.gcm-secret-key-password
.
El algoritmo subyacente utilizado es AES/GCM/NoPadding
así que asegúrese de que esté instalado en su JDK.
SimpleGCMByteEncryptor
utiliza un IVGenerator
para cifrar propiedades. Puede configurar eso con la propiedad jasypt.encryptor.iv-generator-classname
si no desea utilizar la implementación predeterminada RandomIvGenerator
Cuando utilice una clave a través de jasypt.encryptor.gcm-secret-key-string
o jasypt.encryptor.gcm-secret-key-location
, asegúrese de codificar su clave en base64. El valor de la cadena base64 podría establecerse en jasypt.encryptor.gcm-secret-key-string
, o simplemente puede guardarlo en un archivo y usar un localizador de recursos Spring para ese archivo en la propiedad jasypt.encryptor.gcm-secret-key-location
. Por ejemplo:
jasypt.encryptor.gcm-secret-key-string = " PNG5egJcwiBrd+E8go1tb9PdPvuRSmLSV3jjXBmWlIU= "
# OR
jasypt.encryptor.gcm-secret-key-location =classpath:secret_key.b64
# OR
jasypt.encryptor.gcm-secret-key-location =file:/full/path/secret_key.b64
# OR
jasypt.encryptor.gcm-secret-key-location =file:relative/path/secret_key.b64
Opcionalmente, puedes crear tu propio bean StringEncryptor
:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
SimpleGCMConfig config = new SimpleGCMConfig ();
config . setSecretKey ( "PNG5egJcwiBrd+E8go1tb9PdPvuRSmLSV3jjXBmWlIU=" );
return new SimpleGCMStringEncryptor ( config );
}
Alternativamente, puede usar una contraseña para cifrar/descifrar propiedades usando AES 256-GCM. La contraseña se utiliza para generar una clave al inicio, por lo que hay algunas propiedades que necesita o puede configurar, estas son:
jasypt.encryptor.gcm-secret-key-password = " chupacabras "
# Optional, defaults to "1000"
jasypt.encryptor.key-obtention-iterations = " 1000 "
# Optional, defaults to 0, no salt. If provided, specify the salt string in ba64 format
jasypt.encryptor.gcm-secret-key-salt = " HrqoFr44GtkAhhYN+jP8Ag== "
# Optional, defaults to PBKDF2WithHmacSHA256
jasypt.encryptor.gcm-secret-key-algorithm = " PBKDF2WithHmacSHA256 "
Asegúrese de que estos parámetros sean los mismos si está cifrando sus secretos con herramientas externas. Opcionalmente, puedes crear tu propio bean StringEncryptor
:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
SimpleGCMConfig config = new SimpleGCMConfig ();
config . setSecretKeyPassword ( "chupacabras" );
config . setSecretKeyIterations ( 1000 );
config . setSecretKeySalt ( "HrqoFr44GtkAhhYN+jP8Ag==" );
config . setSecretKeyAlgorithm ( "PBKDF2WithHmacSHA256" );
return new SimpleGCMStringEncryptor ( config );
}
Puede utilizar el complemento Maven o seguir una estrategia similar como se explica en Propiedades de cifrado de cifrado asimétrico.
El repositorio jasypt-spring-boot-demo-samples contiene ejemplos funcionales de aplicaciones Spring Boot. La aplicación de demostración principal jasypt-spring-boot-demo establece explícitamente una propiedad del sistema con la contraseña de cifrado antes de que se ejecute la aplicación. Para tener un escenario un poco más realista, intente eliminar la línea donde se establece la propiedad del sistema, cree la aplicación con maven y ejecute:
java -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password
Y pasará la contraseña de cifrado como argumento de la línea de comando. Ejecútelo así:
java -Djasypt.encryptor.password=password -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar
Y pasará la contraseña de cifrado como una propiedad del sistema.
Si necesita pasar esta propiedad como una variable de entorno, puede lograrlo creando application.properties o application.yml y agregando:
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}
o en YAML
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD:}
Básicamente, lo que esto hace es definir la propiedad jasypt.encryptor.password
que apunta a una propiedad diferente JASYPT_ENCRYPTOR_PASSWORD
que puede configurar con una variable de entorno y que también puede anular a través de Propiedades del sistema. Esta técnica también se puede utilizar para traducir nombres/valores de propiedad para cualquier otra biblioteca que necesite. Esto también está disponible en la aplicación de demostración. Entonces puedes ejecutar la aplicación de demostración de esta manera:
JASYPT_ENCRYPTOR_PASSWORD=password java -jar target/jasypt-spring-boot-demo-1.5-SNAPSHOT.jar
Nota: Cuando se utiliza Gradle como herramienta de compilación, la tarea ProcessResources falla debido al carácter '$'; para resolver esto, solo necesita escapar de esta variable como esta '$'.
Si bien jasypt-spring-boot-demo es una demostración completa que muestra todas las formas posibles de cifrar/descifrar propiedades, existen otras demostraciones múltiples que muestran escenarios aislados.