

# Cálculos de firma para el encabezado de Authorization: transferencia de la carga útil en un solo fragmento (AWS Signature Version 4)
<a name="sig-v4-header-based-auth"></a>

Cuando se utiliza el encabezado `Authorization` para autenticar las solicitudes, el valor del encabezado incluye, entre otras cosas, una firma. Los cálculos de la firma varían según lo que elija para transferir la carga útil ([Descripción general](sigv4-auth-using-authorization-header.md#sigv4-auth-header-overview)). En esta sección, se explican los cálculos de la firma cuando se elige transferir la carga útil en un solo fragmento. La sección de ejemplos (consulte [Ejemplos: cálculos de firma](#example-signature-calculations)) muestra los cálculos de firma y los encabezados `Authorization` resultantes que puede utilizar como conjunto de pruebas para verificar el código.

**importante**  
Al transferir la carga útil en un único fragmento, si lo desea, puede optar por incluir el hash de la carga útil en los cálculos de firma, lo que se denomina *carga útil firmada* (si no la incluye, la carga útil se considera *no firmada*). El procedimiento de firma analizado en la siguiente sección se aplica a ambos, pero hay que tener en cuenta las siguientes diferencias:  
   
**Opción de carga firmada**: se incluye el hash de carga útil al crear la solicitud canónica (que luego pasa a formar parte de StringToSign, como se explica en la sección de cálculo de firmas). También se especifica el mismo valor que el valor del encabezado `x-amz-content-sha256` al enviar la solicitud a S3.
**Opción de carga útil sin firmar**: se incluye la cadena literal `UNSIGNED-PAYLOAD` al crear una solicitud canónica y se establece el mismo valor que el valor del encabezado `x-amz-content-sha256` al enviar la solicitud a Amazon S3.
Al enviar la solicitud a Amazon S3, el valor del encabezado `x-amz-content-sha256` informa a Amazon S3 de si la carga útil está firmada o no. Amazon S3 puede entonces crear la firma correspondiente para su verificación.  
En ambos casos, dado que el valor del encabezado `x-amz-content-sha256` ya forma parte de `HashedPayload`, no es necesario que incluya el encabezado `x-amz-content-sha256` como canónico.

## Cálculo de una firma
<a name="create-signature-presign-entire-payload"></a>

A fin de calcular una firma, primero necesita una cadena para firmar. Luego, se calcula un hash `HMAC-SHA256` de la cadena que se va a firmar mediante una clave de firma. En el siguiente diagrama, se ilustra el proceso, incluidos los distintos componentes de la cadena que se crea para la firma 

Cuando Amazon S3 recibe una solicitud autenticada, calcula la firma y luego la compara con la firma proporcionada en la solicitud. Por este motivo, se debe calcular la firma utilizando el mismo método que use Amazon S3. El proceso de poner una solicitud en una forma acordada para la firma se llama canonicalización.

 

![Diagrama de proceso de firma AWS4-HMAC-SHA256 que muestra los pasos de solicitud canónica, StringToSign y firma.](https://docs.aws.amazon.com/es_es/AmazonS3/latest/developerguide/images/sigV4-using-auth-header.png)


En la siguiente tabla, se describen las funciones que se muestran en el diagrama. Debe implementar código para estas funciones.


| Función | Descripción | 
| --- | --- | 
| Lowercase() | Convierta la cadena de caracteres en minúsculas. | 
| Hex() | Codificación en minúsculas en base 16. | 
| SHA256Hash() | Función de hash criptográfico del algoritmo de hash seguro (SHA). | 
| HMAC-SHA256() | Calcula el HMAC mediante el algoritmo SHA256 con la clave de firma proporcionada. Esta es la firma final. | 
| Trim() | Elimine cualquier espacio en blanco inicial o final.  | 
| UriEncode() | El URI codifica cada byte. UriEncode() debe aplicar las siguientes reglas:+  El URI codifica todos los bytes excepto los caracteres no reservados: “A”-“Z”, “a”-“z”, “0”-“9”, “-”, “.”, “\_” y “\~”.  <br />+ El carácter de espacio es un carácter reservado y debe codificarse como “%20” (y no como “\+”). <br />+ Cada byte codificado en URI se encuentra formado por un “%” y el valor hexadecimal de dos dígitos del byte. <br />+ Las letras del valor hexadecimal deben estar en mayúsculas, por ejemplo, “%1A”. <br />+ Codifique el carácter de barra diagonal, “/”, en todas partes excepto en el nombre de la clave del objeto. Por ejemplo, si el nombre de la clave del objeto es `photos/Jan/sample.jpg`, la barra diagonal del nombre de la clave no se encuentra codificada.  Es posible que las funciones estándar de UriEncode que proporciona su plataforma de desarrollo no funcionen debido a las diferencias en la implementación y a la ambigüedad relacionada en las RFC subyacentes. Le recomendamos que escriba su propia función UriEncode personalizada para asegurarse de que la codificación funcione. <br />A continuación, se muestra una función UriEncode() de ejemplo en Java.<pre>public static String UriEncode(CharSequence input, boolean encodeSlash) {<br />          StringBuilder result = new StringBuilder();<br />          for (int i = 0; i < input.length(); i++) {<br />              char ch = input.charAt(i);<br />              if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {<br />                  result.append(ch);<br />              } else if (ch == '/') {<br />                  result.append(encodeSlash ? "%2F" : ch);<br />              } else {<br />                  result.append(toHexUTF8(ch));<br />              }<br />          }<br />          return result.toString();<br />      }</pre> | 

### Tarea 1: Crear una solicitud canónica
<a name="canonical-request"></a>

En esta sección, se proporciona información general sobre la creación de una solicitud canónica. 

A continuación, se muestra el formato de solicitud canónica que Amazon S3 utiliza para calcular una firma. Para que las firmas coincidan, debe crear una solicitud canónica en este formato: 

 

```
{{<HTTPMethod>}}\n
{{<CanonicalURI>}}\n
{{<CanonicalQueryString>}}\n
{{<CanonicalHeaders>}}\n
{{<SignedHeaders>}}\n
{{<HashedPayload>}}
```

Donde:

 
+ {{HTTPMethod}} es uno de los métodos HTTP, por ejemplo GET, PUT, HEAD y DELETE.
+ {{CanonicalURI}} es la versión codificada del URI del componente de ruta absoluta del URI, todo lo que comienza con la “/” que sigue al nombre de dominio y continúa hasta el final de la cadena o del signo de interrogación (“?”) si tiene parámetros de cadena de consulta. El URI del siguiente ejemplo, `/examplebucket/myphoto.jpg`, es la ruta absoluta y no se codifica la “/” en la ruta absoluta:

   

  ```
  http://s3.amazonaws.com/examplebucket/myphoto.jpg
  ```

   
**nota**  
No se normalizan las rutas de URI para las solicitudes a Amazon S3. Por ejemplo, puede tener un bucket con un objeto denominado “my-object//example//photo.user”. Al normalizar la ruta, el nombre del objeto de la solicitud pasa a ser “my-object/example/photo.user”. Esta es una ruta incorrecta para ese objeto.
+ {{CanonicalQueryString}} especifica los parámetros de la cadena de consulta codificados en URI. Codifique en URI el nombre y los valores de forma individual. También debe ordenar los parámetros de la cadena de consulta canónica alfabéticamente por nombre de clave. La clasificación se produce después de la codificación. La cadena de consulta del siguiente ejemplo de URI es `prefix=somePrefix&marker=someMarker&max-keys=20`:

   

  ```
  http://s3.amazonaws.com/examplebucket?prefix=somePrefix&marker=someMarker&max-keys=20
  ```

  La cadena de consulta canónica es la siguiente (se agregan saltos de línea a este ejemplo para facilitar la lectura):

   

  ```
  UriEncode("marker")+"="+UriEncode("someMarker")+"&"+
  UriEncode("max-keys")+"="+UriEncode("20") + "&" +
  UriEncode("prefix")+"="+UriEncode("somePrefix")
  ```

  Cuando una solicitud se dirige a un subrecurso, el valor del parámetro de consulta correspondiente será una cadena vacía (“”). Por ejemplo, el siguiente URI identifica el subrecurso `ACL` en el bucket `examplebucket`:

   

  ```
  http://s3.amazonaws.com/examplebucket?acl 
  ```

  En este caso, la cadena CanonicalQueryString es la siguiente:

   

  ```
  UriEncode("acl") + "=" + ""
  ```

  Si el URI no incluye un “?”, no hay ninguna cadena de consulta en la solicitud y establece la cadena de consulta canónica en una cadena vacía (“”). Aún tendrá que incluir “\\n”.
+ {{CanonicalHeaders}} es una lista de los encabezados de las solicitudes con sus valores. Los pares individuales de nombre y valor del encabezado se encuentran separados por el carácter de nueva línea (“\\n”). Los nombres de los encabezados deben estar en minúsculas. Debe ordenar alfabéticamente los nombres de encabezado para crear la cadena, como se muestra en el siguiente ejemplo:

   

  ```
  Lowercase({{<HeaderName1>}})+":"+Trim({{<value>}})+"\n"
  Lowercase({{<HeaderName2>}})+":"+Trim({{<value>}})+"\n"
  ...
  Lowercase({{<HeaderNameN>}})+":"+Trim({{<value>}})+"\n"
  ```

  Las funciones `Lowercase()` y `Trim()` que se utilizan en este ejemplo se describen en la sección anterior. 

  La lista {{CanonicalHeaders}} debe incluir lo siguiente: 
  + Encabezado de `host` HTTP.
  + Si el encabezado `Content-MD5` se encuentra en la solicitud, debe agregarlo a la lista {{CanonicalHeaders}}. 
  + También debe agregar cualquier encabezado `x-amz-*` que planea incluir en su solicitud. Por ejemplo, si utiliza credenciales de seguridad temporales, debe incluir `x-amz-security-token` en su solicitud. Debe agregar este encabezado a la lista de {{CanonicalHeaders}}.
**nota**  
El encabezado `x-amz-content-sha256` es obligatorio para todas las solicitudes de Signature Version 4 de AWS. Proporciona un hash de la carga de solicitud. Sin embargo, no es necesario que incluya `x-amz-content-sha256` como encabezado canónico porque S3 utilizará automáticamente su valor al calcular el hash de carga útil enviado en la solicitud.
Si no hay ninguna carga, debe proporcionar el hash de una cadena vacía. 
Si no desea que S3 compruebe el hash de la solicitud, puede usar la cadena literal `"UNSIGNED-PAYLOAD"` en su lugar.

  A continuación, se muestran cadenas de `CanonicalHeaders` de ejemplo. Los nombres de encabezado se encuentran en minúsculas y ordenados.  
**Example Ejemplo 1**  

  ```
  host:s3.amazonaws.com
  x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  x-amz-date:20130708T220855Z
  ```  
**Example Ejemplo 2**  

  ```
  host:s3.amazonaws.com
  x-amz-content-sha256:UNSIGNED-PAYLOAD
  x-amz-date:20130708T220855Z
  ```  
**Example Ejemplo 3**  

  ```
  host:s3.amazonaws.com
  x-amz-date:20130708T220855Z
  ```
**nota**  
Para calcular una firma de autorización, se requieren el encabezado del host y todos los encabezados `x-amz-*`, excepto `x-amz-content-sha256`. Sin embargo, a fin de evitar la manipulación de datos, debería considerar la posibilidad de incluir todos los encabezados en el cálculo de la firma.  
Firmar el encabezado `x-amz-content-sha256` es opcional porque S3 usará su valor al calcular el hash de carga útil de la solicitud recibida. 
+ {{SignedHeaders}} es una lista ordenada alfabéticamente y separada por punto y coma de nombres de encabezados de solicitudes en minúsculas. Los encabezados de las solicitudes de la lista son los mismos que incluyó en la cadena de `CanonicalHeaders`. En los ejemplos anteriores, el valor de {{SignedHeaders}} sería el siguiente:

    
**Example Ejemplos 1 y 2**  

  ```
  host;x-amz-content-sha256;x-amz-date
  ```  
**Example Ejemplo 3**  

  ```
  host;x-amz-date
  ```
+ {{HashedPayload}} es el valor hexadecimal del hash SHA256 de la carga útil de la solicitud. 

   

  ```
  Hex(SHA256Hash({{<payload>}})
  ```

  Si no hay ninguna carga en la solicitud, se calcula un hash de la cadena vacía de la siguiente manera:

   

  ```
  Hex(SHA256Hash(""))
  ```

  El hash devuelve los siguientes valores:

   

  ```
  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  
  ```

  Por ejemplo, cuando carga un objeto mediante una solicitud PUT, proporciona los datos del objeto en el cuerpo. Al recuperar un objeto mediante una solicitud GET, se calcula el hash de la cadena vacía. 

### Tarea 2: Crear una cadena para firmar
<a name="request-string"></a>

En esta sección, se proporciona información general sobre la creación de una cadena para firmar. Para obtener instrucciones paso a paso, consulte [Tarea 2: Crear una cadena para firmar](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html) en *Referencia general de AWS*.

La cadena para firmar es una concatenación de las cadenas siguientes:

 

```
"AWS4-HMAC-SHA256" + "\n" +
timeStampISO8601Format + "\n" +
{{<Scope>}} + "\n" +
Hex(SHA256Hash({{<CanonicalRequest>}}))
```

La cadena constante `AWS4-HMAC-SHA256` especifica el algoritmo hash que está utilizando, HMAC-SHA256. `timeStamp` es la hora UTC actual en formato ISO 8601 (por ejemplo, `20130524T000000Z`). 

`Scope` vincula la firma resultante a una fecha, una Región de AWS y un servicio específicos. Por lo tanto, la firma resultante solo funcionará en la región específica y para un servicio específico. La firma es válida durante siete días a partir de la fecha especificada.

 

```
date.Format({{<YYYYMMDD>}}) + "/" + {{<region>}} + "/" + {{<service>}} + "/aws4_request"
```

 Para Amazon S3, la cadena del servicio es `s3`. Para obtener una lista de cadenas de {{regiones}}, consulte [Regiones y puntos de conexión](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) en *Referencia general de AWS*. La columna Región de esta tabla proporciona la lista de cadenas de región válidas.

 El siguiente alcance restringe la firma resultante a la región `us-east-1` y Amazon S3. 

```
20130606/us-east-1/s3/aws4_request
```

 

**nota**  
 `Scope` debe utilizar la misma fecha que utiliza para calcular la clave de firma, tal y como se explica en la siguiente sección. 

### Tarea 3: Cálculo de la firma
<a name="signing-key"></a>

 En AWS Signature Version 4, en lugar de utilizar las claves de acceso de AWS para firmar una solicitud, se crea primero una clave de firma que se limita a una región y un servicio específicos.  Para obtener más información sobre cómo firmar claves, consulte [Introducción a la firma de solicitudes](sig-v4-authenticating-requests.md#signing-request-intro). 

 

```
DateKey              = HMAC-SHA256("AWS4"+"{{<SecretAccessKey>}}", "{{<YYYYMMDD>}}")
DateRegionKey        = HMAC-SHA256({{<DateKey>}}, "{{<aws-region>}}")
DateRegionServiceKey = HMAC-SHA256({{<DateRegionKey>}}, "{{<aws-service>}}")
SigningKey           = HMAC-SHA256({{<DateRegionServiceKey>}}, "aws4_request")
```

 

**nota**  
Algunos casos de uso pueden procesar claves de firma durante un máximo de 7 días. Para obtener más información, consulte [Compartir un objeto con otros](https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html).

Para obtener una lista de cadenas de regiones, consulte [Regiones y puntos de conexión](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) en *Referencia general de AWS*.

 El uso de una clave de firma permite guardar las credenciales de AWS en un lugar seguro. Por ejemplo, si tiene varios servidores que se comunican con Amazon S3, comparte la clave de firma con esos servidores; no tiene que guardar una copia de la clave de acceso secreta en cada servidor. La clave de firma es válida durante un máximo de siete días. Por lo tanto, cada vez que calcule la clave de firma, tendrá que compartirla con los servidores. Para obtener más información, consulte [Autenticación de solicitudes (AWS Signature Version 4)](sig-v4-authenticating-requests.md).

La firma final es el hash HMAC-SHA256 de la cadena a firmar, mediante la clave de firma como clave.

 

```
HMAC-SHA256(SigningKey, StringToSign)
```

Para obtener instrucciones paso a paso sobre cómo crear una firma, consulte [Tarea 3: Crear una firma](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html) en *Referencia general de AWS*.

### Ejemplos: cálculos de firma
<a name="example-signature-calculations"></a>

Puede utilizar los ejemplos en esta sección como referencia para comprobar los cálculos de firma en el código. Los cálculos que se muestran en los ejemplos utilizan los siguientes datos:

 
+  Ejemplo de claves de acceso.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/AmazonS3/latest/developerguide/sig-v4-header-based-auth.html)
+ Marca temporal de solicitud de 20130524T000000Z (`Fri, 24 May 2013 00:00:00 GMT`).
+ Nombre del bucket: `examplebucket`.
+ Se supone que el bucket está en la región Este de EE. UU. (Norte de Virginia). La credencial `Scope` y los cálculos de `Signing Key` utilizan `us-east-1` como especificador de región. Para obtener información sobre otras regiones, consulte [Regiones y puntos de conexión](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) en *Referencia general de AWS*. 
+ Puede utilizar solicitudes de tipo ruta o de alojamiento virtual. Los ejemplos siguientes muestran cómo firmar una solicitud de tipo de alojamiento virtual, por ejemplo:

   

  ```
  https://examplebucket.s3.amazonaws.com/photos/photo1.jpg
  ```

  Para obtener más información, consulte [Alojamiento virtual de buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html) en la *Guía del usuario de Amazon Simple Storage Service*.

#### Ejemplo: objeto GET
<a name="example-signature-GET-object"></a>

El ejemplo siguiente obtiene los primeros 10 bytes de un objeto (test.txt) de `examplebucket`. Para obtener más información sobre la acción de la API, consulte [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html).

 

```
GET /test.txt HTTP/1.1
Host: examplebucket.s3.amazonaws.com
Authorization: {{SignatureToBeCalculated}}
Range: bytes=0-9 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date: 20130524T000000Z
```

Como esta solicitud GET no proporciona ningún contenido en el cuerpo, el valor `x-amz-content-sha256` puede ser el hash del cuerpo vacío de la solicitud o la cadena literal `"UNSIGNED-PAYLOAD"`. Los pasos siguientes muestran los cálculos de firma y la construcción del encabezado `Authorization` mediante el hash de una cadena vacía. 

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      GET
      /test.txt
      
      host:examplebucket.s3.amazonaws.com
      range:bytes=0-9
      x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      x-amz-date:20130524T000000Z
      
      host;range;x-amz-content-sha256;x-amz-date
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      ```

      En la cadena de solicitud canónica, la última línea es el hash del cuerpo de la solicitud vacío. La tercera línea se encuentra vacía porque no hay parámetros de consulta en la solicitud. 

   1. 

**StringToSign**

       

      ```
      AWS4-HMAC-SHA256
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      7344ae5b7ee6c3e7e6b0fe0640412a37625d1fbfff95c48bbb2dc43964946972
      ```

       

1. 

**SigningKey**

    

   ```
   signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "{{<YourSecretAccessKey>}}","20130524"),"us-east-1"),"s3"),"aws4_request")
   ```

    

1. 

**Signature**

    

   ```
   f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41
   ```

    

1. 

**Encabezado Authorization**

   El encabezado de `Authorization` resultante es el siguiente: 

    

   ```
   AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;range;x-amz-content-sha256;x-amz-date,Signature=f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41
   ```

    

#### Ejemplo: objeto PUT
<a name="example-signature-PUT-object"></a>

En este ejemplo de solicitud PUT se crea un objeto (`test$file.text`) en `examplebucket`. El ejemplo supone lo siguiente:

 
+ Para solicitar `REDUCED_REDUNDANCY` como clase de almacenamiento, agregue el encabezado de solicitud `x-amz-storage-class`. Para obtener información sobre las clases de almacenamiento, consulte [Clases de almacenamiento](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html#storage-class-intro) en la *Guía del usuario de Amazon Simple Storage Service*.
+ El contenido del archivo cargado es una cadena, `"Welcome to Amazon S3."` El valor de `x-amz-content-sha256` en la solicitud se basa en esta cadena.

Para obtener información acerca de la acción de la API, consulte [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html). 

```
PUT test$file.text HTTP/1.1
Host: examplebucket.s3.amazonaws.com
Date: Fri, 24 May 2013 00:00:00 GMT
Authorization: {{SignatureToBeCalculated}}
x-amz-date: 20130524T000000Z 
x-amz-storage-class: REDUCED_REDUNDANCY
x-amz-content-sha256: 44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072

