functions - mysql encrypt password




Armazenando valores de hash SHA1 no MySQL (5)

O tamanho de saída de sha1 é de 160 bits. Qual é 160/8 == 20 caracteres (se você usar caracteres de 8 bits) ou 160/16 = 10 (se você usar caracteres de 16 bits).

Eu tenho uma pergunta simples que ocorreu quando eu queria armazenar o resultado de um hash SHA1 em um banco de dados MySQL:

Por quanto tempo o campo VARCHAR deve estar no qual eu armazeno o resultado do hash?


Portanto, o comprimento é entre 10 caracteres de 16 bits e 40 dígitos hexadecimais.

Em qualquer caso, decida o formato que você irá armazenar e torne o campo um tamanho fixo baseado nesse formato. Dessa forma, você não terá nenhum espaço perdido.


Um hash SHA1 tem 40 caracteres de comprimento!


Você ainda pode querer usar o VARCHAR nos casos em que nem sempre armazena um hash para o usuário (ou seja, autenticando contas / esqueceu o URL de login). Depois que um usuário autenticar / alterar suas informações de login, ele não poderá usar o hash e não deverá ter motivo para isso. Você poderia criar uma tabela separada para armazenar hash temporário -> associações de usuários que poderiam ser deletadas, mas eu não acho que a maioria das pessoas se preocupe em fazer isso.


Eu usaria VARCHAR para dados de comprimento variável, mas não com dados de comprimento fixo. Como um valor SHA-1 é sempre de 160 bits, o VARCHAR apenas desperdiçaria um byte adicional para o comprimento do campo de comprimento fixo .

E eu também não armazenaria o valor que o SHA1 está retornando. Porque ele usa apenas 4 bits por caractere e, portanto, precisaria de 160/4 = 40 caracteres. Mas se você usar 8 bits por caractere, precisará apenas de um campo de 160/8 = 20 caracteres.

Portanto, recomendo que você use BINARY(20) e a função UNHEX para converter o valor SHA1 em binário.

Eu comparei os requisitos de armazenamento para BINARY(20) e 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
);

Com milhões de registros binary(20) leva 44.56M, enquanto char(40) leva 64.57M. Motor InnoDB .







sha1