¿Por qué la función scrypt de node.js usa HMAC de esta manera?

8

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):

     
  1. bytes 0-5: la palabra "scrypt"
  2.   
  3. bytes 6-15: parámetros Scrypt N, r y p
  4.   
  5. bytes 16-47: 32 bits de sal aleatoria
  6.   
  7. bytes 48-63: una suma de comprobación de 16 bits
  8.   
  9. 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.
  10.   

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.

    
pregunta ChrisD 07.05.2015 - 08:23
fuente

2 respuestas

17

Creé el módulo Node Scrypt.

HMAC agrega seguridad adicional. Al usarlo también se presta el esquema para que se use como encabezado en un formato de archivo cifrado (como se hace en tarsnap) y no solo en la base de datos de un servidor de autenticación. Además, Colin Percival (quien creó Scrypt) usa este esquema para verificar (en realidad lo copié de él).

Para explicar por qué se usa HMAC, vamos a tener un resumen rápido. Cuando se encripta algo utilizando la función de derivación de clave scrypt, se produce un resultado de 96 bytes con el siguiente desglose:

 bytes 0-5: The word "scrypt"
 byte 6: 0
 byte 7: logN
 bytes 8-11: r
 bytes 12-15: p
 bytes 16-47: salt (which is 32 bytes)
 bytes 48-63: A 16 byte SHA256 checksum (hash) of the contents of bytes 0 to 47
 bytes 64-95: A 32 byte HMAC hash of bytes 0 to 63 with the key being the scrypt cryptographic hash

Es vital que los bytes 0 a 47 estén en texto plano (no alterados ni encriptados de ninguna manera). Para garantizar esto, hay una suma de comprobación SHA256 de 16 bytes. Ahora bien, mientras que SHA se puede usar con bastante eficacia como una suma de comprobación (especialmente en este caso), no puede protegerse contra un ataque activo, lo que significa que alguien ha conseguido la carga útil, sustituyó sus propios valores. Por ejemplo, podría obtener la carga útil, calcular mis propios logN, r y p, así como mi propia suma de comprobación y luego pasar eso como el original.

Para evitar que esto suceda, los 32 bytes finales son HMAC. HMAC se usa para garantizar la integridad del mensaje (es decir, protege contra cualquier persona que cambie activamente una carga útil) y es un caballo de batalla del arsenal criptográfico (lea: es seguro y seguro de usar). HMAC requiere una clave, y usamos el hash scrypt como clave.

Si los 32 bytes finales fueran solo un hash de scrypt, entonces nada detendría a un atacante activo para que no pueda comprometer todo y sustituir su propio hash de scrypt. La HMAC protege contra. No solo sirve como medio para verificar el hash de scrypt, sino que también verifica la integridad de todo el esquema.

Por cierto: la gente puede preguntarse por qué se requiere la suma de comprobación (bytes 48 a 63). Bueno, si lo piensas bien, necesitamos calcular el hash de scrypt para que pueda ser usado como una clave para el HMAC. Por lo tanto, la suma de comprobación agrega un nivel adicional de verificación: si no se realiza, la verificación devuelve inmediatamente falso sin ir más lejos.

    
respondido por el Barry Steyn 08.06.2015 - 06:37
fuente
2

Se explica más adelante en la documentación:

  

Si su interés en este módulo es generar hashes para almacenar contraseñas, le recomiendo encarecidamente que use la función hash. La función de derivación de claves no produce ningún código de autenticación de mensaje para garantizar la integridad. También tendrá que almacenar los parámetros de scrypt por separado. Por último, no hay una función de verificación nativa incluida en este módulo.

Si todo lo que desea es derivar una clave utilizando el algoritmo scrypt, puede hacerlo con la función KDF también incluido en este paquete.

La llamada función hash en este paquete es una envoltura encima de la función hash scrypt original.

    
respondido por el aviv 07.05.2015 - 13:33
fuente

Lea otras preguntas en las etiquetas