Aspectos de diseño inusuales de la autenticación basada en AWS HMAC, v4

3

Estoy diseñando una API RESTful en python. Quiero usar la autenticación HMAC. No pude encontrar ninguna biblioteca HMAC adecuada, así que estoy rodando la mía. Sin embargo, quiero usar un estándar conocido como AWS HMAC authentication v4 .

Al codificar una implementación de autenticación HMAC de cliente y servidor compatible con AWS, noté algunos aspectos poco comunes del diseño del estándar. No logro comprender por completo varias opciones de diseño que se hicieron.

Pregunta 1: ¿Por qué AWS usa una clave de firma compleja (producida a través de HMAC) en lugar del secreto compartido?

Tarea 3 : Calcular la versión 4 de la firma AWS describe:

  

Antes de calcular una firma, obtiene una clave de firma de su clave de acceso secreta de AWS. (No solo utiliza su clave de acceso secreta para firmar la solicitud). Luego, utiliza la clave de firma y la cadena para firmar que creó en la Tarea 2: Cree una cadena para firmar para la versión de firma 4 como entradas para una clave función hash. El resultado codificado en hexadecimal de la función hash con clave es la firma.

     

Para calcular una firma

     

Derive su clave de firma. Para hacer esto, usa su clave de acceso secreta para crear una serie de códigos de autenticación de mensajes basados en hash (HMAC) como se muestra en el siguiente pseudocódigo, donde HMAC (clave, datos) representa una función HMAC-SHA256 que devuelve la salida en formato binario . El resultado de cada función hash se convierte en entrada para la siguiente.

     

Pseudocódigo para derivar una clave de firma:

kSecret = Your AWS Secret Access Key
kDate = HMAC("AWS4" + kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "aws4_request")

Pregunta 2: no entiendo el propósito de la cadena de 'alcance de credencial'.

En pasos 2-3 de la Tarea 2 ( Crear una Cadena para Firmar para Firma Versión 4 ), una fecha y un valor de alcance de credencial se anexan a la cadena que está firmada. ¿Cuál es el propósito de estos valores?

El estándar ya firma la marca de tiempo UTC en el encabezado x-amz-date , como parte de la solicitud canónica que se preparó en la Tarea 1. Lo mismo ocurre con el especificador de región (us-east-1), ya que presumiblemente debe se reflejará en el encabezado Host: .

  

Agregue el valor de fecha de solicitud, seguido de un carácter de nueva línea. La fecha se especifica utilizando el formato ISO8601 Basic a través del encabezado x-amz-date en el formato AAAAMMDD'T'HHMMSS'Z '. Este valor debe coincidir con el valor que utilizó en los pasos anteriores.

20110909T233600Z\n
  

Agregue el valor del alcance de la credencial, seguido de un carácter de nueva línea. Este valor es una cadena que incluye la fecha (solo la fecha, no la fecha y la hora), la región que está seleccionando, el servicio que está solicitando y una cadena de terminación ("aws4_request") en minúsculas. La región y las cadenas de nombre de servicio deben estar codificadas en UTF-8.

20110909/us-east-1/iam/aws4_request\n
  

La fecha debe estar en el formato AAAAMMDD. Tenga en cuenta que la fecha no incluye un valor de hora.

    
pregunta octagonC 04.01.2015 - 00:18
fuente

1 respuesta

2
  

No pude encontrar ninguna biblioteca HMAC adecuada

Err, la biblioteca estándar tiene una. Lo mismo ocurre con la cryptography .

  

Pregunta 1: ¿Por qué AWS usa una clave de firma compleja (producida a través de HMAC) en lugar del propio secreto compartido?

Una buena razón que puedo ver para hacerlo de esta manera es evitar una clave de firma filtrada que comprometa toda la cuenta de AWS. La obtención de una clave de firma a partir de una combinación de la clave secreta, la región, un servicio específico y otros valores garantiza que diferentes elementos utilicen diferentes claves de firma.

  

Pregunta 2: no entiendo el propósito de la cadena de 'alcance de credencial'.

El "valor del alcance de la credencial" ( 20110909/us-east-1/iam/aws4_request\n ) probablemente ayuda a Amazon a afirmar que una solicitud particular está dirigida a la región y al servicio. No veo por qué la fecha se incluye tantas veces, pero puede haber sido un descuido cuando Amazon está diseñando el proceso.

    
respondido por el Ayrx 04.01.2015 - 04:08
fuente

Lea otras preguntas en las etiquetas