O artigo de Coda Hale "Como armazenar com segurança uma senha" afirma que:
O bcrypt possui sais embutidos para evitar ataques à tabela do arco-íris.
Ele cita este artigo , que diz que na implementação do OpenBSD de bcrypt
:
O OpenBSD gera o sal bcrypt de 128 bits a partir de um fluxo de chaves arcfour (arc4random (3)), semeado com dados aleatórios que o kernel coleta a partir das temporizações do dispositivo.
Eu não entendo como isso pode funcionar. Na minha concepção de sal:
- Ele precisa ser diferente para cada senha armazenada, para que uma tabela arco-íris separada precise ser gerada para cada senha armazenada.
- Ele precisa ser armazenado em algum lugar para que possa ser repetido: quando um usuário tenta fazer login, tentamos a senha, repetimos o mesmo procedimento de sal e hash que fizemos quando armazenamos a senha originalmente e comparamos
Quando estou usando o Devise (um gerenciador de login do Rails) com o bcrypt, não há coluna salt no banco de dados, então estou confuso. Se o sal for aleatório e não for armazenado em nenhum lugar, como podemos repetir com segurança o processo de mistura?
Em resumo, como o bcrypt pode ter sais embutidos ?
"OrpheanBeholderScryDoubt"
Acredito que essa frase deveria ter sido redigida da seguinte forma:
O
bcrypt
utilitário em si não parece manter uma lista de sais. Em vez disso, os sais são gerados aleatoriamente e anexados à saída da função, para que sejam lembrados posteriormente (de acordo com a implementação Java debcrypt
). Em outras palavras, o "hash" gerado porbcrypt
não é apenas o hash. Pelo contrário, é o hash e o sal concatenados.fonte
Bcrypt
adiciona um sal aleatório de "akd2! *", resultando em "fooakd2! *", que é hash e armazenado. Mais tarde, tento entrar com a senha "bar". Para ver se estou correto, ele precisa do hash "barakd2! *". Se o sal foi gerado aleatoriamente, como saber como adicioná-lo novamente a "bar" antes de fazer o hash e comparar?bcrypt
sabe como extrair o sal da saída gerada (que é armazenada no banco de dados). Quando chega a hora de autenticar,bcrypt
separa a saída original em seus componentes hash e salt. O componente salt é aplicado à senha de entrada digitada pelo usuário.Para tornar as coisas ainda mais claras,
Direção de registro / login ->
A senha + salt é criptografada com uma chave gerada a partir de: cost, salt e a senha. chamamos esse valor criptografado de
cipher text
. em seguida, anexamos o salt a esse valor e o codificamos usando base64. anexando o custo a ele e esta é a sequência produzida a partir debcrypt
:$2a$COST$BASE64
Este valor é armazenado eventualmente.
O que o invasor precisaria fazer para encontrar a senha? (outra direção <-)
Caso o invasor tenha controle sobre o banco de dados, o invasor decodificará facilmente o valor base64 e poderá ver o sal. o sal não é secreto. embora seja aleatório. Então ele precisará descriptografar o arquivo
cipher text
.O que é mais importante: não há hash nesse processo, mas criptografia cara da CPU - descriptografia. portanto, as tabelas arco-íris são menos relevantes aqui.
fonte
Isso é da documentação da interface PasswordEncoder da Spring Security,
O que significa que você precisará corresponder ao rawPassword que o usuário digitará novamente no próximo login e corresponderá à senha codificada em Bcrypt, armazenada no banco de dados durante o login / registro anterior.
fonte