Preciso armazenar o sal com o bcrypt?

189

O javadoc do bCrypt possui este código para saber como criptografar uma senha:

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); 

Para verificar se uma senha de texto sem formatação corresponde a uma senha que foi hash anteriormente, use o método checkpw:

if (BCrypt.checkpw(candidate_password, stored_hash))
    System.out.println("It matches");
else
    System.out.println("It does not match");

Esses trechos de código implicam para mim que o sal gerado aleatoriamente é jogado fora. É esse o caso ou é apenas um trecho de código enganoso?

RodeoClown
fonte

Respostas:

214

O sal é incorporado ao hash (codificado em um formato no estilo base64).

Por exemplo, nas senhas tradicionais do Unix, o salt foi armazenado como os dois primeiros caracteres da senha. Os caracteres restantes representavam o valor do hash. A função verificador sabe disso e separa o hash para retirar o sal.

Greg Hewgill
fonte
59
O salt está incorporado na senha. Então você não precisa salvar o sal.
Swapnonil Mukherjee 10/11/2008
2
Obrigado por isso. Gostaria que disse que no javadoc :) (Eu olhei para a fonte e confirmou - mas eu não sabia o que eu estava procurando antes)
RodeoClown
1
Obrigado - eu estava tentando descobrir isso também! Agora estou me perguntando se isso é uma boa ideia. Existe uma vantagem / desvantagem em manter o sal no hash em vez de armazená-lo separadamente?
Adam
8
@ Adam - Como o sal é gerado aleatoriamente, significa que você não precisa ter um método para associar as duas coisas no seu banco de dados.
RodeoClown 26/01
Examinei o código-fonte e descobri que, embora o JavaDoc para o argumento salt seja "talvez gerado usando BCrypt.gensalt", descobri que você precisa usar o método genSalt () ou obtém exceções = /
the_new_mr