Em um projeto recente, descobri que o BCrypt é um excelente algoritmo de hashing para armazenar senhas no banco de dados. Eu queria usá-lo no projeto, mas o módulo de autenticação DatabaseServerLoginModule não possui uma opção para seu uso (apenas para os algoritmos de hashing reconhecidos pela classe java.security.MessageDigest como MD5 e SHA).

O bom do software livre é que seu código está disponível e, assim, podemos modificá-lo para nossas necessidade, certo? Thanks, Richard Stallman, Linus Torvalds and so many other incredible people! De qualquer forma, aprendi que, com Orientação a Objetos, não precisamos necessariamente abrir o código para poder estender suas funcionalidades. Neste caso, thanks, Uncle Bob and all other fantastic people from Object Mentor.

Juntando tudo isso, criei uma nova classe que chamei de DatabaseServerWithBCryptLoginModule:

import org.jboss.security.auth.spi.DatabaseServerLoginModule;
import org.mindrot.jbcrypt.BCrypt;

public class DatabaseServerWithBCryptLoginModule extends DatabaseServerLoginModule {
    @Override
    protected boolean validatePassword(String inputPassword, String expectedPassword) {
        return BCrypt.checkpw(inputPassword, expectedPassword);
    }
}

É isso mesmo, só isso! O.O. rulez! 🙂

Bom, na verdade, você ainda precisa das dependências, que foram resolvidas com o Maven:

<dependencies>
    <dependency>
        <groupId>org.jboss.security</groupId>
        <artifactId>jbosssx</artifactId>
        <version>2.0.4.SP4</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.mindrot</groupId>
        <artifactId>jbcrypt</artifactId>
        <version>0.3m</version>
    </dependency>
</dependencies>

Espero que esta informação seja útil para você!

Bons códigos e até o próximo post!