Pour un échange de clés Diffie – Hellman (D-H) (TLS), le serveur génère un p
et un générateur g
, qui est un module racine primitif p.
Lors de la configuration d'un serveur Web avec SSL/TLS (par exemple nginx), on peut utiliser une directive ssl_dhparam dhparam4096.pem
Le dhparam4096.pem
le fichier peut être généré à l'aide de openssl dhparam -out dhparam4096.pem 4096
Quel est exactement le but de ces paramètres D-H?
Peuvent-ils être publics? (c'est-à-dire que je peux publier mon dhparam4096.pem
fichier?)
Voici le contenu de mon dhparam4096.pem
fichier:
Cela semble être une représentation hexadécimale d'un entier de 4096 bits, est-ce exact?
-----BEGIN DH PARAMETERS-----
MIICCAKCAgEAsb8mBiOtYJZ3XR7f/rCXQwpAAnUPXf7l9pwjYxxy30A7rIzMTrsz
bXuhhEmzroJcDqKbu2nIzOBNO6HuyQ3n9x/ZbY5kiEt6q7UrB5jC9LwyPASZhd/F
6xLC7yqFs9sdCaXzuyMS4Ep5sPH6lOvftdsuGZZF9HriTepv/lpD1cPtab+3vHZX
IELVc2WBwVzvNRGd/SQB8RJ+NNF8IseCV/pb/tb67O1p7sn+JsD5xgNB7Lte/XjD
QBXv86aNuI2Z6zAuCiQsQ4rJuWcdnyAz0+zW9DRHz0osB1+IfHYcf4tNmvMKbC8E
u/vI+Q2WsMXkbTyhWibV2zH8cXdfsj5xpIgtbxm4G1ELGFgqyX9LD0IddXE7Md86
qwoKSTBNOyCIEZwwNfKDXY0b7zzObv7b3//J7gM323bAcm9g3uVaYBxF7ITd/jGm
AxpnF55mfhAOYemPZtNinnPAdvqf6BhZe29wfVC1yCIhg7ec9spRaFn2GgW0eL3d
q/+Ux8DJBtzKE10YyLa7bh1Dhml/xtA7rpqLL4+jg5c6lLEvSGmAZtm879NYS0za
33/2LN0/KB4z46Ro5hwqq3UIIe8oDsxdlNGb0mb9F0lKw5//J24PK/t11qMt8yuG
oKUE7TkDfwXlEBxd/ynW2/kLIjhG1JG55Vz8GWet8+ZGzfl/VQeUb9MCAQI=
-----END DH PARAMETERS-----
Quel est exactement le but de ces paramètres DH?
Ces paramètres définissent la manière dont OpenSSL effectue l'échange de clés Diffie-Hellman (DH) . Comme vous l'avez dit correctement, ils incluent un champ prime p
et un générateur g
. Le but de la disponibilité pour personnaliser ces paramètres est de permettre à chacun d'utiliser ses propres paramètres pour cela. Cela peut être utilisé pour éviter d'être affecté par l'attaque Logjam (qui ne s'applique pas vraiment aux nombres premiers de champ 4096 bits).
Alors, que définissent-ils?
Un échange de clés Diffie-Hellman fonctionne comme suit:
Le serveur Bob utilise ces paramètres pour calculer B=g^b mod p
. Il envoie (B,g,p)
À la cliente Alice qui calcule A=g^a mod p
Seule avec K=B^a mod p
. Elle envoie A
à Bob et il calcule K=A^b mod p
. Comme A^b=g^(a*b)=g^(b*a)=B^a mod p
détient, les deux parties s'accorderont sur une clé partagée. Les paramètres p
et g
définissent la sécurité de cet échange de clés. Un p
plus grand rendra la recherche du secret partagé K
beaucoup plus difficile, en défendant les attaquants passifs.
Et pourquoi devez-vous les pré-calculer?
Trouver le nombre premier p
signifie trouver une valeur pour p
pour laquelle p=2q+1
Est valable, q
étant un nombre premier. p
est alors appelé un nombre premier sûr.
Trouver de tels nombres premiers est vraiment intense en calcul et ne peut pas être fourni sur chaque connexion, ils sont donc pré-calculés.
Peuvent-ils être publics?
Oui , ce n'est pas un risque de les publier. En fait, ils sont envoyés pour chaque échange de clés impliquant un échange de clés Diffie-Hellman (DH). Il existe même quelques-uns de ces paramètres normalisés, par exemple dans RFC 5114 . Les seuls problèmes possibles avec la publication peuvent être qu'un attaquant puissant peut être intéressé à effectuer certains calculs sur eux, lui permettant d'effectuer Logjam attack . Cependant, comme vos paramètres utilisent un champ premier de 4096 bits p
ce n'est pas un risque.
Pour expliquer pourquoi leur publication n'est pas un risque, vous pouvez consulter la description de l'échange de clés ci-dessus et noter que les paramètres ne sont utilisés que comme base pour les calculs mais tous les secrets (a,b
) Sont complètement indépendants de g,p
.
À partir de la page wiki openssl pour l'échange de clés Diffie Hellman :
Si Alice et Bob souhaitent communiquer entre eux, ils conviennent d'abord entre eux un grand nombre premier p et un générateur (ou base) g (où 0 <g <p).
Alice choisit un entier secret a (sa clé privée) puis calcule g ^ a mod p (qui est sa clé publique). Bob choisit sa clé privée b et calcule sa clé publique de la même manière.
Ainsi, Alice aura toujours la même clé privée, mais pour chaque ensemble de paramètres DH g et p, elle obtiendra une clé publique correspondante différente.
Plus bas sur cette page, il est écrit:
Étant donné que la génération de paramètres peut être un processus coûteux, cela se fait normalement une fois à l'avance, puis le même ensemble de paramètres est utilisé sur de nombreux échanges de clés.
Et sur la page wiki openssl pour les paramètres Diffie Hellman il dit:
Pour utiliser des suites de chiffrement parfaitement secrètes, vous devez configurer les paramètres Diffie-Hellman (côté serveur)
Lorsque Diffie Hellman (DH) statique est utilisé (par opposition à Diffie Hellman éphémère (EDH)), les paramètres DH sont définis pour le serveur et peuvent en fait être intégrés dans un certificat, ils sont donc publics voir cette réponse =. Le secret vient des clés privées d'Alice et Bob.
Le but des paramètres DH est d'échanger un secret (un grand entier premier appartenant à un groupe d'ordre premier) qui sera utilisé pour crypter une transcription de messages dans un session .
La DH éphémère offre une sécurité avancée, ce qui signifie que la clé de session (échangée au début de la session) est supprimée à la fin de la session. Ainsi, un attaquant ne pourrait pas récupérer les messages échangés entre deux parties pour plus que la dernière session (car chaque session a une clé secrète différente qui est toujours supprimée à la fin).