
SHA-1 (Secure Hash Algorithm, prononcé /ʃa.œ̃/) est une fonction de hachage cryptographique conçue par la National Security Agency des États-Unis (NSA), et publiée par le gouvernement des États-Unis comme un standard fédéral de traitement de l'information (Federal Information Processing Standard du National Institute of Standards and Technology (NIST)). Elle produit un résultat (appelé « hash » ou condensat) de 160 bits (20 octets), habituellement représenté par un nombre hexadécimal de 40 caractères.
SHA-1 n'est plus considéré comme sûr contre des adversaires disposant de moyens importants. En 2005, des cryptanalystes ont découvert des attaques sur SHA-1, suggérant que l'algorithme n'était pas suffisamment sûr pour continuer à l'utiliser. Depuis 2010, de nombreuses organisations ont recommandé son remplacement par SHA-2 ou SHA-3,,. Microsoft, Google et Mozilla,, ont annoncé que leurs navigateurs respectifs cesseraient d'accepter les certificats SHA-1 au plus tard en 2017.
La fonction de hachage SHA-1 succède à SHA-0 qui a été rapidement mise de côté par le NIST pour des raisons de sécurité insuffisante. SHA-0 était légitimement soupçonné de contenir des failles qui permettraient d'aboutir rapidement à des collisions (deux documents différents qui génèrent le même condensat). Face à la controverse soulevée par le fonctionnement de SHA-0 et certains constats que l'on attribue à la NSA, SHA-0 a été modifiée peu après sa sortie (1993) pour devenir SHA-1 (1995). Une collision complète sur SHA-0 a été effectivement découverte par Antoine Joux et al. en .
En 2005, la cryptanalyste Xiaoyun Wang et ses co-auteurs Yiqun Lisa Yin et Hongbo Yu annoncent une attaque théorique pour la recherche de collisions pour SHA-1 qui est nettement plus efficace que l'attaque des anniversaires (l'attaque générique de référence). L'attaque complète sera publiée à Crypto 2015. Le NIST pour sa part recommande de passer à SHA-2 ou SHA-3 quand c'est possible. Depuis 2013, Microsoft a déclaré l’obsolescence de SHA-1 et en 2014. L'ANSSI déconseille son utilisation dans la seconde version de son Référentiel Général de Sécurité (RGS) d'application au . Enfin, Google annonce que ses versions de Chrome n'accepteront plus, de façon graduelle, SHA-1 jusqu'à refuser les certificats l'utilisant qui expirent après le .
En Google et le Centrum voor Wiskunde en Informatica annoncent une attaque effective et la première collision pour SHA-1.
Voici la signature obtenue sur une phrase (codée en utf8) :
SHA1("Wikipédia, l'encyclopédie libre et gratuite") = 6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.
En modifiant un caractère, la signature change radicalement :
SHA1("Wikipédia, l'encyclopédie libre et gratuitE") = 11F453355B28E1158D4E516A2D3EDF96B3450406.
Le SHA-1 est un excellent générateur de nombres pseudo-aléatoires (comme beaucoup de fonctions de hachage) et il passe avec succès tous les tests statistiques.
En résumé les caractéristiques de SHA-1 sont les suivantes :
L’attaque des anniversaires, qui est l'attaque générique sur les fonctions de hachage cryptographique pour trouver une collision, permet de trouver (théoriquement) celle-ci en 280 opérations, ce qui est donc la sécurité attendue pour une telle fonction de hachage. Mais dans le cas de SHA-1, il existe une attaque (théorique) en 269 opérations connue depuis 2005. C'est attaque a été améliorée en une attaque en 263 opérations, et une collision a effectivement été découverte en 2017.
Une attaque brute basée sur le paradoxe des anniversaires permet de trouver une collision complète sur une clé SHA-1 complète (sur 160 bits) avec un nombre d'opérations de l'ordre de .
En 2005, Rijmen et Oswald ont publié une attaque sur une version simplifiée du SHA-1 (53 tours), leur attaque permet de trouver une collision avec moins de opérations.
En , Bruce Schneier a fait état d'une attaque sur la version complète du SHA-1 par l'équipe chinoise de Wang, Yin et Yu. Leur méthode permet de trouver :
La description de l'attaque a été publiée en .
Le , une amélioration de l'attaque a été annoncée par Wang et al. à la conférence CRYPTO 2005, la complexité passe ainsi de 269 à 263, soit une division par 64 de la complexité originale.
Lors de l'Eurocrypt 2009 (avril), une amélioration de l'attaque aurait permis de réduire à nouveau sa complexité jusqu'à atteindre . Toutefois, ces résultats furent démentis et l'article fut retiré à la suite de la découverte d'une erreur dans l'évaluation de cette complexité.
Une équipe composée de chercheurs de chez Google et du CWI (Centrum Wiskunde et Informatica) ont annoncé le qu'ils avaient réussi à obtenir une collision entre deux documents,.
Une équipe composée de chercheurs universitaires (Gaëtan Leurent de l'Inria en France et son collègue Thomas Peyrin de l'Université de Nanyang à Singapour) a annoncé en début avoir mis au point une attaque sur la version complète de SHA-1 (80 tours) permettant d'obtenir pour n'importe quelle valeur de hachage une collision sur des préfixes choisis en un nombre d'opérations situé entre et , ce qui réduit le coût d'obtention de collisions à moins de 150 000 $, à la portée d'une organisation de moyenne taille (ou de bandes organisées) et plus seulement de grandes organisations ou de gouvernements, basée sur une analyse différentielle multi-bloc (et non un bloc unique avec les tentatives précédentes), ce qui permet d'en améliorer l'efficacité en réduisant l'espace de recherche de façon incrémentielle. En , ces mêmes chercheurs ont annoncé avoir amélioré leur attaque et pouvoir obtenir une collision en opérations, pour un coût de 45k$. Les investigations continuent pour déterminer le coût minimum de ce type d'attaque qui pourrait en pratique s'avérer même inférieur (des attaques similaires sont démontrées également sur d'autres algorithmes de hachage similaires, y compris MD5 qui était déjà connu pour être cassé mais qui le devient encore plus facilement). Toutefois l'attaque annoncée ne concerne pas encore les empreintes de messages (ou signatures) HMAC basées sur SHA-1,.
La fonction de hachage SHA-1 est une fonction de hachage itérative, c'est-à-dire qu'elle itère sur le message en entrée découpé en blocs successifs de même taille une fonction, dite fonction de compression pour produire un condensé, ou haché, ou empreinte de taille fixe. Plus précisément elle repose sur la construction de Merkle-Damgård, c'est-à-dire que l'entrée est complétée par un procédé dur de bourrage pour que sa longueur soit un multiple de la taille du bloc, le dernier bloc contenant une représentation binaire de la taille de l'entrée initiale,, ce qui permet de réduire la résistance aux collisions de la fonction de hachage à celle de la fonction de compression. Son fonctionnement est similaire à celui des fonctions MD4 et MD5 de Ronald Rivest.
Dans le cas de SHA-1 on a :
Cette dernière limitation (théorique) vient du fait que la longueur de l'entrée, ajoutée dans le dernier bloc, est stockée sur 64 bits.
La fonction de compression est construite à partir d'opérations sur des mots de 32 bits, qui représentent des entiers non-signés inférieurs à 232. Ces opérations sont :
Ces opérations s'implémentent de façon extrêmement efficace, mais combinées de façon adéquate, elles permettent d'obtenir une sortie qui parait avoir les qualités recherchées pour une fonction de hachage (en particulier résistance à la collision, résistance à la préimage).
Les spécifications de SHA-1 sont décrites pour la première fois en dans le document officiel du NIST FIPS 180-1 pour un standard de fonction de hachage cryptographique, puis reprises dans les versions successives de ce document jusqu'à la version de 2015 du FIPS-180-4. Elles ne seront pas reprises dans la version suivante. Elles sont largement accessibles sur Internet,.
Le bourrage consiste à compléter le message initial M de longueur en bits l< 264, pour obtenir un message M' dont la longueur est un multiple de 512 bits (la taille de bloc). L'injectivité du procédé est une condition nécessaire : on aurait une collision évidente si M ≠ N mais que, après bourrage M' = N'.
Le message complété M' est obtenu en concaténant à la fin du message M un bit à 1 suivi d'une suite de bits à 0 dont la longueur dépend de l, suivie de la représentation binaire de l, codée sur 64 bits, c'est-à-dre que les 64 derniers bits de M' sont réservés à cet usage. La longueur de la suite de bits à 0 est la plus petite pour laquelle la longueur du message complété M' est un multiple de 512.
Le message complété M' est découpé en n blocs de 512 bits consécutifs, soient M(1) , … , M(n). La concaténation est notée ||, on a :
L'algorithme itère une fonction de compression, soit compress : {0,1}160 × {0,1}512 → {0,1}160, et utilise un vecteur d'initialisation IV de 160 bits. Il produit une suite Hi de valeurs de chaînage de 160 bits, la dernière valeur étant le haché.
Le vecteur d'initialisation de 160 bits IV est composé de 5 mots de 32 bits dont les valeurs sont données en hexadécimal (un chiffre hexadécimal représente 4 bits) dans les spécifications,.
Dans ce qui suit les opérations sur les mots de 32 bits utilisées sont notées :
En notant << et >> les décalages ordinaires vers la gauche et vers la droite :
alors x <<< s = (x << s) ∨ (x >> (32-s)).
La fonction de compression prend en entrée une valeur de chaînage H, analysée en 5 mots de 32 bits, et un bloc de 512 bits B analysé en 16 mots de 32 bits. La première phase est une phase d'expansion : le bloc B est étendu en un tableau W de 80 mots de 32 bits par la précédure suivante :
fonction expand(B){ Le bloc B de 512 bits et vu comme un tableau de 16 mots de 32 bits B[0] … B[15]
W est un tableau de 80 mots de 32 bits W[0] … W[79]
pour i de 0 à 79 {
si i < 16
alors W[i]:= B[i]
sinon W[i] := (W[i – 3] ⊕ W[i – 8] ⊕ W[i – 14] ⊕ W[i – 16]) <<< 1 Ce décalage circulaire vers la
gauche de 1 bit est la seule
différence avec SHA-0 sur
l'ensemble de l'algorithme
}
renvoyer(W)
}
fonction compress(H,B) {
(a0,b0,c,d0,e0) := H H est analysé comme 5 mots de 32 bits
(a,b,c,d,e) = (a0,b0,c0,d0,e0)
W := expand(B)
pour t de 0 à 79 {
temp := (a <<< 5) + f(t, b, c, d) + e + K[t] + W[t]
(a, b, c, d, e) := (temp, a, b <<< 30, c, d)
}
H := (a+a0, b+b0, c+c0, d+d0, e+e0)
renvoyer(H)
}
La fonction f en jeu à chacun des 80 tours est calculée par opérations bit à bit sur ses 3 derniers arguments et prend 3 formes différentes, en fonction du numéro de tour (premier argument), :
0 ≤ t < 20 : f(t, b, c, d) = (b ∧ c) ⊕ (¬b ∧ d) (= (b ∧ c) ∨ (¬b ∧ d) ) 20 ≤ t < 40 : f(t, b, c, d) = b ⊕ c ⊕ d 40 ≤ t < 60 : f(t, b, c, d) = (b ∧ c) ⊕ (b ∧ d) ⊕ (c ∧ d) (= (b ∧ c) ∨ (b ∧ d) ∨ (c ∧ d )) 60 ≤ t < 80 : f(t, b, c, d) = b ⊕ c ⊕ d
Les constantes de 32 bits K[t] prennent 4 valeurs différentes suivant le numéro de tour t, elles sont définies dans les spécifications,.
Les primitives des fonctions de hachage cryptographiques sont assez proches de celles des chiffrements symétriques. SHA-1, a été adaptée par Helena Handschuh et David Naccache pour obtenir un chiffrement par bloc appelé SHACAL.
E.A.Grechnikov,Collisions for 72-step and 73-step SHA-1: Improvements in the Method of Characteristics, (http://eprint.iacr.org/2010/413)