Solicitações de assinatura - Amazon S3 Glacier

Se você é novato no Amazon Simple Storage Service (Amazon S3), recomendamos que comece aprendendo mais sobre as classes de armazenamento S3 Glacier no Amazon S3, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval e S3 Glacier Deep Archive. Para obter mais informações, consulte Classes de armazenamento S3 Glacier e Classes de armazenamento para arquivamento de objetos no Guia do usuário do Amazon S3.

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Solicitações de assinatura

No S3 Glacier toda solicitação enviada é autenticada com uma assinatura. Para assinar uma solicitação, calcule uma assinatura digital usando a função de hash criptográfico. Hash criptográfico é uma função que retorna um valor de hash exclusivo com base na entrada. A entrada da função de hash inclui o texto da solicitação e a chave de acesso secreta. A função de hash retorna um valor de hash que você inclui na solicitação como sua assinatura. A assinatura é parte do cabeçalho Authorization de sua solicitação.

Depois de receber a solicitação, o S3 Glacier recalculará a assinatura usando a mesma função de hash e a entrada que você usou para assinar a solicitação. Quando a assinatura resultante corresponde à assinatura na solicitação, o S3 Glacier processa a solicitação. Do contrário, a solicitação é rejeitada.

O S3 Glacier oferece suporte à autenticação usando o AWSSignature versão 4 da . O processo para calcular uma assinatura pode ser dividido em três tarefas:

  • Tarefa 1: Criar uma solicitação canônica

    Reorganize sua solicitação HTTP em um formato canônico. É necessário usar uma forma canônica, pois o S3 Glacier usa a mesma forma canônica quando recalcula uma assinatura para comparar com a que você enviou.

  • Tarefa 2: Criar uma string para assinar

    Crie uma string que será usada como um dos valores de entrada para sua função hash criptográfica. A string, chamada string-to-sign, é uma concatenação do nome do algoritmo hash, da data da solicitação, de uma string do escopo da credencial e da solicitação canonizada da tarefa anterior. A string do escopo credencial em si é uma concatenação da data, da região AWS e de informações do serviço.

  • Tarefa 3: Criar uma assinatura

    Crie uma assinatura para sua solicitação usando uma função hash criptográfica que aceita duas strings de entrada: sua string para assinar e uma chave derivada. Para calcular a chave derivada, inicie sua chave de acesso secreta e use a string do escopo credencial para criar uma série de códigos de autenticação de mensagem baseados em hash (HMACs). A função de hash usada nesta etapa de assinatura não é o algoritmo de tree-hash usado em APIs do que fazem upload de dados.

Cálculo de assinatura de exemplo

O exemplo a seguir mostra os detalhes da criação de uma assinatura para Create Vault (PUT vault). Esse exemplo pode ser usado como referência para verificar o método de cálculo da assinatura. Para obter mais informações, consulte Assinar solicitações de API da AWS no Guia do usuário do IAM.

O exemplo supõe o seguinte:

  • O timestamp da solicitação é Fri, 25 May 2012 00:24:53 GMT.

  • O endpoint é a região Leste dos EUA (Norte da Virgínia) us-east-1.

A sintaxe de solicitação geral (incluindo o corpo JSON) é:

PUT /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Fri, 25 May 2012 00:24:53 GMT Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

O formato canônico da solicitação calculada para Tarefa 1: Crie uma solicitação canônica é:

PUT /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-date:20120525T002453Z x-amz-glacier-version:2012-06-01 host;x-amz-date;x-amz-glacier-version e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

A última linha da solicitação canônica é o hash do corpo da solicitação. Além disso, observe a terceira linha vazia na solicitação canônica. Isso porque não há parâmetros de consulta para essa API.

A string para assinar para a Tarefa 2: Criar uma string para assinar é:

AWS4-HMAC-SHA256 20120525T002453Z 20120525/us-east-1/glacier/aws4_request 5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743

A primeira linha da string-to-sign é o algoritmo, a segunda linha é a time stamp, a terceira linha é o escopo da credencial e a última linha é o hash da solicitação canônica da Tarefa 1: Crie uma solicitação canônica. O nome do serviço a usar no escopo da credencial é glacier.

