Qu’est-ce que SHA-2 et comment ça marche ?
Ce guide couvrira la famille d'algorithmes SHA-2 en termes généraux. Si vous souhaitez en savoir plus sur le fonctionnement réel de l'algorithme SHA-256, rendez-vous sur notre Qu'est-ce que l'algorithme SHA-2 ? article.
SHA-2 est une famille de fonctions de hachage cryptographique qui comprend :
- SHA-224
- SHA-256
- SHA-384
- SHA-512
- SHA-512/224
- SHA-512/256
La famille d'algorithmes SHA-2 est largement utilisée dans notre monde en ligne et constitue un élément important de notre sécurité en ligne. Ils sont toujours considérés comme sûrs dans la plupart des applications et sont préférés aux systèmes non sécurisés. MD5 dans la majorité des cas d'utilisation.
Les applications de SHA-2
La famille d'algorithmes de hachage SHA-2 constitue les fonctions de hachage les plus couramment utilisées. SHA-256 est particulièrement répandu . Ces fonctions de hachage sont souvent impliquées dans les mécanismes de sécurité sous-jacents qui contribuent à protéger notre vie quotidienne. Vous ne l'avez peut-être jamais remarqué, mais SHA-2 est partout.
Pour commencer, SHA-2 est impliqué dans de nombreux protocoles de sécurité qui contribuent à protéger une grande partie de notre technologie :
- Sécurité de la couche de transport (TLS) — C'est l'un des protocoles de sécurité les plus utilisés. Vous le remarquerez plus clairement lorsque vous vous connecterez à un site Web commençant par https plutôt que http . Le s à la fin représente sécurisé , ce qui indique que TLS est utilisé pour chiffrer les données entre votre appareil et le serveur. Cela fait de SHA-2 un élément important de nombreuses connexions que vous établissez avec des sites Web lorsque vous naviguez en ligne.
- Sécurité du protocole Internet (IPSec) — IPSec est utilisé pour sécuriser la connexion entre deux points, et on le voit le plus souvent dans les VPN.
- Très bonne confidentialité (PGP) — PGP est l'un des protocoles les plus populaires pour chiffrer les e-mails afin qu'ils ne puissent être lus que par le destinataire. Il protège les messages des pirates informatiques et des autres parties susceptibles de lire les données, comme votre FAI.
- Extensions de messagerie Internet sécurisées/polyvalentes (S/MIME) — S/MIME est un autre protocole de sécurité important impliqué dans le cryptage des e-mails.
- Shell sécurisé (SSH) — SSH est le plus couramment utilisé pour accéder à distance aux ordinateurs et aux serveurs, mais il propose également des applications de redirection de port, de tunneling et de transfert de fichiers.
En plus d'être un composant essentiel des protocoles de sécurité mentionnés ci-dessus, la famille SHA-2 a de nombreuses autres utilisations. Ceux-ci inclus:
- Authentification des données — Les fonctions de hachage sécurisées peuvent être utilisées pour prouver que les données n'ont pas été modifiées, et elles sont impliquées dans tout, depuis authentification des preuves pour vérifier que les progiciels sont légitimes.
- Hachage de mot de passe — Les fonctions de hachage SHA-2 sont parfois utilisées pour le hachage de mots de passe, mais ce n'est pas une bonne pratique. Il est préférable d'utiliser une solution adaptée à l'objectif, comme bcrypt plutôt.
- Technologies blockchain — SHA-256 est impliqué dans la fonction de preuve de travail dans Bitcoin et de nombreuses autres crypto-monnaies. Il peut également être impliqué dans preuve de participation projets blockchain.
- Données du gouvernement américain — Depuis 2015, les États-Unis Institut national des normes et technologies (NIST) a conseillé à toutes les agences fédérales d'utiliser soit des algorithmes de la famille SHA-2, soit ceux de la famille SHA-3 pour la plupart des applications.
L'histoire de SHA-2
Les prédécesseurs de SHA-2 ont constitué des étapes importantes pour parvenir à l’algorithme actuel. L'Institut national des normes et de la technologie (NIST) a publié le norme fédérale de traitement de l'information (FIPS) 180 en 1993 pour ce que nous appelons maintenant SHA-0. Les faiblesses de l'algorithme ont été découvertes relativement rapidement, l'algorithme a donc été révisé et une version mise à jour, SHA-1, a été publiée en 1995 avec FIPS180-1 .
SHA-1 a également été spécifié dans RFC3174 .Il a été calqué étroitement sur MD4 , la 4ème version de l'algorithme de hachage Message Digest de Ron Rivest.
Le hachage de SHA-1 ne fait que 160 bits, ce qui a commencé à poser des problèmes de sécurité à mesure que la technologie et les techniques cryptographiques se sont améliorées au fil du temps. Cela a conduit le NIST à introduire une autre mise à jour, décrite dans FIPS180-2 . Ce document présente trois versions de SHA :
- SHA-256
- SHA-384
- SHA-512
Nous appelons ces algorithmes SHA-2 . Malgré les différentes longueurs de hachage, ils ont tous le même algorithme sous-jacent. En 2008, une version 224 bits de SHA-2 a été ajoutée avec la publication de FIPS-3 , qui a approfondi les détails de l’algorithme. SHA-2 est spécifié dans RFC4634 .
D'ici 2005, Le NIST a annoncé son intention de supprimer progressivement son approbation pour SHA-1 d’ici 2010 en raison de l'éventail de problèmes de sécurité découverts.
Peu de temps après, les chercheurs a publié un article qui montrait une attaque où deux messages distincts pouvaient être trouvés pour aboutir au même hachage SHA-1 en 269opérations, ce qui était nettement inférieur aux 2 précédemment présumés80opérations. Cela a montré que la situation sécuritaire de SHA-1 était encore plus désastreuse qu’on ne le pensait, et a poussé la communauté à adopter davantage la famille SHA-2.
Qu'est-ce qu'une fonction de hachage ?
Avant de pouvoir entrer dans les détails de ce qu’est SHA-2, nous devons couvrir les bases. Il n'est pas particulièrement utile de savoir que SHA-2 est une fonction de hachage avec une construction Merkle-Damgard si vous ne savez pas encore ce qu'est une fonction de hachage.
À leur niveau le plus élémentaire, les fonctions de hachage prennent des entrées de n'importe quelle taille, puis les convertissent en sorties de longueur fixe, appelées hachages.
Les fonctions de hachage les plus simples sont utilisées pour des tâches telles que la récupération et le stockage de données. L’un des principaux avantages de ces fonctions de hachage simples est qu’elles permettent de rechercher et d’accéder aux données dans un laps de temps court et cohérent.
Nous avons expliqué de manière beaucoup plus détaillée le fonctionnement des fonctions de hachage simples dans notre Qu’est-ce que MD5 et comment est-il utilisé ? article. Il aborde les bases du fonctionnement de ces types de fonctions de hachage et explique plus en détail pourquoi elles sont utiles.
Que sont les fonctions de hachage cryptographique ?
Les fonctions de hachage cryptographique sont des types spéciaux de fonctions de hachage qui possèdent une gamme de propriétés étranges. Non seulement ils transforment des données de n'importe quelle longueur en valeurs de longueur fixe, mais ils sont également :
- Déterministe – Cela signifie que la même entrée conduit toujours au même hachage de longueur fixe que sa sortie. Lorsque vous entrez, « le hachage est compliqué » dans un Calculatrice SHA-256 , vous obtenez toujours un hachage de d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a.
- Conçu pour que de légers changements modifient considérablement le rendement – Si vous modifiez ne serait-ce qu’un peu l’entrée initiale, vous vous retrouverez avec un hachage qui semble totalement sans rapport. A titre d'exemple, si l'on dit « le hachage est compliqué Avec » dans le même calculateur de hachage SHA-256, nous obtenons un hachage de 54afff2602d37e8dee0d696d7f6a352e8d1bae481b31cb50622b29b20594c2e5. Comme vous pouvez le constater, il ne semble y avoir aucun chevauchement entre celui-ci et le hachage précédent, malgré une différence si subtile dans les entrées.
- Rapide à calculer – Lorsque vous entrez une entrée dans la calculatrice SHA-256, le résultat semble apparaître instantanément (sauf si vous disposez d'une mauvaise connexion Internet ou d'un appareil plus ancien). Lorsque l'on considère chacune des étapes qui se déroulent dans le Algorithme SHA-2 , vous serez peut-être surpris de la rapidité de l'ensemble du processus.
- Fonctions unidirectionnelles – Si vous preniez l’un des deux hachages que nous venons de vous montrer et que vous ne connaissiez pas déjà les entrées initiales, il serait pratiquement impossible de déterminer une entrée qui aboutirait à l’un ou l’autre de ces hachages spécifiques. Avec les techniques et la technologie actuelles, il est si peu pratique de déterminer une entrée appropriée à partir du seul hachage SHA-2 qu’une grande partie de la sécurité en ligne mondiale repose sur l’hypothèse que ces attaques ne sont pas réalisables. En ce sens, ces fonctions sont à sens unique. Il est relativement facile de prendre une entrée et de calculer le hachage, mais presque impossible de faire l'inverse.
- Résistant aux collisions – Les fonctions de hachage cryptographique sont conçues de telle sorte qu’il est impossible que deux entrées différentes aboutissent au même hachage. Lorsque des entrées distinctes aboutissent au même hachage, on parle de collision , donc la propriété requise de ces fonctions est connue sous le nom résistance aux collisions . Bien qu'il existe différentes entrées qui aboutissent à la même valeur de hachage, la probabilité de les trouver doit être presque impossible pour qu'une fonction de hachage cryptographique soit considérée comme sécurisée. Si le hachage « le hachage est compliqué » est 54afff2602d37e8dee0d696d7f6a352e8d1bae481b31cb50622b29b20594c2e5, il doit être incroyablement improbable que quiconque puisse tomber sur une entrée qui aboutit à ce même hachage, quel que soit le temps qu'il y consacre.
Qu'est-ce que SHA-2
Maintenant que vous savez ce qu'est une fonction de hachage et que la famille SHA-2 est un sous-type spécifique appelé fonctions de hachage cryptographique, nous pouvons entrer dans les détails plus spécifiques de SHA-2.
Comme nous l'avons mentionné, SHA-2 n'est pas une simple fonction de hachage, mais une famille de six. Ils sont collectivement appelés SHA-2 car cette famille remplace SHA-1, qui n’était qu’un algorithme unique. La famille SHA-2 est la suivante :
- SHA-224 – Cette version de SHA-2 produit un hachage de 224 bits. Il a une taille de bloc de 512 bits et l'entrée initiale est divisée en mots de 32 bits pour le traitement. Les variables d'initialisation ont également une longueur de 32 bits, tout comme les constantes K. Chaque bloc de données subit 64 cycles d'opérations avant que le hachage final (ou le hachage intermédiaire, dans les cas où plusieurs blocs de données sont en cours de traitement) soit produit. .
- SHA-256 – SHA-256 donne un hachage de 256 bits et une taille de bloc de 512 bits. L'entrée du message est traitée en mots de 32 bits, tandis que les variables et constantes d'initialisation ont également une longueur de 32 bits. SHA-256 implique également 64 tours.
- SHA-384 – Cette version produit un hachage de 384 bits. Il diffère des deux précédents en ce qu’il a une taille de bloc de 1 024 bits. Il varie également dans la mesure où il comporte des mots de 64 bits, des variables d'initialisation et des constantes. Au lieu de 64 tours, cela nécessite 80 tours de traitement pour chaque bloc de données de message.
- SHA-512 – SHA-512 donne un hachage de 512 bits. En dehors de cela, il ressemble beaucoup à SHA-384 dans la mesure où il a une taille de bloc de 1 024 bits, des mots de 64 bits, des variables d’initialisation de 64 bits et des constantes de 64 bits. Cependant, les variables d'initialisation particulières avec lesquelles il commence sont différentes de celles de SHA-384. Cela implique également 80 tours.
- SHA-512/224 – Cette version ressemble beaucoup à SHA-512, sauf qu'elle aboutit à un hachage tronqué de 224 bits. Cela signifie qu'il s'agit d'un processus qui est en grande partie le même, sauf que seuls les 224 bits les plus à gauche sont pris comme hachage, tandis que le reste est ignoré. La taille du bloc est également de 1 024 bits, tandis que les mots, les constantes et les variables d'initialisation ont tous une longueur de 64 bits. Cependant, les variables d'initialisation sont différentes de celles utilisées dans SHA-512 ou SHA-384. SHA-512/224 nécessite également 80 tours pour chaque bloc de données de message.
- SHA-512/256 – Comme SHA-512/224, cette itération est également similaire à SHA-512, sauf qu'elle produit un hachage tronqué de 256 bits en ne prenant que les 64 bits les plus à gauche. Il a une taille de bloc de 1 024 bits, ainsi que des mots, des constantes et des variables d'initialisation de 64 bits. SHA-512/256 possède également son propre ensemble de variables d'initialisation. Cela implique 80 tours.
Vous pouvez afficher les détails, y compris les valeurs de chacune des variables d'initialisation et les constantes dans FIPS180-4 . Notre Qu'est-ce que l'algorithme SHA-2 ? L'article passe en revue chaque étape du processus pour SHA-256. Si vous êtes curieux de connaître l'une des autres versions de SHA-2, vous pouvez simplement suivre les étapes pour SHA-256 dans notre article, tout en modifiant les valeurs par celles spécifiées dans le document FIPS 180-4.
Les variations au sein de la famille SHA-2
Nous avons brièvement présenté les six fonctions SHA-2 différentes et répertorié certaines des différences entre elles. Il est maintenant temps d’examiner ce que signifient réellement ces différences :
Longueur de hachage
Les algorithmes ci-dessus produisent quatre longueurs de hachage différentes :
- 224 bits
- 256 bits
- 384 bits
- 512 bits
La longueur du hachage correspond à la longueur du hachage en bits. Un hachage de 512 bits est beaucoup plus long qu'un hachage de 22 bits, de la même manière qu'un nombre à huit chiffres est beaucoup plus grand qu'un nombre à quatre chiffres.
En règle générale, plus la longueur de hachage est petite, plus il est facile de trouver un collision, c'est-à-dire lorsque deux entrées distinctes aboutissent au même hachage . Si vous considérez un hachage comme un simple nombre long, ce qui est essentiellement le cas, cela a un sens intuitif.
Si nous vous disions que nous pensons à un nombre compris entre un et cinq et que vous deviniez qu’il s’agit de quatre, personne ne serait particulièrement impressionné. Si nous vous disions que nous pensons à un nombre compris entre un et un million et que vous deviniez correctement qu'il s'agit de 984 287, nous serions époustouflés.
Pourquoi? Parce qu’il est beaucoup plus facile de trouver une collision lorsque l’on a affaire à une plage de nombres plus petite. . Tout comme il est beaucoup plus facile de deviner un nombre entre un et cinq que de deviner un entre un et un million, il est beaucoup plus facile de trouver une collision pour un hachage compris entre zéro et :
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Il s'agit alors d'en trouver un entre zéro et :
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
*En remarque pour ceux qui découvrent les nombres hexadécimaux. Non, nous n'avons pas eu de crise. Les « f » sont en réalité des nombres, mais ils sont écrits dans un système appelé hexadécimal, par opposition aux nombres décimaux plus conventionnels que nous utilisons dans la vie quotidienne. Les nombres décimaux auxquels vous êtes habitués sont un système en base 10, ce qui signifie essentiellement qu'il existe 10 nombres différents (0, 1, 2, 3, 4, 5, 6, 7, 8 et 9). Vous connaissez probablement un autre système de numérotation, binaire, qui est en base 2, ce qui signifie qu'il n'y a que deux options dans le système, 0 ou 1. Hexadécimal est un système en base 16, ce qui signifie essentiellement qu'il y a 16 nombres. (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e et f). C'est pourquoi le hachage SHA-256 que nous avons répertorié à plusieurs reprises contient les lettres a, b, c, d, e et f. Si vous souhaitez en savoir plus sur les nombres hexadécimaux, nous les avons abordés plus en profondeur dans notre Qu’est-ce que MD5 et comment est-il utilisé ? article.
Maintenant, revenons de notre tangente et revenons aux longueurs de hachage. Un hachage plus long est plus résistant aux collisions qu’un hachage plus court. Malgré cela, chacune des longueurs de hachage de la famille SHA-2 est considérée comme sécurisée dans la plupart des applications.
La résistance améliorée aux collisions d’un hachage plus long s’accompagne d’un compromis. Ceci est dû au fait plus le hachage est long, plus il faut de temps pour le calculer et plus la quantité de ressources de calcul qu'il consomme est importante . À mesure que la technologie progresse, il devient plus possible de trouver des collisions de hachages plus volumineux. À leur tour, nos puissances de calcul augmentent également avec le temps, il devient donc plus pratique d’utiliser des hachages plus longs et plus gourmands en ressources.
Taille de bloc
La taille du bloc est également un compromis entre sécurité, vitesse et besoin en ressources. Plus le bloc est petit, plus vous aurez besoin de blocs pour traiter une entrée de données donnée. (si l'entrée est supérieure à la taille d'un seul bloc). Cependant, ces blocs plus petits auront généralement un temps de calcul plus court. Il existe des facteurs supplémentaires qui entrent en jeu pour déterminer la taille de bloc la plus efficace pour un certain scénario, mais discuter des subtilités matérielles et d'autres aspects nous amènerait sur une trop grande tangente.
Les tailles de bloc de 512 et 1 024 bits sont généralement considérées comme sécurisées, mais les circonstances individuelles d’une situation donnée peuvent conduire à choisir l’une ou l’autre comme taille préférée pour la mise en œuvre. En règle générale, vous souhaiterez utiliser la taille de bloc sécurisée minimale adaptée à l’environnement d’exploitation ciblé.
Longueur des mots, variables d'initialisation et constantes
Si vous vous référez aux chiffres énumérés ci-dessus dans le Qu’est-ce que SHA-2 ? section, vous verrez que la taille de bloc de chaque algorithme de la famille SHA-2 est toujours seize fois la taille de la longueur du mot.
Ceci est dû au fait le bloc rempli de données d'entrée est toujours divisé en 16 mots (48 mots supplémentaires sont dérivés de ces seize dans le cas des algorithmes SHA-2 avec des tailles de blocs de 512 bits. 64 mots supplémentaires sont dérivés pour les algorithmes avec des tailles de blocs de 1 024 bits).
Cela signifie que les mots doivent faire un seizième de la taille du bloc. Dans le cas des algorithmes avec des tailles de bloc de 512 bits comme SHA-224 et SHA-256, chaque mot doit faire 32 bits (512/16=32). Le reste de la famille a chacun une taille de bloc de 1 024 bits et la longueur des mots est de 64 bits. (1 024/16=64).
Un des mots est traité à chaque tour, et à chaque tour il est mélangé avec les huit variables d'initialisation différentes (après le tour 0, les variables nouvellement calculées sont utilisées à la place des variables d'initialisation, que nous appelons variables de travail dans notre article plus détaillé sur l'algorithme à travers un certain nombre d'opérations distinctes). La constante est également ajoutée au milieu de ces opérations.
Dans les versions de taille de bloc de 512 bits de l'algorithme (SHA-224 et SHA-256), les mots, les constantes et les huit variables d'initialisation/de travail distinctes utilisées à chaque tour ont tous une longueur de 32 bits. A côté de l'ajout modulaire (il s'agit d'un type particulier d'ajout que nous décrivons plus en profondeur dans notre autre article), cela garantit que les sorties de chaque opération et de chaque tour ont toujours la même longueur constante .
Il en va de même pour les quatre algorithmes SHA-2 avec des tailles de bloc de 1 024 bits, sauf que tous les nombres ont une longueur de 64 bits.
La raison de la conception d'algorithmes avec des longueurs de mots de 32 ou 64 bits est liée à la vitesse et au matériel sur lequel ces calculs sont destinés à être effectués. Idéalement, la taille du registre du processeur correspondra à la longueur du mot.
Nombre de tours
Chaque cycle de SHA-2 implique de mélanger une partie de l'entrée du message (un des mots), avec les variables d'initialisation/de travail et la constante appropriée. Cela se fait à travers une série complexe d’opérations. Si vous vous référez à notre article Qu'est-ce que l'algorithme SHA-2, vous verrez combien d'étapes sont impliquées. Cela prend tout le chemin depuis le L'opération Maj section à la Les autres variables de travail section pour discuter d’un seul tour de l’algorithme SHA-256.
Comme nous l'avons mentionné précédemment, l'une des exigences d'une fonction de hachage cryptographique sécurisé est qu'il s'agit d'une fonction à sens unique, ce qui signifie que vous ne pouvez pas déterminer l'entrée d'origine à partir du seul hachage, ni aucune entrée qui pourrait également produire le même hachage.
Pour y parvenir, l'algorithme SHA-2 mélange essentiellement les données d'entrée avec les constantes et les variables d'initialisation/de travail, selon un processus très structuré. Dans ce processus, chaque tour sert essentiellement à mélanger encore davantage les données.
Une métaphore pour les rondes
Il serait peut-être utile de visualiser ce qui se passe à chaque tour à travers une métaphore. Disons que vous avez deux pages du même journal. L’une est la première page et vous êtes vraiment intéressé par les histoires principales. L'autre page contient uniquement les petites annonces, dont vous n'avez pas besoin.
Disons qu’au premier tour, vous découpez chaque page en cent morceaux. Vous prenez ensuite un dixième des articles de la une et vous les jetez. Vous les remplacez par un dixième des morceaux des pages classées, puis vous les mélangez. Vous disposez maintenant de deux piles, dont une comprend 100 pièces, qui proviennent pour la plupart de la première page. L'autre pile contient 90 morceaux de la page classée . À la fin de ce tour, cela vous prendra peut-être un peu de temps, mais vous seriez probablement en mesure de reconstituer une grande partie de la première page et de comprendre ce que disaient les gros titres si vous le vouliez.
Au deuxième tour, vous coupez à nouveau tous les morceaux de papier en deux. Vous jetez un autre dixième des pièces de la pile de la première page et les remplacez par la même quantité de pièces de la pile classée. Vous avez maintenant 200 morceaux de première page dans une pile et 160 morceaux de petites annonces dans l'autre. . Cela vous prendrait encore plus de temps maintenant, mais vous seriez probablement en mesure de reconstituer une grande partie de la première page. Vous seriez probablement toujours en mesure de comprendre les titres, ou du moins d'inventer un autre titre qui s'insère dans les espaces où les lettres manquent.
Au troisième tour, vous refaites la même chose, pour finir avec 400 morceaux de papier dans votre pile de première page, mais maintenant 30 pour cent proviennent des petites annonces . Au quatrième tour, vous auriez 800 pièces, mais seulement 40 pour cent proviennent de la première page originale. Au cinquième tour, il s’agit de 1 600 et seulement 50 pour cent, tandis qu’au sixième, vous avez affaire à 3 200 pièces, avec seulement 40 pour cent de la première page originale.
Au fur et à mesure que vous progressez, il devient de plus en plus difficile de réassembler les titres, ou même de trouver un titre qui corresponde aux lettres restantes que vous parvenez à mettre à leur place.
Ce n’est pas une métaphore parfaite de la façon dont fonctionnent les fonctions de hachage, mais le point principal est qu'à chaque tour, il devient de plus en plus difficile de réassembler l'entrée d'origine, ou même de trouver une entrée qui conviendrait. À un moment donné, vous diriez simplement que ce n’est pas réalisable.
L'exemple ci-dessus ressemble beaucoup à une fonction de hachage unidirectionnelle. Les titres ressemblent un peu aux mots de nos données d'entrée que nous traitons via l'algorithme SHA-2. Les constantes et les variables d'initialisation sont similaires à la page classée. Dans les deux cas, il s’agit essentiellement de données supplémentaires dénuées de sens qui sont mélangées à l’entrée.
Les tours dans notre métaphore et dans l'algorithme SHA-2 remplissent également des rôles similaires. Ils servent à mélanger nos données d’entrée avec les données dénuées de sens. Après chaque tour, les données d'entrée se mélangent davantage avec les données dénuées de sens, ce qui rend de plus en plus difficile la compréhension de l'entrée initiale. , ou toute autre entrée qui conviendrait. Finalement, on arrive au point où il est tout simplement impossible de trouver une entrée qui puisse donner le même résultat.
Notez que notre métaphore a produit un taux de changement exponentiel après chaque tour, où il y avait deux fois plus de pièces à la fin de chaque tour qu'au début. L'algorithme SHA-2 ne divise pas la quantité de données à la fin de chaque tour, et n'augmente pas non plus la complexité à un rythme aussi élevé avec le traitement de chaque tour. Si vous gardez cela à l’esprit et que nous démontrons simplement le concept plutôt que le taux d’augmentation, la métaphore devrait quand même fournir une bonne visualisation du rôle que jouent les cycles dans le processus SHA-2..
La principale chose que nous essayons de faire comprendre est que le nombre de tours dans un algorithme a un impact sur la possibilité de comprendre une entrée à partir du hachage. . Si l’algorithme SHA-2 ne durait qu’un tour, les données n’auraient pas été soigneusement mélangées et il ne serait pas trop difficile de trouver une entrée qui corresponde au hachage. Avec 64 cartouches, le mélange est si complet que nous ne considérons pas qu'il est possible de trouver une entrée correspondante, tandis que 80 cartouches nous donnent une marge de sécurité encore plus grande.
Troncature
SHA-512/224 et SHA-512/256 sont pour la plupart identiques à SHA-512. Bien qu'ils utilisent chacun leurs propres ensembles de variables d'initialisation, la principale différence est que le hachage est tronqué . Cela signifie que seuls les 224 (ou 256) bits les plus à gauche sont émis comme hachage, et les 288 (ou 256) autres bits à droite sont essentiellement ignorés.
Cette troncature rend SHA-512/224 et SHA-512/256 sécurisés contre attaques d'extension de longueur . Vous voyez ces attaques dans les applications où une valeur secrète est ajoutée aux données d'entrée, qui sont ensuite hachées. Ces attaques sont préoccupantes dans les situations où l'attaquant a accès aux données d'entrée, mais pas à la valeur secrète.
Si des algorithmes vulnérables tels que MD5, SHA-1, SHA-256 ou SHA-512 sont utilisés dans le hachage, des attaques par extension de longueur peuvent être possibles. L'attaquant aurait besoin de savoir :
- Quel algorithme de hachage est utilisé .
- La saisie des données de la victime .
- Le hachage des données saisies par la victime .
Si l'attaquant dispose de ces informations, il pourra peut-être reproduire un signature sans jamais en avoir connu la valeur secrète.
Cette attaque peut sembler un peu abstraite, alors examinons un scénario dans lequel cela pourrait poser problème. Imaginez une situation dans laquelle un serveur authentifie un client sur la base de cette signature. La signature remplace la valeur secrète, que le client ne souhaite évidemment pas partager avec le serveur, car cela pourrait conduire à la révélation de la valeur secrète.
Si l'attaque par extension de longueur permet à un attaquant de reproduire cette signature sans jamais en connaître la valeur secrète, il permet donc à l'attaquant de s'authentifier frauduleusement . De cette façon, les algorithmes de hachage qui sont vulnérables aux attaques par extension de longueur peuvent compromettre la sécurité fournie par la valeur secrète.
Maintenant que nous avons couvert les bases des attaques par extension de longueur, nous pouvons examiner comment la troncature les empêche. Les attaques par extension de longueur nécessitent le hachage des données saisies par la victime afin de calculer la signature. Les hachages tronqués comme ceux produits par SHA-512/224 et SHA-512/256 ne contiennent pas suffisamment d'informations, car les sorties ne contiennent pas les 288 (ou 256 bits) les plus à droite.
Bien que les SHA-512/224 et SHA-512/256 ne soient pas particulièrement courants pour le moment, leur résistance aux attaques par extension de longueur constitue un avantage significatif. Si une fonction de hachage SHA-2 doit être implémentée dans une situation où ces attaques sont possibles, l'un ou l'autre de ces deux algorithmes peut être l'option la plus sécurisée.
La conception de l’algorithme SHA-2
Maintenant que nous avons couvert les différences entre ces variantes de SHA-2, il est temps d’examiner la conception globale de ces fonctions de hachage. Pour commencer, ils sont construits à partir de fonctions de compression unidirectionnelles.
Fonctions de compression unidirectionnelle de SHA-2
En cryptographie, les fonctions de compression unidirectionnelle prennent deux entrées de longueur fixe et produisent une sortie qui est également de longueur fixe . Le processus rend difficile la détermination des deux entrées si vous n’avez accès qu’à la sortie. Les entrées ne doivent pas nécessairement avoir la même longueur, comme nous le verrons dans SHA-2.
Ces fonctions de compression unidirectionnelle ne doivent pas être confondues avec les algorithmes de compression que nous utilisons pour réduire la taille des fichiers audio, vidéo et autres.
Pour chaque bloc de données étant traitée par SHA-256, la fonction de compression unidirectionnelle a les entrées suivantes :
- 512 bits de données de message — SHA-2 traite un bloc de données à la fois. Cette entrée agit de la même manière qu'une clé le ferait dans un chiffrement par bloc normal (voir le Le chiffrement par bloc SHA-2 section ci-dessous). Nous entendons par là qu’il joue un rôle déterminant dans le résultat. S'il y a plus d'un bloc de données à traiter, ces blocs suivants deviennent les entrées une fois que le premier bloc de données est passé par l'algorithme SHA-2. Le bloc final doit toujours être rempli.
- Un ensemble de variables d'initialisation de 256 bits — Ceux-ci sont divisés en huit parties pour le traitement initial du premier bloc. S'il y a plus d'un bloc, le 256 bits hachage intermédiaire remplit le rôle des variables d'initialisation dans chacun de ces tours. Le hachage intermédiaire n’est essentiellement que le résultat du traitement du bloc de données précédent. Ces variables d'initialisation et hachages intermédiaires remplacent le texte en clair qui serait chiffré dans un chiffrement par bloc normal (voir le Chiffrement par bloc SHA-2 section ci-dessous).
Il produit un résultat de :
- Un hachage de 256 bits — Pour un seul bloc de données, la sortie de la fonction de compression est le hachage de 256 bits. Lors du traitement de plusieurs blocs de données, chaque bloc produit un 256 bits hachage intermédiaire . Comme nous l'avons mentionné ci-dessus, ceux-ci servent d'entrées pour le bloc suivant. Lorsque tous les blocs ont été traités, la sortie du bloc final est le hachage de 256 bits.
Notez que les fonctions de compression dans SHA-384, SHA-512, SHA-512/224 et SHA-512/256 ont chacune des entrées de :
- 1 024 bits de données de message.
- Un ensemble de variables d'initialisation de 512 bits ou un hachage intermédiaire de 512 bits.
Ils produisent :
- Hachages de 384, 512 224 ou 256 bits, selon l'algorithme. Dans le cas de plusieurs blocs en cours de traitement, les hachages intermédiaires sont de 512 bits.
Comparez les deux diagrammes suivants pour voir comment SHA-2 utilise sa fonction de compression :
Type de fonction de compression utilisée dans l'algorithme SHA-2. La fonction de compression unidirectionnelle Davies – Meyer par Davidgothberg sous licence CC0 .
L'algorithme SHA-2 pour le traitement d'un seul bloc
Il peut être difficile de voir les similitudes entre ces deux diagrammes, car le second contient beaucoup plus de choses. Commençons par expliquer les parties les plus faciles à voir.
Vous remarquerez peut-être qu'ils ont tous les deux H je-1 tout en haut. Ces H je-1 les entrées représentent les variables d'initialisation ou le hachage intermédiaire du bloc précédent.
Les deux diagrammes partagent également un H je-1 au fond. Ceux-ci représentent soit le hachage, soit le hachage intermédiaire qui sera utilisé dans les blocs suivants.
Si vous regardez le deuxième diagramme, vous remarquerez que nous avons l'entrée du message (M) en haut à gauche. Cela passe par le Calendrier des messages , qui comporte des flèches pointant vers chacun des tours. L'entrée du message (M) est notre bloc de données, qui est divisé par le Calendrier des messages .
Le Tour 0 , T rond et Tour 63 du diagramme de l'algorithme SHA-2 sont essentiellement tous encapsulés dans le ET du diagramme fonctionnel de compression. Si vous imaginez que les huit symboles plus dans le diagramme de l'algorithme SHA-2 représentent la même chose que le cercle avec une croix dans le diagramme des fonctions de compression, vous aurez probablement une bonne idée du rôle que jouent les fonctions de compression unidirectionnelles dans l'algorithme SHA-2.
Fonctions de compression Davies-Meyer
La fonction de compression unidirectionnelle particulière dont nous avons discuté est un sous-type connu sous le nom de fonction de compression Davies-Meyer. L'élément déterminant est la flèche qui part du H je-1 directement au cercle rouge avec la croix dedans.
Cela représente un ajout modulaire (voir le Ajout modulaire section de notre autre article), où les variables d'initialisation (ou le hachage intermédiaire du bloc de données précédent) sont ajoutées à la sortie de ET . Toutes les fonctions de compression unidirectionnelle ne disposent pas de cette fonctionnalité.
Pour le comparer à l'exemple détaillé que nous avons présenté dans notre autre article, ET représente l'ensemble des 64 cycles de traitement appliqués au bloc de 512 bits de données de message et aux variables d'initialisation. Nous avons couvert l'étape qui impliquait le cercle avec la croix dans le dernier ajout modulaire section de notre article précédent. Il s’agit essentiellement d’ajouter la sortie de ET au H je-1 value, qui, comme nous l'avons dit, correspond soit aux variables d'initialisation, soit au hachage intermédiaire.
Cette structure Davies-Meyer présente plusieurs avantages par rapport aux alternatives comme Miyaguchi-Preneel. Parmi les autres alternatives majeures, c'est l'une des options les plus simples . Cela permet également que la taille du bloc soit différente de la taille du message entré sans qu'il soit nécessaire d'ajouter d'autres ajouts à l'algorithme. La structure Davies-Meyer confère également à l'algorithme SHA-2 certains avantages en termes d'efficacité.
Construction Merkle Damgard
Les fonctions de compression unidirectionnelles de la famille SHA-2 sont organisées selon la construction Merkle-Damgard, qui est une conception de fonction de hachage cryptographique spécifique. L'objectif de la construction Merkle-Damgard est de rendre la fonction de hachage résistante aux collisions, ce qui signifie qu'il est impossible pour un attaquant de trouver deux entrées distinctes pouvant toutes deux produire le même hachage.
Pourquoi la résistance aux collisions dans la construction Merkle-Damgard est importante
Les collisions sont inquiétantes, car les hachages sont souvent utilisés pour signatures numériques et d'autres processus d'authentification. Si un attaquant parvient à détecter des collisions dans lesquelles deux entrées distinctes aboutissent au même hachage, cela lui ouvre la possibilité de s'authentifier frauduleusement.
Un exemple implique un attaquant qui construit soigneusement deux contrats qui aboutissent tous deux au même hachage, l'un légitime, l'autre frauduleux. L’attaquant montrait alors le contrat légitime à son patron et lui demandait de le signer numériquement. Puisque le document est légitime, le patron le signera avec sa signature numérique, basée sur le hachage du document et la clé privée du patron.
L’attaquant échangeait alors le bon contrat avec le frauduleux et l’envoyait avec la signature numérique à l’avocat de son patron. Le contrat frauduleux pourrait stipuler que le patron cède les droits sur la maison du patron à l’employé. L'avocat examinerait ensuite le contrat et vérifierait la signature numérique. En raison du méfait de l’employé, la signature numérique correspond. Il semblerait que le patron ait effectivement signé le contrat numériquement, de sorte que l'avocat penserait qu'il est légitime et entamerait le processus de cession des droits légaux du logement à l'employé.
Bien sûr, le document original signé par le patron aurait été complètement différent, et la seule raison pour laquelle cela semble légitime est que la fonction de hachage impliquée dans le processus de signature numérique n'était pas résistante aux collisions.
L'exemple ci-dessus est un peu extrême, mais le fait est que les collisions mettent complètement à mal la sécurité de nos systèmes d’authentification , nous devons donc concevoir soigneusement nos fonctions de hachage pour les éviter.
Comment fonctionne la construction Merkle-Damgard ?
La construction Merkle-Damgard implique des fonctions de compression, qui ne peuvent gérer que des entrées fixes. Si la fonction de compression est conçue pour gérer 512 bits de données à la fois, vous ne pouvez pas simplement y envoyer 73 bits ou 1 427 bits directement. Vous devez soit compléter les données pour qu'elles occupent la totalité des 512 bits, soit diviser les données sur plusieurs blocs, puis ajouter tout remplissage nécessaire pour terminer le bloc final. Notez que seul le dernier bloc nécessite un remplissage.
Si vous faites référence au SHA-2 et rembourrage section de notre article sur le Algorithme SHA-2 , vous verrez que la première étape majeure que nous avons prise a été d'ajouter un remplissage à nos données d'entrée de message pour nous assurer que nos tailles de bloc étaient toutes de 512 bits.
Si vous vous souvenez que les 64 derniers bits du bloc étaient réservés pour ajouter la longueur du message, c'est parce qu'il s'agit d'une partie essentielle de la construction Merkle-Damgard.
C'est ce qu'on appelle rembourrage en longueur ou renforcement Merkle-Damgard , et cela sert à prouver qu'une collision ne peut être trouvée que dans le fonction de hachage globale si une collision peut être trouvée dans la fonction de compression . N'oubliez pas que les collisions sont mauvaises et que SHA-2 est une fonction de hachage construite avec des fonctions de compression. Essentiellement, ce que dit la preuve, c'est que tant que les fonctions de compression unidirectionnelles résistent aux collisions, nous pouvons également être sûrs que la fonction de hachage globale est également résistante aux collisions.
La preuve sous-jacente implique pas mal de mathématiques, mais elle montre essentiellement que nous pouvons avoir cette propriété dans nos fonctions de hachage si le schéma de remplissage fait qu'un bloc de message rempli n'est jamais la fin d'un autre. L'ajout de la longueur comme remplissage à la fin du bloc final de l'entrée empêche que cela se produise, nous aidant ainsi à prouver la sécurité de la fonction de hachage.
La construction Merkle-Damgard de SHA-256 commence par un vecteur d'initialisation de 256 bits, que notre autre article décrit comme une série de huit variables d'initialisation de 32 bits. Notre exemple ne couvre qu'un seul bloc de la fonction SHA-256 en raison de notre petite entrée initiale, nous ne voyons donc pas vraiment comment la construction Merkle-Damgard se déroule sur une série de blocs. Au lieu de cela, le remplissage de longueur est ajouté à la fin de notre seul et unique bloc.
Construction de hachage Merkle Damgard par Davidgothberg sous licence CC0 .
L'algorithme SHA-256.
Le premier diagramme montre la conception impliquée dans la construction Merkle-Damgard. L'exemple dont nous avons discuté dans notre autre article ne concernait qu'un seul bloc de données, il peut donc être difficile de voir la ressemblance entre celui-ci et le diagramme de construction de Merkle-Damgard.
Il peut être plus facile de comprendre la construction de Merkle-Damgard si nous prétendons que nos données de message étaient en réalité longues de trois blocs. Dans cette optique, reportez-vous au premier schéma. Bloc de messages 1 dans le diagramme se trouveraient nos 512 premiers bits de données de message. Le IV à gauche représente nos huit variables d'initialisation, qui totalisent 256 bits.
Ces deux éléments agissent comme des intrants pour F . Dans l'exemple de notre autre article, F serait l'ensemble des 64 cycles d'opérations sur ces deux entrées, plus l'ajout modulaire impliqué dans la fonction de compression Davies-Meyer dont nous avons parlé plus tôt. Cette sortie serait la hachage intermédiaire (ou l'ensemble de huit variables de travail comme nous les avons appelés dans l'autre article).
En suivant le diagramme, ce hachage intermédiaire sert d'entrée dans le deuxième F fonction. Bien entendu, notre deuxième bloc de données de message serait Bloc de messages 2 , qui sert d'autre entrée au F fonction. Le F La fonction répéterait simplement le même traitement, sauf cette fois en utilisant les différentes entrées. Il en résulterait un nouveau hachage intermédiaire .
Ce hachage intermédiaire devient alors une entrée dans notre troisième bloc de données de message. Dans ce cas, notre autre entrée serait Bloc de messages n , notre troisième et dernier bloc de données de message. Bien qu'il soit quelque peu séparé dans le diagramme de Merkle-Damgard, dans SHA-2, ce dernier bloc inclut le remplissage et la longueur du message ajouté dont nous avons parlé plus tôt.
La dernière étape du diagramme de Merkle-Damgard montre la fonction de finalisation. Les algorithmes SHA-224, SHA-384, SHA-512/224 et SHA-512/256 compressent leurs données à cette étape. Dans le cas de SHA-224, les 256 bits de sortie sont compressés en un hachage de 224 bits. Dans les trois autres cas, les sorties de 512 bits sont respectivement compressées en hachages de 384, 224 et 256 bits. Cet aspect est essentiel pour atténuer les attaques d’extension de longueur évoquées précédemment.
Le chiffrement par bloc SHA-2
Nous avons discuté des fonctions de compression Davies-Meyer qui sont organisées dans la construction Merkle-Damgard pour former la structure globale de la famille d'algorithmes SHA-2. Il est maintenant temps de zoomer un peu et d’examiner les chiffrements par blocs à partir desquels la fonction de compression est construite.
Un chiffrement par bloc est plus généralement utilisé dans le cryptage et implique :
- Une entrée — Il s'agit normalement du texte brut qui doit être chiffré.
- Une clé — Une valeur secrète censée être connue uniquement par ceux qui sont autorisés à chiffrer et déchiffrer le texte en clair.
- Une sortie — Les données cryptées, qui ne peuvent être lues qu'une fois déchiffrées avec la clé.
Bien que les fonctions de hachage n’impliquent pas vraiment quelque chose qui ressemble au décryptage, le processus de hachage présente certaines similitudes avec le cryptage. La fonction de compression Davies-Meyer transforme deux valeurs d'entrée (l'une peut être considérée comme le texte brut, tandis que l'autre peut être considérée comme la clé) et produit une seule sortie, qui ressemble beaucoup à un texte chiffré.
Le diagramme suivant montre le chiffrement par bloc SHA-2 :
Le chiffrement par bloc SHA-2
Notre autre article décrit chacune des étapes de manière détaillée, vous aidant à comprendre ce qui se passe dans chaque case et quelles valeurs composent les entrées.
SHA-2 est-il sécurisé ?
La famille d'algorithmes SHA-2 est généralement considérée comme sécurisée, c'est pourquoi elle est recommandée pour la plupart des applications où un algorithme de hachage sécurisé est nécessaire. Chacun des six algorithmes est sécurisé dans la plupart des scénarios, mais il peut y avoir certains cas où certains sont préférables aux autres.
À titre d'exemple, si les attaques par extension de longueur constituent une menace, il peut être préférable d'opter pour SHA-512/224 ou SHA-512/256, comme nous l'avons expliqué dans le Troncature section de cet article.
Des recherches approfondies ont été menées sur la sécurité de la famille SHA-2 au fil des ans, et aucun problème majeur n'est apparu. À titre d’exemple de la confiance de la communauté universitaire dans ces algorithmes, en 2016 des chercheurs a publié un article démontrant les meilleures attaques qu'ils pouvaient gérer.
Dans les cas de SHA-512, SHA-512/224 et SHA-512/256, ils n'ont pu détecter des collisions que dans des versions réduites à 27 tours de ces algorithmes. C'est bien en deçà des 80 cartouches qu'ils utilisent réellement, ce qui signifie que il y a encore une énorme marge de sécurité et nous n’avons pas trop à nous soucier de leur sécurité pour le moment . Les autres membres de la famille SHA-2 disposent également de marges de sécurité importantes.
Alternatives à SHA-2
Une famille d'algorithmes plus sécurisés a été publiée par le Institut national des normes et de la technologie en 2015. Connus sous le nom de SHA-3, ils sont généralement considérés comme plus sécurisés que la famille SHA-2.
Cependant, l’adoption de la famille SHA-3 a été limitée, car il n’y a tout simplement pas encore vraiment besoin de changement. Comme nous l’avons mentionné, les algorithmes SHA-2 disposent encore d’une grande marge de sécurité, il n’y a donc pas beaucoup de force qui incite les institutions à mettre à jour leurs algorithmes de hachage.
C’est bien d’avoir SHA-3 dans notre poche arrière, de sorte que nous disposions d’un ensemble d’algorithmes vers lesquels basculer le moment venu. Cela devrait contribuer à garantir une transition en douceur. Cependant, il n’est tout simplement pas vraiment nécessaire de franchir ce pas dans un avenir prévisible.
Vous souhaitez connaître les détails du fonctionnement de l’algorithme SHA-2 ?
Maintenant que vous savez ce qu'est SHA-2, comment il est utilisé et qu'il est toujours considéré comme sécurisé, vous souhaiterez peut-être vous rendre sur notre site Web. Qu’est-ce que SHA-2 et comment ça marche ? article. Cet article approfondit chaque étape de l'algorithme, vous aidant à comprendre comment SHA-256 peut transformer une phrase simple comme « le hachage est compliqué » en un fouillis de lettres et de chiffres comme :
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a