Problemas para comparar pass (JBCrypt)(checkpw))


19 de Julio del 2019

Hola a todos, estoy teniendo problemas en java para comparar una contraseña de texto plano y un hash guardado en mi BD msql. Para ello utilizo el método checkpw(plainpass, hashpass) de Bcrypt.

En mi BD tengo guardado un hash y uso el checkpw para ver si coinciden con la contraseña ingresada por el usuario en el login de acceso, pero nunca coinciden. Si alguien pudiera ayudarme se lo agradeceria. Gracias de antemano.


David Carrero
12 de Agosto del 2026

Hola,

El motivo más habitual de que BCrypt.checkpw(plainpass, hashpass) devuelva false aunque la contraseña sea correcta no está en la lógica de comparación, está en cómo se guardó el hash en la base de datos. Cosas concretas a revisar, de más a menos probable:

1. La columna de la base de datos trunca el hash. Un hash de BCrypt siempre tiene exactamente 60 caracteres ($2a$10$...). Si tu columna en MySQL es VARCHAR(50) o menos, el hash se guarda cortado y ya nunca va a coincidir con nada. Comprueba con:

DESCRIBE tu_tabla;

y asegúrate de que la columna del hash es al menos VARCHAR(60), mejor VARCHAR(72) por margen.

2. Espacios en blanco al leer de la base de datos. Si el tipo de columna es CHAR(60) en vez de VARCHAR(60), MySQL rellena con espacios hasta completar el ancho fijo, y esos espacios de más rompen la comparación. Haz un .trim() al hash justo después de leerlo de la base de datos, o cambia la columna a VARCHAR.

3. Comprobar qué llega realmente a checkpw. Antes de sospechar de BCrypt, imprime ambos valores justo antes de la comparación:

System.out.println("[" + plainpass + "]");
System.out.println("[" + hashpass + "]");
System.out.println(BCrypt.checkpw(plainpass, hashpass));

Los corchetes ayudan a detectar espacios invisibles al principio o al final que de otra forma no verías en la consola. Si el hash impreso no tiene exactamente 60 caracteres o no empieza por $2a$/$2b$/$2y$, ya sabes que el problema está en cómo se guardó o se leyó, no en el método checkpw en sí.

David Carrero