{{<Payload>}}
```



Los pasos siguientes muestran cálculos de firma.

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      PUT
      /test%24file.text
      
      date:Fri, 24 May 2013 00:00:00 GMT
      host:examplebucket.s3.amazonaws.com
      x-amz-content-sha256:44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072
      x-amz-date:20130524T000000Z
      x-amz-storage-class:REDUCED_REDUNDANCY
      
      date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class
      44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072
      ```

      En la solicitud canónica, la tercera línea se encuentra vacía porque no hay parámetros de consulta en la solicitud. El encabezado canónico `x-amz-content-sha256` puede firmarse opcionalmente, ya que su hash de carga útil ya está incluido en la parte inferior de la solicitud. La última línea es el hash del cuerpo, que debe ser igual al valor `x-amz-content-sha256 header` enviado a S3 en la solicitud HTTP.

   1. 

**StringToSign**

       

      ```
      AWS4-HMAC-SHA256
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      9e0e90d9c76de8fa5b200d8c849cd5b8dc7a3be3951ddb7f6a76b4158342019d
      ```

       

1. 

**SigningKey**

    

   ```
   signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "{{<YourSecretAccessKey>}}","20130524"),"us-east-1"),"s3"),"aws4_request")
   ```

    

1. 

**Signature**

    

   ```
   98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd
   ```

    

