web-dev-qa-db-fra.com

Stocker les valeurs de hachage SHA1 dans MySQL

J'ai une question simple qui s'est posée lorsque 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 contenir le résultat du hachage?

154
niklasfi

J'utiliserais VARCHAR pour les données de longueur variable, mais pas avec les données de longueur fixe. Parce qu'une valeur SHA-1 est toujours longue de 160 bits, le VARCHAR gaspille simplement n octet supplémentaire pour la longueur) du champ de longueur fixe .

Et je ne voudrais pas non plus stocker 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 champ de 160/8 = 20 caractères.

Je vous recommande donc d'utiliser BINARY(20) et la fonction UNHEX pour convertir la valeur SHA1 En binaire.

J'ai comparé les besoins 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 Mo, tandis que char(40) prend 64,57 M. InnoDB moteur.

306
Gumbo

Un hachage SHA1 est long de 40 caractères!

42
schmilblick

Référence tirée de ce blog:

Vous trouverez ci-dessous une liste de l'algorithme de hachage avec sa taille de bit requise:

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

Création d'un exemple de table avec require 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)
);
11
Anvesh

La taille de sortie de sha1 est de 160 bits. Ce 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
inazaruk

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 attribuez au champ une taille fixe en fonction de ce format. De cette façon, vous ne perdrez pas d’espace.

3
Douglas Leeder

Si vous avez besoin d'un index sur la colonne sha1, je suggère CHAR (40) pour des raisons de performances. Dans mon cas, la colonne sha1 est un jeton de confirmation de courrier électronique. Ainsi, sur la page de destination, la requête entre uniquement avec le jeton. Dans ce cas, CHAR (40) avec INDEX est, à mon avis, le meilleur choix :)

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

2
Francesco Casula

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

2
Keith Harty