Así que me encontré con este problema y no pude averiguar qué lo estaba causando. Implementé un flujo de autenticación usando JWT con tokens de acceso y actualización. Hice que los tokens de actualización caduquen después de un largo período de tiempo, y se pueden restablecer a la fuerza para evitar que los tokens de actualización robados se vuelvan a usar.
Para hacer esto, hago hash del token de actualización jwt usando bcrypt y lo almaceno en mi base de datos. Sin embargo, siempre obtengo un resultado verdadero cuando comparo el jwt sin procesar con el hash y no estoy seguro de por qué.
Busqué un poco y creo que esto sucede porque a bcrypt no le gustan los tokens de 191 caracteres y los recorta a una longitud máxima, y dado que la primera parte del jwt es similar, obtengo un resultado válido al comparar el hash . ¿Es esto cierto? Si es así, ¿cómo puedo extender la longitud máxima para que se ajuste a mis tokens o debo hacer un hash previo de los tokens antes de pasarlos a la función hash original?
await bcrypt.compare('loooooooooooooooooooooooooooooooooooooooooooooooooooooooong', hash); // true await bcrypt.compare('loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong', hash); // also trueCualquier ayuda es apreciada :)
Editar:
Bien, he estado pensando en esto por un tiempo y creo que he encontrado una buena solución.
Al firmar el token de actualización, también genero una contraseña aleatoria y la almaceno en la carga útil. En lugar de almacenar el hash del propio jwt, almaceno el hash de esta contraseña en mi base de datos. Entonces, cada vez que quiero verificar que el token de actualización no se haya bloqueado, primero verifico el token en sí y luego verifico la contraseña en la carga útil de mi hash almacenado. Si el token de actualización ya se ha actualizado, la contraseña en la carga útil ya no coincidirá con el hash del token de actualización recién firmado, por lo que no es válido.
¿Opiniones de futuros lectores?
y los recorta a una longitud máxima, y dado que la primera parte del jwt es similar, obtengo un resultado válido al comparar el hash. ¿Es esto cierto?
Sí, es verdad.
No hay forma de "extender la longitud máxima" del algoritmo. bcrypt tiene una longitud máxima de contraseña . Dependiendo de la implementación del algoritmo, el límite real puede ser un poco diferente. Si realmente desea usar más que ese límite para codificar la contraseña, deberá buscar un algoritmo de cifrado diferente, que puede o no ser mejor que bcrypt incluso con un límite de caracteres más alto.