Detalhes da criptografia autenticada no ASP.NET Core

As chamadas para IDataProtector.Protect são operações de criptografia autenticadas. O método Protect oferece confidencialidade e autenticidade e está vinculado à cadeia de finalidade que foi usada para derivar essa instância IDataProtector específica de seu IDataProtectionProvider raiz.

IDataProtector.Protect usa um parâmetro de texto sem formatação byte[] e produz uma carga protegida por bytes[], cujo formato é descrito abaixo. (Há também uma sobrecarga de método de extensão que usa um parâmetro de texto sem formatação de cadeia de caracteres e retorna uma carga protegida por cadeia de caracteres. Se essa API for usada, o formato de conteúdo protegido ainda terá a estrutura abaixo, mas será codificada em base64url.)

Formato de conteúdo protegido

O formato de conteúdo protegido consiste em três componentes primários:

  • Um cabeçalho mágico de 32 bits que identifica a versão do sistema de proteção de dados.

  • Uma ID de chave de 128 bits que identifica a chave usada para proteger essa carga específica.

  • O restante do conteúdo protegido é específico para o criptografador encapsulado por essa chave. No exemplo a seguir, a chave representa um criptografador AES-256-CBC + HMACSHA256 e a carga é subdividida ainda mais da seguinte maneira:

    • Um modificador de chave de 128 bits.
    • Um vetor de inicialização de 128 bits.
    • 48 bytes de saída AES-256-CBC.
    • Uma marca de autenticação HMACSHA256.

Um exemplo de carga útil protegida está ilustrado abaixo.

09 F0 C9 F0 80 9C 81 0C 19 66 19 40 95 36 53 F8
AA FF EE 57 57 2F 40 4C 3F 7F CC 9D CC D9 32 3E
84 17 99 16 EC BA 1F 4A A1 18 45 1F 2D 13 7A 28
79 6B 86 9C F8 B7 84 F9 26 31 FC B1 86 0A F1 56
61 CF 14 58 D3 51 6F CF 36 50 85 82 08 2D 3F 73
5F B0 AD 9E 1A B2 AE 13 57 90 C8 F5 7C 95 4E 6A
8A AA 06 EF 43 CA 19 62 84 7C 11 B2 C8 71 9D AA
52 19 2E 5B 4C 1E 54 F0 55 BE 88 92 12 C1 4B 5E
52 C9 74 A0

No formato de carga acima dos primeiros 32 bits, ou 4 bytes estão o cabeçalho mágico que identifica a versão (09 F0 C9 F0)

Os próximos 128 bits ou 16 bytes são o identificador de chave (80 9C 81 0C 19 66 19 40 95 36 53 F8 AA FF EE 57)

O restante contém a carga e é específico para o formato usado.

Aviso

Todas as cargas protegidas a uma determinada chave começarão com o mesmo cabeçalho de 20 bytes (valor mágico, id de chave). Os administradores podem usar esse fato para fins de diagnóstico para aproximar quando uma carga foi gerada. Por exemplo, a carga acima corresponde à chave {0c819c80-6619-4019-9536-53f8aaffee57}. Se depois de verificar o repositório de chaves, você descobrir que a data de ativação dessa chave específica foi 2015-01-01 e sua data de validade foi 03-01-2015, é razoável supor que a carga (se não for adulterada) foi gerada dentro dessa janela, dar ou tomar um pequeno fator de fudge de ambos os lados.