web-dev-qa-db-fra.com

Les ID de clé OpenPGP courts ne sont pas sécurisés, comment configurer GnuPG pour utiliser des ID de clé longs à la place?

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)?

36
Jens Erat

Relation entre les empreintes digitales et les ID de clé longue et courte

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.

Utilisation d'ID de clé longue

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

Impression d'ID de clé longue

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.

Configuration des ID de clé longue par défaut

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

Impression de l'empreinte digitale

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
51
Jens Erat