Picketbox es una librería que existe por defecto en Wildfly, que nos sirve para encriptar contraseñas que necesitemos colocar en el fichero de configuraciones standalone.xml.
Importante: Está librería se probó sin inconvenientes en JDK 11, en JDK 17 da errores.
A partir de Wildfly 25 ya no es posible usar la librería picketbox para encriptado de contraseñas, en su lugar es necesario usar las tiendas de credenciales Elytron. https://www.wildfly.org/news/2021/10/05/WildFly25-Final-Released/
Por lo tanto, si están trabajando en un proyecto con JDK 11 como versión máxima y Wildfly 24 como máxima versión, podrán usar la librería.
Encriptar password
Dependiendo de la versión de Wildfly es la versión de picketbox que trae, en el caso de Wildfly 24.0.1.Final la versión es 5.0.3.Final y está en la siguiente ruta:
wildfly_home/modules/system/layers/base/org/picketbox/main/picketbox-5.0.3.Final-redhat-00007.jar
Para poder encriptar con esta librería que vive en el propio server de aplicaciones, también es necesario dar acceso al logging de wildfly.
En la versión 24.0.1.Final la librería de logging se encuentra en:
wildfly_home/modules/system/layers/base/org/jboss/logging/commons/logging/main/ commons-logging-jboss-logging-1.0.0.Final.jar
Ahora debemos ejecutar el comando en un terminal para encriptar la contraseña, que involucra las dos librerías anteriores:
java -cp [librería picketbox];[librería logging] org.picketbox.datasource.security.SecureIdentityLoginModule [password]
En el caso específico de Wildfly 24.0.1Final la sintaxis sería:
java -cp wildfly_home/modules/system/layers/base/org/picketbox/main/picketbox-5.0.3.Final-redhat-00007.jar; wildfly_home/modules/system/layers/base/org/jboss/logging/commons/logging/main/ commons-logging-jboss-logging-1.0.0.Final.jar org.picketbox.datasource.security.SecureIdentityLoginModule miContraseña
Una vez que ejecutamos el comando nos generará un hash parecido al siguiente:
43d7a8d5445c5e04db0f9c6e84beda01
Configuración en Standalone.xml
Una vez tenemos el hash, dentro de Standalone.xml buscamos el subsystem “urn:jboss:domain:security:2.0”.
Entonces agregamos nuestra configuración de picketbox:
<security-domain name="PicketBoxExample" cache-type="default">
<authentication>
<login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
<module-option name="username" value="nbent"/>
<module-option name="password" value="43d7a8d5445c5e04db0f9c6e84beda01"/>
<module-option name="managedConnectionFactoryName" value="jboss.jca:service=LocalTxCM,name=Password_Pool"/>
</login-module>
</authentication>
</security-domain>
Para finalizar vamos al datasource donde queremos usar la clave encriptada de picketbox, como ser uno de ejemplo el siguiente:
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
<connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
<driver>h2</driver>
<security>
<user-name>sa</user-name>
<password>sa</password>
</security>
</datasource>
Y dentro el tag security que están las credenciales lo dejamos de la siguiente manera:
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
<connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
<driver>h2</driver>
<security>
<security-domain>PicketBoxExample</security-domain>
</security>
</datasource>