Détails du chiffrement authentifié dans ASP.NET Core
Les appels à IDataProtector.Protect sont des opérations de chiffrement authentifiées. La méthode Protect offre à la fois la confidentialité et l’authenticité, et elle est liée à la chaîne d’objectif qui a été utilisée pour dériver cette instance IDataProtector de sa racine IDataProtectionProvider.
IDataProtector.Protect prend un paramètre de texte en clair d’octet[] et produit une charge utile protégée par octet[], dont le format est décrit ci-dessous. (Il existe également une surcharge de méthode d’extension qui prend un paramètre de texte en clair de chaîne et renvoie une charge utile protégée par chaîne. Si cette API est utilisée, le format de charge utile protégée aura toujours la structure ci-dessous, mais il sera encodé en base64url.)
Format de charge utile protégée
Le format de charge utile protégée se compose de trois composants principaux :
Un en-tête magique 32 bits qui identifie la version du système de protection des données.
Un ID de clé 128 bits qui identifie la clé utilisée pour protéger cette charge utile particulière.
Le reste de la charge utile protégée est spécifique au chiffreur encapsulé par cette clé. Dans l’exemple ci-dessous, la clé représente un chiffreur AES-256-CBC + HMACSHA256, et la charge utile est subdivisée comme suit :
- Un modificateur de clé 128 bits.
- Un vecteur d’initialisation 128 bits.
- 48 octets de sortie AES-256-CBC.
- Une balise d’authentification HMACSHA256.
Un exemple de charge utile protégée est illustré ci-dessous.
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
Dans le format de charge utile ci-dessus, les 32 premiers bits, ou 4 octets, sont l’en-tête magique identifiant la version (09 F0 C9 F0)
Les 128 bits suivants, ou 16 octets, sont l’identificateur de clé (80 9C 81 0C 19 66 19 40 95 36 53 F8 AA FF EE 57)
Le reste contient la charge utile et est spécifique au format utilisé.
Avertissement
Toutes les charges utiles protégées sur une clé donnée commencent par le même en-tête de 20 octets (valeur magique, ID de clé). Les administrateurs peuvent utiliser ce fait à des fins de diagnostic pour estimer le moment où une charge utile a été générée. Par exemple, la charge utile ci-dessus correspond à la clé {aaaaaaaa-0b0b-1c1c-2d2d-33333333333333}. Si, après avoir vérifié le référentiel de clés, vous constatez que la date d’activation de cette clé spécifique était « 2015-01-01 » et que sa date d’expiration était « 2015-03-01 », on peut supposer que la charge utile (si elle n’est pas falsifiée) a été générée dans cette période, avec un petit facteur de décalage de part et d’autre.