# DomainKeys Identified Mail

DKIM (DomainKeys Identified Mail) est une norme d'authentification fiable du nom de domaine de l'expéditeur d'un courrier électronique. Elle constitue une protection efficace contre le spam et l'hameçonnage.
En effet, DKIM fonctionne par signature cryptographique du corps du message ou d'une partie de celui-ci et d'une partie de ses en-têtes. Une signature DKIM vérifie donc l'authenticité du domaine expéditeur et garantit l'intégrité du message. DKIM intervient au niveau de la couche application du modèle OSI, ainsi il constitue une double protection pour des protocoles de messagerie électronique tels que SMTP, IMAP et POP en plus de l'utilisation de ces protocoles en mode sécurisé (POPS, IMAPS).
Cette technologie a été normalisée par l'IETF dans la RFC 4871 remplacée depuis par la RFC 6376.

## Historique

DKIM est le résultat d'un projet d'un consortium industriel en 2004, intégrant et améliorant le système DomainKeys, de la société Yahoo! (standard DomainKeys qui a par ailleurs été défini ultérieurement - en 2007 - dans la spécification historique RFC 4870), et Identified Internet Mail, de Cisco.
La spécification résultante est utilisée en production. Tous les courriels émanant de Yahoo, GMail, AOL et FastMail contiennent en principe une signature DKIM.
Il a également été pris en compte par le groupe de travail de l'IETF pour affinage et standardisation, ce qui a abouti à la RFC 6376.

## Principe

Il s'agit d'ajouter dans tous les emails sortants, une signature DKIM contenant une liste de "clé=valeur". Les clés sont courtes, généralement une ou deux lettres.
Les paramètres par défaut du mécanisme de facteur d'authentification sont d'utiliser SHA-256 comme fonction de hachage cryptographique, le chiffrement RSA pour la cryptographie asymétrique, et de coder le hachage avec Base64.
Un serveur SMTP réceptionnant un email signé utilise ensuite l'identifiant de domaine responsable de la signature (SDID) et le sélecteur associé annoncés dans les en-têtes afin de récupérer la clé publique publiée dans le serveur DNS du SDID. Cette clé est utilisée pour vérifier la validité des signatures.
Exemple de signature jointe en en-tête d'un mail :
Les paramètres sont décrits dans la RFC 6376. Les plus pertinents sont :
* b pour les véritables signatures numériques des contenus (en-têtes et corps de mail) ;
* bh pour le hachage du corps ;
* d pour l'identifiant de domaine responsable de la signature (SDID) ;
* s pour le sélecteur.
Puis on trouve :
* v pour la version ;
* a pour l'algorithme de signature ;
* c pour l'algorithme de canonicalisation d'en-tête et corps ;
* q pour une liste de méthodes de requêtes utilisées afin de récupérer la clé publique de signature ;
* l pour la taille de la partie du corps signé à la forme canonique ;
* t pour l'horodatage de la signature ;
* x pour la durée d'expiration ;
* h pour la liste des champs d'en-tête signés, éventuellement répétés pour ceux qui apparaissent plusieurs fois (ex keywords ci-dessus). Il est à noter que le champ d'en-tête de la signature DKIM est lui-même toujours inclus implicitement dans h, avec la valeur du champ b, traité comme s'il était vide.
Un vérificateur teste l'enregistrement DNS TXT de brisbane._domainkey.example.com. Il n'y a ni autorité de certification, ni système de liste noire. Le sélecteur est une méthode directe pour autoriser un signataire à ajouter ou retirer des clés quand il le souhaite, sans archivage des signatures. Les données renvoyées par ce test sont également structurées en paires clé-valeur. Cela inclut la clé publique du domaine, ainsi que des tokens et flags. Le destinataire peut utiliser cela pour déchiffrer la valeur de hachage du champ en-tête et simultanément recalculer la valeur du hachage du mail reçu (en-tête et corps). Si les deux valeurs correspondent, cela prouve cryptographiquement que le mail a été signé par le domaine indiqué, et n'a pas été altéré pendant le transit.
L'échec de vérification de la signature n'impose pas de rejet systématique du message. En effet, ces raisons précises peuvent être rendues disponibles dans des processus en amont et en aval. Ces méthodes peuvent inclure un message FBL (en), ou ajouter des champs résultats d'authentification au message, comme décrit dans la RFC 7001. La politique de rejet d'un email dont la signature DKIM ne serait pas vérifiée peut être publiée dans une entrée DNS de type TXT DMARC (_dmarc.example.com).

## Utilisation

Microsoft Exchange utilise automatiquement la vérification DKIM pour tous les messages IPv6.

## Faiblesses

* détails - en langue anglaise - sur les faiblesses intrinsèques de DKIM
Le système DKIM ne gère pas l'ajout d'annotations par un serveur de liste de diffusion, l'ajout d'une signature tierce cassant le code de la signature DKIM. Une option l dans l'entête DKIM-Signature header peut permettre de ne signer qu'un nombre donné d'octets du message initial. Tout ajout de texte au-delà de la longueur ainsi spécifiée n'est alors pas pris en compte lors du calcul de la signature DKIM, mais cette solution ne fonctionne pas pour les messages au format MIME.
L'utilisation complémentaire d'un système Sender Policy Framework (SPF) est envisageable, permettant ainsi de vérifier une liste blanche d'expéditeurs désirés (white list de domaines d'expéditeurs reconnus).