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.