Stockage des valeurs de hachage SHA1 dans MySQL

J'ai une question simple qui s'est produite quand je voulais stocker le résultat D'un hachage SHA1 dans une base de données MySQL:

Combien de temps le champ VARCHAR doit-il être dans lequel je stocke le résultat du hachage?

142
demandé sur Gumbo 2009-03-05 14:57:16

7 réponses

J'utiliserais VARCHAR pour les données de longueur variable, mais pas avec des données de longueur fixe. Parce qu'une valeur SHA-1 est Toujours 160 bits de long, le {[1] } gaspillerait simplement un octet supplémentaire pour la longueur du champ de longueur fixe .

Et je ne stockerais pas non plus la valeur SHA1 est de retour. Parce qu'il utilise seulement 4 bits par caractère et aurait donc besoin de 160/4 = 40 caractères. Mais si vous utilisez 8 bits par caractère, vous n'aurez besoin que d'un caractère de 160/8 = 20 champ.

Donc, je vous recommande d'utiliser BINARY(20) et la UNHEX la fonction pour convertir les SHA1 valeur binaire.

J'ai comparé les exigences de stockage pour BINARY(20) et CHAR(40).

CREATE TABLE `binary` (
    `id` int unsigned auto_increment primary key,
    `password` binary(20) not null
);
CREATE TABLE `char` (
    `id` int unsigned auto_increment primary key,
    `password` char(40) not null
);

Avec des millions d'enregistrements binary(20) prend 44,56 m, tandis que char(40) prend 64,57 M. InnoDB moteur.

292
répondu Gumbo 2015-08-18 11:15:44

Un hachage SHA1 a 40 caractères de long!

37
répondu schmilblick 2009-03-05 11:58:50

Référence prise à partir de ce blog:

Voici une liste de l'algorithme de hachage avec sa taille de bit requise:

  • MD5 = valeur de hachage 128 bits.
  • SHA1 = valeur de hachage de 160 bits.
  • SHA224 = valeur de hachage 224 bits.
  • SHA256 = valeur de hachage 256 bits.
  • SHA384 = valeur de hachage de 384 bits.
  • SHA512 = valeur de hachage de 512 bits.

Créé un exemple de table avec besoin CHAR(n):

CREATE TABLE tbl_PasswordDataType
(
    ID INTEGER
    ,MD5_128_bit CHAR(32)
    ,SHA_160_bit CHAR(40)
    ,SHA_224_bit CHAR(56)
    ,SHA_256_bit CHAR(64)
    ,SHA_384_bit CHAR(96)
    ,SHA_512_bit CHAR(128)
); 
INSERT INTO tbl_PasswordDataType
VALUES 
(
    1
    ,MD5('SamplePass_WithAddedSalt')
    ,SHA1('SamplePass_WithAddedSalt')
    ,SHA2('SamplePass_WithAddedSalt',224)
    ,SHA2('SamplePass_WithAddedSalt',256)
    ,SHA2('SamplePass_WithAddedSalt',384)
    ,SHA2('SamplePass_WithAddedSalt',512)
);
9
répondu Anvesh 2018-08-10 10:34:46

La Taille de sortie de sha1 est de 160 bits. Qui est 160/8 = = 20 caractères (si vous utilisez des caractères 8 bits) ou 160/16 = 10 (si vous utilisez des caractères 16 bits).

6
répondu inazaruk 2009-03-05 12:03:06

Donc, la longueur est comprise entre 10 caractères 16 bits et 40 chiffres hexadécimaux.

Dans tous les cas, décidez du format que vous allez stocker, et faites du champ une taille fixe en fonction de ce format. De cette façon, vous n'aurez pas d'espace gaspillé.

3
répondu Douglas Leeder 2009-03-05 12:17:00

Vous pouvez toujours utiliser VARCHAR dans les cas où vous ne stockez pas toujours un hachage pour l'utilisateur (c'est-à-dire l'authentification des comptes/l'url de connexion oubliée). Une fois qu'un utilisateur a authentifié / modifié ses informations de connexion, il ne devrait pas pouvoir utiliser le hachage et ne devrait avoir aucune raison de le faire. Vous pouvez créer une table séparée pour stocker le hachage temporaire - > les associations d'utilisateurs qui pourraient être supprimées, mais je ne pense pas que la plupart des gens prennent la peine de le faire.

2
répondu Keith Harty 2011-05-25 22:26:15

Si vous avez besoin d'un index sur la colonne sha1, je suggère CHAR (40) pour des raisons de performance. Dans mon cas, la colonne sha1 est un jeton de confirmation par e-mail, donc sur la page de destination, la requête Entre uniquement avec le jeton. Dans ce cas, CHAR (40) avec INDEX, à mon avis, est le meilleur choix:)

Si vous voulez adopter cette méthode, n'oubliez pas de laisser $raw_output = false.

2
répondu Francesco Casula 2012-05-31 07:42:55