Algoritmo de hash de senha

Estou buscando poder usar os hashes de senha armazenados no Discourse em um arquivo htpassword para outro aplicativo.

Qual algoritmo de hash de senha o Discourse utiliza?

Desculpe se estou entendendo mal, mas você está dizendo que quer efetivamente copiar o algoritmo de hash do Discourse para seu próprio aplicativo, de modo a poder comparar os hashes gerados pelo seu aplicativo com os armazenados pelo Discourse? Isso não exigiria que você sincronizasse regularmente as senhas do Discourse com seu arquivo htpasswd, lidasse com os salts que o Discourse pode ou não ter atualmente ou no futuro e mantivesse sua implementação do algoritmo de hash sincronizada com o algoritmo do Discourse para sempre?

Novamente, desculpe se estou completamente entendendo mal, mas precisei pedir esclarecimentos por pura curiosidade.

Apenas para verificar se um nome de usuário e senha são válidos.

Um usuário fornece um nome de usuário e uma senha. Verificamos se a senha fornecida é válida de acordo com o hash do Discourse. Não geraremos nenhum hash.

Ao dizer “gera”, não quis dizer armazenar, mas validar se a senha está correta.


Fico imaginando se o Discourse tem SSO na direção oposta, para que as pessoas possam fazer login em outros aplicativos usando o Discourse diretamente.

Sim, o Discourse pode ser usado como autoridade para o login, e este é o caminho correto @csmu. Tentar duplicar o método de hash significaria que seu método de login quebraria sempre que ele mudar.

Além disso, isso não levaria em conta os usuários que não possuem uma senha local.

Se você não está disposto ou não consegue ler o código-fonte para encontrar a resposta à sua pergunta, talvez seja melhor dar um passo atrás e descrever qual problema você está tentando resolver.

Consegui ler a fonte assim que a encontrei. Procurei pela fonte - em busca de user.password - e concentrei-me principalmente no user_controller. Nada chamou minha atenção. Agradeceria qualquer orientação sobre onde procurar.

O que funcionaria para mim seria validar um usuário/senha no Discourse sem precisar adicionar um login SSO. Talvez através da API ou de uma chamada direta a algum código Ruby.

Ah, sim. O Rails só faz sentido depois que você sabe onde as coisas estão. Aqui está isso

Mas eu ainda recomendo dar um passo atrás e descrever o problema em vez de começar com a sua solução.

Obrigado, Jay —

Depois de ler

 def confirm_password?(password)
    return false unless password_hash && salt
    self.password_hash == hash_password(password, salt)
  end

em user.rb

o seguinte funciona para validação direta em Ruby:

user = User.find_by_email('some.email.address')
user.confirm_password?('valid-password')
=> true

Estava experimentando um arquivo .htaccess para um servidor e procurava uma maneira de validar um nome de usuário/senha através do Discourse para esse servidor, sem precisar conhecer as senhas para gerar o arquivo .htaccess. A abordagem SSO é melhor, e saber como validar um nome de usuário/senha sem usar SSO será útil para mim.

Olá,
Gostaria de saber qual função de hash de senha e quais parâmetros associados (comprimento do hash, salt, qual biblioteca específica é chamada) são utilizados para o login local. Analisar o arquivo Ruby mencionado anteriormente não me ajudou. Preciso dessas informações para fins de conformidade: as melhores práticas em torno do GDPR (e, de modo geral, no âmbito da segurança de sistemas) exigem que eu documente essas informações.

Edição: encontrei a resposta aqui: Export password hashes in the PHC format → discourse/docs/SECURITY.md at main · discourse/discourse · GitHub