Quelle est la longueur du hachage SHA256?

248

Je vais exécuter SHA256un mot de passe + sel, mais je ne sais pas combien de temps pour créer ma VARCHARbase de données MySQL. Quelle est une bonne longueur?

Tony Stark
la source
9
Avant que quiconque lise ceci décide de suivre ces conseils et de les utiliser SHA-*pour hacher les mots de passe, VEUILLEZ lire ceci en premier .
c00000fd
2
À moins que vous n'utilisiez SHA-256 sur les mots de passe, ce que vous ne devriez pas faire, les hachages ont une longueur de 256 bits, ou 64 caractères hexadécimaux, ou 43 caractères alphanumériques, ou 32 octets.
caw

Réponses:

337

Un sha256 mesure 256 bits - comme son nom l'indique.

Puisque sha256 renvoie une représentation hexadécimale, 4 bits sont suffisants pour coder chaque caractère (au lieu de 8, comme pour ASCII), donc 256 bits représenteraient 64 caractères hexadécimaux, donc vous avez besoin d'un varchar(64), ou même d'un char(64), car la longueur est toujours la même , ne variant pas du tout.

Et la démo:

$hash = hash('sha256', 'hello, world!');
var_dump($hash);

Te donnera :

$ php temp.php
string(64) "68e656b251e67e8358bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728"

c'est-à-dire une chaîne de 64 caractères.

Pascal MARTIN
la source
7
pouvons-nous utiliser char (64) comme clé primaire ou le binaire (32) sera-t-il meilleur pour cela? (access_token)
franque
3
Si vous pensez que vous voudrez peut-être bloquer un utilisateur à l'avenir, je vous suggère d'utiliser varchar(65)pour un leader !... juste dire.
Manatax
105
... ou simplement ajouter une colonne "bloquée"?
Stijn de Witt
5
Comme vous voulez avoir un sel différent pour chaque mot de passe, vous devez le stocker à côté du hachage. Pour cela, vous pouvez utiliser un champ supplémentaire ou le pré- / l'ajouter au hachage, vous aurez donc besoin de plus de 64 caractères
Patrick Cornelissen
4
vous pouvez utiliser cette instruction select pour la tester: SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))elle est toujours égale à 44 quelle que soit la longueur de la chaîne d'origine.
DrAhmedJava
72

Options d'encodage pour les 256 bits du SHA256:

  1. Base64: 6 bits par caractère = CHAR(44)y compris le caractère de remplissage
  2. Hex: 4 bits par caractère = CHAR(64)
  3. Binaire: 8 bits par octet = BINARY(32)
RickNZ
la source
30
Base64 est de 3 octets pour 4 caractères, donc même si 32 octets correspondent à 43 caractères, vous avez en fait besoin de 44. Un extra = est ajouté comme caractère final
Wilco
2
Eh bien, le =peut être retiré et rajouté.
Rick James
28

Je préfère utiliser BINARY (32) car c'est la manière optimisée!

Vous pouvez placer dans ces 32 chiffres hexadécimaux de (00 à FF).

Donc BINAIRE (32)!

marctrem
la source
8
+1 - J'aime optimisé ... pour quiconque s'y passe ... pour l'utiliser avec MySQL ... vous pouvez utiliser UPDATE...SET hash_column=UNHEX(sha256HexString). Ensuite, lors de la récupération, vous SELECT HEX(hash_column) AS hash_column.
Kevin Nelson
22

Pourquoi voudriez-vous en faire VARCHAR? Cela ne varie pas. Il s'agit toujours de 64 caractères, qui peuvent être déterminés en exécutant n'importe quoi dans l' une des calculatrices SHA-256 en ligne .

ceejayoz
la source
char (64) est-il une instruction mysql valide?
Tony Stark
28
@hatorade: Non, ce n'est pas une instruction, mais c'est un type de colonne valide.
Mark Byers
10
varchar n'alloue également pas d'espace à moins qu'il ne soit utilisé, contrairement à char, il alloue le nombre de caractères total autorisé, qu'il y ait ou non des données le remplissant.
Xenland
6

Il sera corrigé 64 caractères, donc utilisez char(64)

Noushad
la source
Et utilisez CHARACTER SET ascii.
Rick James