Les ID de clé OpenPGP courts (avec 32 bits/8 caractères hexadécimaux) sont soumis à attaques par collision . Il est fortement recommandé de arrêter d'utiliser des ID 32 bits :
Arrêtez d'utiliser les identifiants de clé 32 bits
Il faut 4 secondes pour générer un identifiant de clé 32 bits entrant en collision sur un GPU (en utilisant scallion ). Les serveurs de clés vérifient peu les clés téléchargées et autorisent les clés avec des identifiants 32 bits en collision. De plus, GPG utilise des identifiants de clé 32 bits dans toute son interface et ne vous avertit pas lorsqu'une opération peut s'appliquer à plusieurs clés.
Mais comment dire à GnuPG d'utiliser des identifiants longs (avec 64 bits ou 16 caractères hexadécimaux)?
Chaque clé OpenPGP a une empreinte digitale attachée, calculée principalement à partir de son paquet de clé publique qui contient également l'heure de création. Le calcul est défini dans RFC 4880, OpenPGP, 12.2. ID clés et empreintes digitales .
Il existe des ID de clé courts et longs, qui ressemblent aux 32 bits inférieurs respectifs de l'empreinte digitale. Par exemple, en regardant les ID de ma clé OpenPGP:
fingerprint: 0D69 E11F 12BD BA07 7B37 26AB 4E1F 799A A4FF 2279
long id: 4E1F 799A A4FF 2279
short id: A4FF 2279
Les empreintes digitales et les ID de clé sont utilisés, car le partage et la comparaison d'une clé entière avec généralement 1024 à 8096 bits (en ajoutant un peu plus pour des en-têtes comme la date de création) est très impraticable.
Chaque fois que vous spécifiez des clés OpenPGP, vous pouvez non seulement transmettre des ID de clé courts, mais également des ID de clé longs et même des empreintes digitales entières. Au lieu de passer l'ID de clé courte
gpg --recv-keys A4FF2279
vous pouvez toujours écrire l'ID de la clé longue
gpg --recv-keys 4E1F799AA4FF2279
ou même l'empreinte digitale complète (recommandé pour les scripts et à des fins similaires)
gpg --recv-keys 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
Mais d'où prendre l'ID de clé longue? Si quelqu'un a passé son court ID, vous ne pouvez rien faire d'autre que d'essayer de récupérer toutes les clés de cet ID et de voir s'il y a une collision (et espérons que personne ne vous cache la vraie clé et ne passe que la fausse).
Donc, chaque fois que vous remettez votre ID de clé OpenPGP, annoncez le long ID! Vous pouvez facilement faire imprimer GnuPG celui-ci en ajoutant le --keyid-format long
option:
gpg --keyid-format long --list-keys [email protected]
Cette option prend les valeurs short
ou 0xshort
pour les ID de clé courts (sans ou avec 0x
préfixé pour indiquer qu'il s'agit d'un nombre hexadécimal) et long
ou 0xlong
pour les ID de clé longs.
Pour vous assurer que GnuPG imprime toujours l'ID de la clé longue, ajoutez l'option à votre ~/.gnupg/gpg.conf
fichier supprimant le --
. Par exemple, j'ai configuré GnuPG pour toujours imprimer le 0x
- ID de la clé longue préfixée en ajoutant une ligne
keyid-format 0xlong
Malheureusement, vous ne pouvez pas configurer GnuPG pour imprimer l'intégralité de l'empreinte digitale de cette façon, probablement parce que cela casserait le format de sortie de GnuPG pour à peu près toutes les tailles d'écran. Au lieu de cela, demandez-le en exécutant
gpg --fingerprint 4E1F799AA4FF2279
qui déversera quelque chose comme
pub 8192R/0x4E1F799AA4FF2279 2012-12-25
Key fingerprint = 0D69 E11F 12BD BA07 7B37 26AB 4E1F 799A A4FF 2279
Comme cela a l'inconvénient de contenir des espaces (mauvaise chose pour l'utiliser dans les scripts), vous pouvez utiliser la sortie lisible par machine délimitée par deux points à la place:
gpg --with-colons --fingerprint 4E1F799AA4FF2279
Pour filtrer tout sauf l'empreinte digitale, utilisez également grep
et cut
:
gpg --with-colons --fingerprint 4E1F799AA4FF2279 | grep fpr | cut -d ':' -f 10