Quanto tempo dura o hash SHA256?

244

Vou executar SHA256com uma senha + salt, mas não sei quanto tempo devo fazer VARCHARquando configurar o banco de dados MySQL. O que é um bom comprimento?

Tony Stark
fonte
9
Antes que alguém que esteja lendo isso decida seguir este conselho e usar SHA-*senhas de hash, leia-o primeiro .
C00000fd
2
A menos que você esteja usando SHA-256 em senhas, o que você não deve fazer, os hashes terão um comprimento de 256 bits, 64 caracteres hexadecimais, 43 caracteres alfanuméricos ou 32 bytes.
caw

Respostas:

331

Um sha256 tem 256 bits - como o nome indica.

Como sha256 retorna uma representação hexadecimal, 4 bits são suficientes para codificar cada caractere (em vez de 8, como para ASCII), então 256 bits representariam 64 caracteres hexadecimais, portanto, você precisa de um varchar(64), ou mesmo a char(64), pois o comprimento é sempre o mesmo , sem variar.

E a demo:

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

Darei à você :

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

ou seja, uma string com 64 caracteres.

Pascal MARTIN
fonte
7
podemos usar char (64) como chave primária ou o binário (32) será melhor para isso? (access_token)
frankish 15/09
3
Se você acha que pode querer bloquear um usuário no futuro, sugiro usar varchar(65)como líder !... apenas dizendo.
precisa saber é
103
... ou apenas adicionar uma coluna 'bloqueada'?
Stijn de Witt
5
Como você deseja ter um sal diferente para cada senha, você deve armazená-lo próximo ao hash. Para isso, você pode usar um campo extra ou pré / anexá-lo para o hash, então você vai precisar de mais do que 64 caracteres
Patrick Cornelissen
4
você pode usar esta instrução select para testá- SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))la:, é sempre 44 qualquer que seja o comprimento da string original.
precisa saber é o seguinte
72

Opções de codificação para 256 bits do SHA256:

  1. Base64: 6 bits por caractere = CHAR(44)incluindo o caractere de preenchimento
  2. Hex: 4 bits por caractere = CHAR(64)
  3. Binário: 8 bits por byte = BINARY(32)
RickNZ
fonte
30
Base64 é de 3 bytes por 4 caracteres, por isso mesmo que 32 bytes se encaixa em 43 caracteres, você realmente precisa de 44. Um extra = é adicionado como o último personagem
Wilco
2
Bem, o =pode ser retirado e adicionado novamente.
Rick James
28

Eu prefiro usar BINARY (32), pois é a maneira otimizada!

Você pode inserir esses 32 dígitos hexadecimais de (00 a FF).

Portanto BINARY (32)!

marctrem
fonte
8
+1 - Gosto de otimizado ... para qualquer pessoa que esteja acontecendo nisso ... para usar isso no MySQL ... você pode usar UPDATE...SET hash_column=UNHEX(sha256HexString). Então, ao recuperá-lo, você SELECT HEX(hash_column) AS hash_column.
Kevin Nelson
22

Por que você faria isso VARCHAR? Isso não varia. São sempre 64 caracteres, que podem ser determinados executando qualquer coisa em uma das calculadoras online do SHA-256 .

ceejayoz
fonte
char (64) é uma instrução mysql válida?
Tony Stark
28
@hatorade: Não, não é uma declaração, mas é um tipo de coluna válido.
Mark Byers
10
O varchar também não aloca espaço, a menos que seja usado, ao contrário do char, ele aloca o número de caracteres totais permitidos, independentemente de haver dados preenchendo-o.
Xenland
6

Serão corrigidos 64 caracteres, então use char(64)

Noushad
fonte
E use CHARACTER SET ascii.
Rick James