1. 

**Encabezado Authorization**

   El encabezado de `Authorization` resultante es el siguiente:

    

   ```
   AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class,Signature=98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd
   ```

    

#### Ejemplo: ciclo de vida de bucket GET
<a name="example-signature-GET-bucket-lifecycle"></a>

La solicitud GET siguiente recupera la configuración del ciclo de vida de `examplebucket`. Para obtener información sobre la acción de la API, consulte [GetBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html). 

```
GET ?lifecycle HTTP/1.1
Host: examplebucket.s3.amazonaws.com
Authorization: {{SignatureToBeCalculated}}
x-amz-date: 20130524T000000Z 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
```

Como la solicitud no proporciona ningún contenido en el cuerpo, el valor del encabezado `x-amz-content-sha256` es el hash del cuerpo vacío de la solicitud. Los pasos siguientes muestran cálculos de firma.

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      GET
      /
      lifecycle=
      host:examplebucket.s3.amazonaws.com
      x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      x-amz-date:20130524T000000Z
      
      host;x-amz-content-sha256;x-amz-date
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      ```

      En la solicitud canónica, la última línea es el hash del cuerpo de la solicitud vacío. 

   1. 

**StringToSign**

       

      ```
      AWS4-HMAC-SHA256
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      9766c798316ff2757b517bc739a67f6213b4ab36dd5da2f94eaebf79c77395ca
      ```

       

1. 

**SigningKey**

    

   ```
   signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "{{<YourSecretAccessKey>}}","20130524"),"us-east-1"),"s3"),"aws4_request")
   ```

    

1. 

**Signature**

    

   ```
   fea454ca298b7da1c68078a5d1bdbfbbe0d65c699e0f91ac7a200a0136783543
   ```

    

1. 

**Encabezado Authorization**

   El encabezado de `Authorization` resultante es el siguiente: 

    

   ```
   AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=fea454ca298b7da1c68078a5d1bdbfbbe0d65c699e0f91ac7a200a0136783543
   ```

    

#### Ejemplo: obtener Bucket (Mostrar objetos)
<a name="example-signature-list-bucket"></a>

En el ejemplo siguiente, se recupera una lista de objetos del bucket `examplebucket`. Para obtener información acerca de la acción de la API, consulte [ListObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html). 

```
GET ?max-keys=2&prefix=J HTTP/1.1
Host: examplebucket.s3.amazonaws.com
Authorization: {{SignatureToBeCalculated}}
x-amz-date: 20130524T000000Z 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
```

Como la solicitud no proporciona un cuerpo, el valor de `x-amz-content-sha256` es el hash del cuerpo vacío de la solicitud. Los pasos siguientes muestran cálculos de firma.

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      GET
      /
      max-keys=2&prefix=J
      host:examplebucket.s3.amazonaws.com
      x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      x-amz-date:20130524T000000Z
      
      host;x-amz-content-sha256;x-amz-date
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      ```

      En la cadena canónica, la última línea es el hash del cuerpo de la solicitud vacío. 

   1. 

**StringToSign**

       

      ```
      AWS4-HMAC-SHA256
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      df57d21db20da04d7fa30298dd4488ba3a2b47ca3a489c74750e0f1e7df1b9b7
      ```

       

1. 

**SigningKey**

    

   ```
   signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "{{<YourSecretAccessKey>}}","20130524"),"us-east-1"),"s3"),"aws4_request")
   ```

    

1. 

**Signature**

    

   ```
   34b48302e7b5fa45bde8084f4b7868a86f0a534bc59db6670ed5711ef69dc6f7
   ```

    

1. 

**Encabezado Authorization**

   El encabezado de `Authorization` resultante es el siguiente: 

    

   ```
   AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=34b48302e7b5fa45bde8084f4b7868a86f0a534bc59db6670ed5711ef69dc6f7
   ```

    