Background Image
TECNOLOGÍA

Comprensión de la autenticación SCRAM SHA-256 en MongoDB

Norman Jordan
Desarrollador de personal

December 6, 2023 | 6 Minuto(s) de lectura

El soporte de MongoDB para varios mecanismos de autenticación asegura que puedas elegir el mecanismo que mejor se adapte a tu aplicación. SCRAM SHA-256 es una gran elección, pero puede ser un poco difícil de entender, así que vamos a echar un vistazo a lo que sucede bajo el capó. Consideremos una aplicación que actúa como MongoDB y servidor. Uno de los retos interesantes a los que me enfrenté al crear esta aplicación es qué ocurre cuando los usuarios se autentican. La aplicación necesita tanto autenticar a los clientes que se conectan a ella como autenticarse con los servidores MongoDB.

Usar mecanismos seguros para autenticar usuarios es muy importante ya que las bases de datos MongoDB pueden contener información sensible. MongoDB soporta una variedad de mecanismos de autenticación, uno de los cuales se llama SCRAM SHA-256. SCRAM SHA-256 es el predeterminado en MongoDB. Es un potente mecanismo de autenticación con características para prevenir tipos comunes de ataques. El cliente y el servidor son capaces de probar que conocen la contraseña del usuario sin exponerla el uno al otro. También sirve para prevenir ataques de repetición.

Esta guía le proporcionará información sobre cómo funciona la autenticación SCRAM SHA-256 en MongoDB. Cubrirá el flujo de mensajes entre un cliente y un servidor. Además, explicará cada mensaje y lo que se necesita para construirlos.

El flujo de autenticación implica cuatro mensajes.

Image 1 - Making Sense of SCRAM SHA-256 Authentication in MongoDB 

1. Cliente primero - el cliente envía el nombre de usuario y un valor aleatorio al servidor.

2. El servidor envía la sal, el número de iteraciones y un valor aleatorio al cliente.

3. Cliente final: el cliente calcula su prueba de contraseña y la envía al servidor. Si la prueba del cliente fue aceptada por el servidor, entonces el servidor considerará al cliente autenticado para futuras solicitudes.

4. Servidor final: si la prueba del cliente es válida, el servidor calcula su prueba de contraseña y la envía al cliente.

Definiciones

  • Client nonce - un Base64 de 24 bytes aleatorios elegidos por el cliente.

  • Nonce del servidor: un Base64 de 24 bytes aleatorios elegidos por el servidor.

  • Sal - un Base64 de los bytes utilizados para el hash de la contraseña del usuario.

  • Iteraciones - el número de iteraciones a utilizar para el hash de la contraseña del usuario.

  • Client Proof - un valor calculado por el cliente para mostrar la posesión de la contraseña del usuario.

  • Server Proof - un valor calculado por el cliente para mostrar la posesión de la contraseña del usuario (o un hash de la misma)

  • h(v) - un SHA-256 de la matriz de bytes (v)

  • hmac(k, v) - un código HMAC SHA-256 de la matriz de bytes (v) utilizando la clave (k)

Primer mensaje del cliente

El primer mensaje del cliente se utiliza para indicar al servidor que inicie el proceso de autenticación. Este mensaje incluirá un speculativeAuthenticate con una carga útil valor. El carga útil tiene el formato

n,,n=<username>,r=<client nonce>

  • username - el nombre de usuario del usuario a autenticar.

El cliente debe conservar el nonce del cliente para utilizarlo más adelante.

El valor a utilizar para la carga útil son los bytes binarios UTF-8 de la cadena anterior.

Primer mensaje del servidor

El servidor utiliza el primer mensaje del servidor para enviar parámetros generados por el servidor al cliente. Al igual que con el primer mensaje del cliente, el mensaje incluirá un parámetro speculativeAuthenticate con una carga útil valor. La carga útil de carga útil tiene el formato

r=<client nonce><server nonce>,s=<salt>,i=<iterations>

El servidor necesita guardar estos valores para el usuario más tarde.

El valor a utilizar para la carga útil son los bytes binarios UTF-8 de la cadena anterior.

Mensaje final del cliente

El cliente genera la prueba cliente de la contraseña y la envía al servidor. El mensaje incluirá un carga útil valor. El carga útil tiene el formato

c=biws,r=<client nonce><server nonce>,p=<client proof>

  • c=biws - biws es la codificación Base64 de la cadena "n,,". Este valor nunca cambia.

