web-dev-qa-db-fra.com

Pourquoi un SHA-1 Hash 40 caractères s'il n'est que de 160 bits?

Le titre de la question dit tout. J'ai fait des recherches sur SHA-1 et la plupart des endroits où je vois qu'il fait 40 caractères hexadécimaux, ce qui pour moi est de 640 bits. Ne pourrait-il pas être aussi bien représenté avec seulement 10 caractères hexadécimaux 160 bits = 20 octets. Et un caractère hexadécimal peut représenter 2 octets à droite? Pourquoi est-il deux fois plus long que nécessaire? Qu'est-ce que je manque dans ma compréhension.

Et un SHA-1 ne pourrait-il avoir que 5 caractères ou moins si vous utilisez Base32 ou Base36?

37
AGrunewald

Un caractère hexadécimal ne peut représenter que 16 valeurs différentes, soit 4 bits. (16 = 24)

40 × 4 = 160.


Et non, vous avez besoin de beaucoup plus de 5 caractères en base-36.

Il y a totalement 2160 différents hachages SHA-1.

2160 = 1640, c'est donc une autre raison pour laquelle nous avons besoin de 40 chiffres hexadécimaux.

Mais 2160 = 36160 bûches362 = 3630.9482 ..., vous avez donc besoin de 31 caractères en base 36.

83
kennytm

Je pense que la confusion de l'OP provient d'une chaîne représentant un hachage SHA1 prend 40 octets (au moins si vous utilisez ASCII), ce qui équivaut à 320 bits (pas 640 bits).

La raison en est que le hachage est en binaire et la chaîne hexadécimale n'est qu'un encodage de cela. Donc, si vous deviez utiliser un encodage plus efficace (ou pas d'encodage du tout), vous ne pourriez prendre que 160 bits d'espace (20 octets), mais le problème avec cela est qu'il ne sera pas binaire.

Vous pouvez cependant utiliser base64, auquel cas vous auriez besoin d'environ 27-28 octets (ou caractères) au lieu de 40 (voir cette page ).

12
NullUserException

Il y a deux caractères hexadécimaux par octet de 8 bits, pas deux octets par caractère hexadécimal.

Si vous travaillez avec des octets 8 bits (comme dans la définition SHA-1), un caractère hexadécimal code un seul quartet haut ou bas 4 bits dans un octet. Il faut donc deux de ces caractères pour un octet complet.

9
Jeffrey L Whitledge

2 caractères hexadécimaux composent une plage de 0 à 255, c'est-à-dire 0x00 == 0 et 0xFF == 255. Donc, 2 caractères hexadécimaux font 8 bits, ce qui fait 160 bits pour votre SHA condensé.

5
Jim Brissom

SHA-1 est 160 bits

Cela se traduit par 20 octets = 40 caractères hexadécimaux (2 caractères hexadécimaux par octet)

4
dipendu

Ma réponse ne diffère des précédentes que dans ma théorie quant à l'origine EXACTE de la confusion de l'OP, et dans les étapes du bébé, je fournis des éclaircissements.

Un caractère occupe différents nombres d'octets selon l'encodage utilisé ( voir ici ). Il y a quelques contextes de nos jours où nous utilisons 2 octets par caractère, par exemple lors de la programmation en Java ( voici pourquoi ). Ainsi 40 Java caractères équivaudraient à 80 octets = 640 bits, le calcul de l'OP, et 10 Java encapsuleraient en effet la bonne quantité d'informations pour un hachage SHA-1.

Contrairement aux milliers de caractères Java Java possibles, il n’existe cependant que 16 caractères hexadécimaux différents , à savoir 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E et F. Mais ce ne sont pas les mêmes que Java caractères, et prenez beaucoup moins d'espace que les encodages des caractères Java caractères 0 à 9 et A à F. Ce sont des symboles signifiant toutes les valeurs possibles représentées par seulement 4 bits:

0  0000    4  0100    8  1000    C  1100
1  0001    5  0101    9  1001    D  1101
2  0010    6  0110    A  1010    E  1110
3  0011    7  0111    B  1011    F  1111

Ainsi, chaque caractère hexadécimal n'est que d'un demi-octet, et 40 caractères hexadécimaux nous donnent 20 octets = 160 bits - la longueur d'un hachage SHA-1.

4
Reg