Hashage - Kasimashi/Systemes-embarques GitHub Wiki

Les fonctions de hashage cryptographique

Le terme « hash » en anglais, vient du verbe français « hacher », qui indique comment une fonction de hachage est conçue pour hacher les données. Une autre structure de données, la table de hachage, est fréquemment utilisée pour identifier rapidement deux hashs (ou « valeur de hachage ») identiques.

En vingt ans, le développement de la cryptographie s’est accéléré après que Diffie et Hellman ont identifié la nécessité d’un hachage à sens unique dans leur papier précurseursur la cryptographie à clé publique en 1976. En 1990, Ronald Rivest, cryptographe et professeur au MIT, a inventé le hachage MD4, et plus tard le hachage MD5 et MD6. En 1995, la NSA (« National Security Agency ») a conçu le SHA-1 (« Secure Hash Algorithm 1 »), inspiré de la création de Rivest, suivi de sa mise à jour SHA-2 en 2001. Le SHA-2 est le standard qui a inspiré le SHA-256, qui a lui-même servi de fondation à l’algorithme de consensus de Bitcoin.

Les fonctions de hachage cryptographique sont largement utilisées dans les pratiques de sécurité de l'information, telles que les signatures numériques, les codes d'authentification de message et d'autres formes d'authentification.

Une fonction de hachage cryptographique est une primitive cryptographique qui transforme un message de taille arbitraire en un message de taille fixe, appelé un Digest ou Condensé.

Voici les caractéristiques des fonctions de hashages les plus utilisés :

MD : Message Digest SHA : Secure Hash Algorithm CRC : Cyclic Redundancy Check

Fonction Depreciated / Collisions Longueur du digest (bytes/octet) Taille des blocs (octet)
MD5 Oui 32 64
MD6 Non 64
SHA0 Oui 40
SHA1 Oui 20 (160bits) 64
SHA224 Non 56
SHA256 Non 64 (256bits)
SHA384 Non 96
SHA512 Non 128 (512bits)
CRC-8 Oui 1
CRC-16 Oui 2
CRC-32 Oui 4

Caractéristiques

Les fonctions de hachage cryptographiques sont employées pour l'authentification, les signatures numériques et les codes d'authentification de messages (HMAC).

