De acuerdo con la documentación , la función de hash scrypt funciona así:
La función hash hace lo siguiente:
- Agrega sal aleatoria.
- Crea un HMAC para proteger contra ataques activos.
- Utiliza la función de derivación de clave scrypt para derivar un hash para una clave.
Formato Hash
Todos los hashes comienzan con la palabra "scrypt". Luego viene el scrypt Parámetros utilizados en la función de derivación de claves, seguidos de aleatorios. sal. Finalmente, se adjunta un HMAC de 256 bits de contenido anterior, con la clave para el HMAC que se produce mediante la derivación de clave scrypt función. El resultado es una salida de 768 bits (96 bytes):
- bytes 0-5: la palabra "scrypt"
- bytes 6-15: parámetros Scrypt N, r y p
- bytes 16-47: 32 bits de sal aleatoria
- bytes 48-63: una suma de comprobación de 16 bits
- bytes 64-95: un HMAC de 32 bits de los bytes 0 a 63 que usa una clave producida por la función de derivación de clave scrypt.
Los bytes 0 a 63 se dejan en texto sin formato. Esto es necesario ya que estos bytes. Contiene los metadatos necesarios para verificar el hash. Esta informacion no estar encriptado no significa que la seguridad se debilite. Que es Lo esencial en términos de seguridad es la integridad del hash (lo que significa que ninguna parte de la salida hash se puede cambiar) y que la contraseña original no se puede determinar a partir de la salida de hash (es por esto que estás usando scrypt - porque lo hace de buena manera). Bytes 64 a 95 es donde todo esto sucede.
Mi pregunta es ¿por qué utiliza el hash scrypt como clave para el algoritmo HMAC en lugar de simplemente devolver el hash scrypt directamente? ¿Qué protección extra da esto? Menciona "ataques activos" pero no da detalles.