Quero armazenar uma senha com hash (usando BCrypt) em um banco de dados. Qual seria um bom tipo para isso e qual seria o comprimento correto? As senhas com hash BCrypt são sempre do mesmo tamanho?
EDITAR
Hash de exemplo:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
Após o hash de algumas senhas, parece que o BCrypt sempre gera 60 hashes de caracteres.
EDIT 2
Desculpe por não mencionar a implementação. Estou usando o jBCrypt .
Respostas:
O formato modular de criptografia para bcrypt consiste em
$2$
,$2a$
Ou$2y$
identificar o algoritmo de hash e formato$
.
,/
,0
-9
,A
-Z
,a
-z
, que é diferente para a base de dados de padrão 64 codificação alfabeto) consistindo de:Assim, o comprimento total é de 59 ou 60 bytes, respectivamente.
Ao usar o formato 2a, você precisará de 60 bytes. E, portanto, para o MySQL, recomendo usar o
CHAR(60) BINARY
orBINARY(60)
(consulte The _bin e binary Collations para obter informações sobre a diferença).CHAR
não é binário seguro e a igualdade não depende apenas do valor do byte, mas do agrupamento real; no pior dos casos,A
é tratado como igual aa
. Consulte The_bin
ebinary
Collations para obter mais informações.fonte
SQL_Latin1_General_CP1_CS_AS
é desconhecido no MySQL. O que se sabe élatin1_general_cs
.2
,2a
e2y
média para algoritmo de hash e formato. Não consegui encontrar uma resposta fácil com algumas pesquisas.Um hash Bcrypt pode ser armazenado em um
BINARY(40)
coluna.BINARY(60)
, como as outras respostas sugerem, é a escolha mais fácil e mais natural, mas se você deseja maximizar a eficiência do armazenamento, pode salvar 20 bytes desconstruindo sem perdas o hash. Documentei isso mais detalhadamente no GitHub: https://github.com/ademarre/binary-mcfOs hashes Bcrypt seguem uma estrutura chamada de formato de criptografia modular (MCF). Binário MCF (BMCF) decodifica essas representações de hash textuais para uma estrutura binária mais compacta. No caso de Bcrypt, o hash binário resultante é de 40 bytes.
O Gumbo fez um bom trabalho ao explicar os quatro componentes de um hash do Bcrypt MCF:
A decodificação para BMCF é assim:
$<id>$
pode ser representado em 3 bits.<cost>$
, 04-31, pode ser representado em 5 bits. Coloque-os juntos por 1 byte.1 + 16 + 23
Você pode ler mais no link acima ou examinar minha implementação do PHP , também no GitHub.
fonte
Se você estiver usando PHP
password_hash()
com oPASSWORD_DEFAULT
algoritmo para gerar o hash bcrypt (o que eu assumiria que é uma grande porcentagem de pessoas lendo esta pergunta), lembre-se de que, no futuro,password_hash()
poderá usar um algoritmo diferente como padrão e, portanto, poderá afeta o comprimento do hash (mas pode não necessariamente ser mais longo).Na página do manual:
Usando bcrypt, mesmo se você tiver 1 bilhão de usuários (ou seja, atualmente você está competindo com o facebook) para armazenar hashes de senhas de 255 bytes, seriam apenas ~ 255 GB de dados - aproximadamente o tamanho de um pequeno disco rígido SSD. É extremamente improvável que armazenar o hash da senha seja o gargalo no seu aplicativo. No entanto, na possibilidade de que o espaço de armazenamento seja realmente um problema por algum motivo, você pode
PASSWORD_BCRYPT
forçar opassword_hash()
uso do bcrypt, mesmo que esse não seja o padrão. Certifique-se de manter-se informado sobre quaisquer vulnerabilidades encontradas no bcrypt e revise as notas de versão sempre que uma nova versão do PHP for lançada. Se o algoritmo padrão for alterado, seria bom revisar o motivo e tomar uma decisão informada sobre o uso ou não do novo algoritmo.fonte
Eu não acho que existem truques legais que você possa fazer para armazenar isso, como você pode, por exemplo, com um hash MD5.
Eu acho que a sua melhor aposta é armazená-lo como
CHAR(60)
sempre, com 60 caracteresfonte