Para a Tarefa 3: Criar uma assinatura, a chave derivada pode ser representada como:

derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20120525"),"us-east-1"),"glacier"),"aws4_request")

Se a chave de acesso secreta, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY, for usada, a assinatura calculada será:

3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

A etapa final é construir o cabeçalho Authorization. Para a chave de acesso de demonstração AKIAIOSFODNN7EXAMPLE, o cabeçalho (com quebras de linha adicionadas por motivo de legibilidade) é:

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120525/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-date;x-amz-glacier-version, Signature=3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

Calcular assinaturas para as operações de streaming

Upload Archive (POST archive) e Upload Part (PUT uploadID) são operações de streaming que exigem que você inclua um cabeçalho adicional x-amz-content-sha256 ao assinar e enviar a solicitação. As etapas de assinatura das operações de streaming são exatamente as mesmas de outras operações, com a adição do cabeçalho de streaming.

O cálculo do cabeçalho de streaming x-amz-content-sha256 se baseia no hash SHA256 de todo o conteúdo (carga útil) cujo upload deve ser feito. Esse cálculo é diferente do hash de árvore SHA256 (Computar somas de verificação). Além de casos triviais, o valor de hash SHA 256 dos dados da carga útil será diferente do hash de árvore SHA256 dos dados da carga útil.

Se os dados da carga útil forem especificados como uma matriz de bytes, você poderá usar o trecho de código do Java a seguir para calcular o hash SHA256.

public static byte[] computePayloadSHA256Hash2(byte[] payload) throws NoSuchAlgorithmException, IOException { BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(payload)); MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] buffer = new byte[4096]; int bytesRead = -1; while ( (bytesRead = bis.read(buffer, 0, buffer.length)) != -1 ) { messageDigest.update(buffer, 0, bytesRead); } return messageDigest.digest(); }

Da mesma maneira, no C#, você pode calcular o hash SHA256 dos dados da carga útil, conforme mostrado no trecho de código a seguir.

public static byte[] CalculateSHA256Hash(byte[] payload) { SHA256 sha256 = System.Security.Cryptography.SHA256.Create(); byte[] hash = sha256.ComputeHash(payload); return hash; }

Cálculo da assinatura de exemplo para Streaming API

O exemplo a seguir apresenta os detalhes de como criar uma assinatura para Upload Archive (POST archive), uma das duas APIs de streaming no S3 Glacier. O exemplo supõe o seguinte:

  • O timestamp da solicitação é Mon, 07 May 2012 00:00:00 GMT.

  • O endpoint é a região Leste dos EUA (Norte da Virgínia), eu-east-1.

  • O conteúdo da carga útil é uma string "Bem-vindo ao S3 Glacier."

A sintaxe da solicitação geral (inclusive o corpo JSON) é mostrada no exemplo abaixo. O cabeçalho x-amz-content-sha256 está incluído. Neste exemplo simplificado, x-amz-sha256-tree-hash e x-amz-content-sha256 têm o mesmo valor. No entanto, para uploads de arquivos maiores que 1 MB, este não é o caso.

POST /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Mon, 07 May 2012 00:00:00 GMT x-amz-archive-description: my archive x-amz-sha256-tree-hash: SHA256 tree hash x-amz-content-sha256: SHA256 payload hash Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

A forma canônica da solicitação calculada para Tarefa 1: Criar uma solicitação canônica é mostrada abaixo. O cabeçalho de streaming x-amz-content-sha256 é incluído com o valor. Isso significa que você deve ler a carga útil e calcular o hash SHA256 primeiro e, em seguida, computar a assinatura.

POST /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-content-sha256:726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628 x-amz-date:20120507T000000Z x-amz-glacier-version:2012-06-01 host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version 726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628

O restante do cálculo da assinatura segue as etapas descritas em Cálculo de assinatura de exemplo. O cabeçalho Authorization que usa a chave de acesso secreta wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY e a chave de acesso AKIAIOSFODNN7EXAMPLE é mostrado abaixo (com quebras de linha adicionadas para fins de legibilidade):

Authorization=AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120507/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version, Signature=b092397439375d59119072764a1e9a144677c43d9906fd98a5742c57a2855de6