Cálculo del Client-Proof

Esto se puede desglosar en varios valores diferentes que se calculan y se utilizan para producir la prueba del cliente. El Auth Message también es necesario más tarde para verificar que el servidor posee la contraseña del usuario.

Hash de contraseña con sal 

1. Crear una clave secreta HMAC SHA-256 a partir de los bytes UTF-8 de la contraseña del usuario.

2. Base64 decodifica el valor de la sal para obtener una matriz de bytes

3. Calcular el hash salado de la contraseña. Se necesitan iteraciones veces.  

iv = salt_bytes + [0, 0, 0, 1]
result = hmac(secret_key, iv)
previous = null
for (i = 1; i < iterations; i++) { 
    if (previous == null) { 
        previous = hmac(secret_key, result) 

    } else { 
        previous = hmac(secret_key, previous) 
    } 
    result = result ^ previous 
} 

4. Base64 codifica el valor del resultado para obtener el hash salado de la contraseña.

El servidor puede almacenar el hash de la contraseña salada en lugar de la contraseña sin procesar.

Clave del cliente 

1. Crea una clave secreta HMAC SHA-256 a partir del hash de la contraseña salada

2. Calcule el hash de la cadena fija ("Clave del cliente") utilizando la clave para obtener la clave del cliente

clave_cliente = hmac(clave_secreta, "Clave_cliente ".getBytes())

Mensaje de autenticación 

Crea una cadena con los parámetros de autenticación. Esto se llamará el mensaje de autenticación. Esta cadena es de una sola línea.

n=<username>, 
r=<client nonce>, 
r=<client nonce><server nonce>, 
s=<salt>, 
i=<iterations>, 
c=ibws, 
r=<client nonce><server nonce> 

Clave almacenada 

Calcula el hash SHA-256 de la clave del cliente. Esto se llamará la clave almacenada.

clave_almacenada = h(clave_cliente)

Firma del cliente 

1. Crear una clave secreta HMAC SHA-256 a partir de la clave almacenada.

2. Calcular el hash del mensaje de autenticación para obtener la firma del cliente

firma_cliente = hmac(clave_secreta, mensaje_de_autentificación)

Prueba del cliente 

1. Calcular el OR exclusivo de la clave y la firma del cliente. Ambas matrices de bytes tienen el mismo tamaño.

prueba_cliente = clave_cliente ^ firma_cliente

2. Base64 codifica la prueba del cliente para obtener el valor a enviar al servidor.

Mensaje final del servidor

El servidor verifica la prueba del cliente y calcula la prueba del servidor. El mensaje incluirá un carga útil valor. La carga útil tiene el formato

v=<server proof>

1. Crear una clave secreta HMAC SHA-256 a partir del hash de la contraseña salada.

2. Calcule el hash de la cadena fija ("Server Key") utilizando la clave para obtener la clave del servidor

clave_servidor = hmac(clave_secreta, "Clave_servidor ".getBytes())

3. Calcula el hash del mensaje de autenticación para obtener la firma del servidor

firma_servidor = hmac(clave_servidor, mensaje_aut)

4. Base64 codifica la firma del servidor para obtener la prueba del servidor

Ahora ya conoces los detalles de la autenticación SCRAM SHA-256 en MongoDB. Tienes los conocimientos necesarios para implementar la autenticación SCRAM SHA-256 en tus clientes y servidores compatibles con MongoDB.

La compatibilidad de MongoDB con varios mecanismos de autenticación garantiza que pueda elegir el mecanismo que mejor se adapte a su aplicación. SCRAM SHA-256 es una gran elección por su capacidad para proteger la contraseña del usuario y su protección contra ataques de repetición de mensajes.

A medida que continúe su viaje de desarrollo, una comprensión más profunda de SCRAM SHA-256 puede servir como una base útil para el diseño de mecanismos de autenticación en sus aplicaciones. ¡Feliz programación!

¿Listo para comenzar tu viaje de codificación con Improving? Obtenga más información aquí.

Tecnología

Reflexiones más recientes

Explore las entradas de nuestro blog e inspírese con los líderes de opinión de todas nuestras empresas.
Asset - Multi-Cloud Strategies for Developers image 2
NUBE

Aprovechamiento de SAP Analytics Cloud mediante widgets personalizados

SAP Muestra de widget personalizado