Pour être utilisable en cryptographie, une fonction de hachage doit disposer de ces qualités :

  • rapide à calculer (parce qu'elles sont fréquemment sollicitées)
  • non réversible (chaque digest peut provenir d'un très grand nombre de messages, et seul le brut force peut générer un message qui conduit à un digest donné)
  • résistant à la falsification (la moindre modification du message aboutit à un digest différent)
  • résistant aux collisions (il devrait être impossible de trouver deux messages différents qui produisent le même digest)

Les fonctions de hachage cryptographiques comme MD5 et SHA-1 sont considérées cassées car des attaques permettant de réduire significativement leur résistance aux collisions ont été trouvées.

Exemple

Voici le résultat du digest sur le mot Hello dans tout les fonctions de hashage :

MD2:          b27af65e6a4096536dd1252e308c2427
MD4:          a58fc871f5f68e4146474ac1e2f07419
MD5:          8b1a9953c4611296a827abf8c47804d7
MD6:          7a29293b1919e727162fa2362a9d84eb9847dfba8eceb1ea3b9b86ed9fecfd6a
SHA0:         d7f56f62cde2a044d0259adf01953bbb8f971a33
SHA1:         f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0
SHA2 224:     4149da18aa8bfc2b1e382c6c26556d01a92c261b6436dad5e3be3fcc
SHA2 256:     185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
SHA2 384:     3519fe5ad2c596efe3e276a6f351b8fc0b03db861782490d45f7598ebd0ab5fd5520ed102f38c4a5ec834e98668035fc
SHA2 512:     3615f80c9d293ed7402687f94b22d58e529b8cc7916f8fac7fddf7fbd5af4cf777d3d795a7a00a16bf7e7f3fb9561ee9baae480da9fe7a18769e71886b03f315
SHA3 224:     4cf679344af02c2b89e4a902f939f4608bcac0fbf81511da13d7d9b9
SHA3 256:     8ca66ee6b2fe4bb928a8e3cd2f508de4119c0895f22e011117e22cf9b13de7ef
SHA3 384:     df7e26e3d067579481501057c43aea61035c8ffdf12d9ae427ef4038ad7c13266a11c0a3896adef37ad1bc85a2b5bdac
SHA3 512:     0b8a44ac991e2b263e8623cfbeefc1cffe8c1c0de57b3e2bf1673b4f35e660e89abd18afb7ac93cf215eba36dd1af67698d6c9ca3fdaaf734ffc4bd5a8e34627
Keccak 224:   2a2543591ab61b478869d18143de26f24e38e9e65e666da819683a55
Keccak 256:   06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2
Keccak 384:   f0bb87a2892365fa78c9a9e3260221f489e43f0cc7a4182039d2bd17e20f98352a77ab31b0146c61d2dc2f0193c6d995
Keccak 512:   c33fede18a1ae53ddb8663710f8054866beb714044fce759790459996196f101d94dfc7bd8268577f7ee3d2f8ff0cef4004a9632227db84df62d2b40682d69e2
Shake 128:    4131f8db5745776b48b86caa68d251fa9b19cf46b92b16289bb0c98e57e0e0de
Shake 256:    555796c90bfb8f3256a1cb0d7e574877fd48750e4147cf40aa43da122b4d64dafec00acf1ff59f4c3805f9589ec1ee3b712bc3701ce7d825cba56ca4942f6ffd
RIPEMD-128:   eb507c265df625d5aa16c08f64cd0e65
RIPEMD-160:   d44426aca8ae0a69cdbc4021c64fa5ad68ca32fe
RIPEMD-256:   f42494cfc6bf93a47026de7cbcbe67b23725b406276d8f39a5f12872557b4d0e
RIPEMD-320:   ff2bd9b513aa7c77ecaf21f66a92d284d69f04e1f0fa3baa5115d5a8a5a18407f6806ca52efebdb8
HAS-160:      3bca9a7d61c6107e88f9c4fcb2728cc7e4fc13ac
Whirlpool-0:  44ad0adb6b1aca9ec6ece63b497c07a7edb27607c30b80f59d51334413cd4e1f8dec4dc60d1329cf4b42017558d1026837fda5748840e315de9c7c605e0c9eb0
Whirlpool-T:  7b5b943e8707807eb2ca5f4f3560d626486aeef265151d3c0b16bc534f8239dded9dd2cf42ab4db1ea7cfe0b74aa8d5a21d364c14930a5e0a38792e604883e33
Whirlpool:    00acca7b4456c52a74c589d668b48e1b3d33c9620a0a9b61635111aa92ed8488f21372e27b2122735e561491f8050ed2775a6fb55f7f8b24075d1166bf326bca
BLAKE2b-128:  ad10196e1159e75dd6be7d03f75be04f
BLAKE2b-160:  1eb8375ef3157dbabd45dd4950052b974e5ba68d
BLAKE2b-256:  8b7ca7d27d9fc55fa30abfe515b3afb24e3fe89fdd02e2ac92bca2c96680642e
BLAKE2b-384:  bc3868e9afae58a3c910c16ff94d1a6185e8c588f77132979395f9d01126aafe32770cfb33a8a84dddd0bf0c826cb9eb
BLAKE2b-512:  ef15eaf92d5e335345a3e1d977bc7d8797c3d275717cc1b10af79c93cda01aeb2a0c59bc02e2bdf9380fd1b54eb9e1669026930ccc24bd49748e65f9a6b2ee68
BLAKE2s-128:  a64d3482a23708aafd885b65b07f6d49
BLAKE2s-160:  dabc88ab5a5aac8f1cd5d187f51433db5e102395
BLAKE2s-256:  f73a5fbf881f89b814871f46e26ad3fa37cb2921c5e8561618639015b3ccbb71
Streebog-256: 3c10d2ffe0787bc8bd6eacd337d59c314ce689c847a422f6c34b4b75f45751bc
Streebog-512: 5bfa12a667f8da6ec0d3101f02122b6f8b7686fffcc524a7acc4c202f7b2d8f50f135405b8f4626f9ae97a8dcbec714f5294ae7b9fb32a0d6bf3dbf98a3c1d90
GOST:         f379a47bcf66e9c8fe51a6ae395de41174eebc83f792a0b0c50ac3072293e5aa
LM Hash:      FDA95FBECA288D44AAD3B435B51404EE
NT Hash:      916A8E7B1540EC179F196F8DDB603D85
SSDEEP:       3:aE:aE
CTPH:         A:Y3:Y3

Checksums:
Fletcher-8:   55
Fletcher-16:  8cf5
Fletcher-32:  0921d223
Fletcher-64:  d8d8caff6c6c65b7
Adler-32:     058c01f5
CRC-8:        f6
CRC-16:       f353
CRC-32:       f7d18982

Cadre d'utilisation

  • Il est évident qu'un mot de passe ne doit pas être stocké en clair sur une machine : on conserve uniquement sa valeur hachée (obtenue par SHA-1 ou MD5, habituellement). L'ordinateur comparera alors, lors de l'identification d'un utilisateur, l'empreinte du mot de passe stocké avec l'empreinte de celui saisi au moment de l'authentification. Cependant, si deux utilisateurs choisissent le même mot de passe, alors les condensés ainsi obtenu seront identiques, ce qui constitue une faille de sécurité. On pourrait, par exemple, "espérer" que ce mot de passe n'est pas une quelconque suite de symboles, mais un mot courant, et donc faire une attaque par dictionnaire : calculer toutes les valeurs hachées des entrées d'un dictionnaire, et les comparer au dit mot de passe. Il est possible de contrer ce type d'attaque : dans les faits, on ajoute une composante aléatoire lors de la génération initiale de l'empreinte. Cette composante, que l'on appelé "sel", qui est par exemple l'heure d'attribution du mot de passe, peut être stockée en clair. Il reste alors à concaténer le mot de passe et le sel, pour obtenir deux signatures différentes avec le même mot de passe.

image

  • On peux l'utiliser pour vérifier l'intégrité d'un fichier : On a vu que l'on pouvait utiliser des fonctions cryptographiques de hachage pour tester si un fichier a être modifié : la valeur hachée du fichier est stockée séparément, et l'intégrité du fichier est testée en comparant la valeur hachée du fichier actuel à la valeur hachée stockée.

image

MAC

Le code d’authentification de messages MAC : (Message Authentication Code) est lui aussi un peu différent des fonctions de hachage. On l’utilise entre autres pour vérifier qu’un message est bien intègre, et n’a pas subi de modifications.

La principale différence avec les fonctions de hachage est l’utilisation d’une clé secrète.