Computar hash bcrypt na linha de comando

17

Gostaria de calcular o hash bcrypt da minha senha.

Existe uma ferramenta de linha de comando de código aberto que faria isso?

Eu usaria esse hash no arquivo de configuração do Syncthing (mesmo que saiba daqui que posso redefinir a senha editando o arquivo de configuração para remover o usuário e a senha na seção gui, reinicie o Syncthing).

Gabriel Devillers
fonte

Respostas:

24

Você pode (ab) usar htpasswdno pacote apache-utils , desde que tenha a versão 2.4 ou superior.

htpasswd -bnBC 10 "" password | tr -d ':\n'

-bpega a senha do segundo argumento de comando
-nimprime o hash em stdout em vez de
-Bgravá- lo em um arquivo instrui a usar bcrypt
-C 10define o custo de bcrypt para 10

O comando bare htpasswd gera no formato <name>: <hash> seguido por duas novas linhas. Daí a sequência vazia para o nome e a trremoção dos dois pontos e das novas linhas.

O comando gera bcrypt com $2y$prefixo, o que pode ser um problema para alguns usos, mas pode ser facilmente corrigido por outro, uma sedvez que a variante OpenBSD usando $2a$é compatível com a variante crypt_blowfish fixa usando $2y$.

htpasswd -bnBC 10 "" password | tr -d ':\n' | sed 's/$2y/$2a/'

Link para a página do manual htpasswd: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
Detalhes sobre as variantes do bcrypt: /programming//a/36225192/6732096

Desmontador
fonte
Esta versão tem um problema com a implementação BCrypt do Java Spring Security. A senha do hash deve ser finalizada com um caractere nulo. O Spring Security parece fazê-lo corretamente. Eu acho que o htpasswd não está fazendo isso corretamente.
k_o_
@k_o_: Você pode ser mais específico em "has a problem"? Todas as implementações de bcrypt usam o terminador de caracteres nulos. Alguns, como py-bcrypt, têm ainda verificações adicionais para garantir que caracteres nulos não façam parte da senha. Você pode verificar a implementação do Apache no GitHub . Estou usando o htpasswd com o sed adicional para preencher registros de banco de dados para vários aplicativos Spring sem problemas (é assim que chego à resposta).
Disassembler #
Eu estava assumindo que deixar de fora o caractere nulo era um problema do htpasswd para explicar as diferentes codificações entre Spring e htpasswd. A saída do bcrypt usando a abordagem Python da outra resposta estava produzindo os mesmos resultados que no Spring, mas o htpasswd não. Talvez também a minha versão do htpasswd seja bastante antiga, acho que o binário não foi atualizado há 2 anos.
k_o_
11

Você pode usar uma biblioteca Python. No meu sistema Fedora eu fiz:

sudo dnf search bcrypt

(o sudo é apenas para evitar desperdiçar espaço para um cache dnf do usuário) e, a partir do resultado, é possível ver que há um pacote Python2 e Python3:

py-bcrypt.x86_64 : Python bindings for OpenBSD's Blowfish password hashing code
python3-py-bcrypt.x86_64 : Python 3 bindings for OpenBSD's Blowfish password hashing code

Instale a versão do Python2 e liste os arquivos no pacote:

sudo dnf install py-bcrypt.x86_64
rpm -ql py-bcrypt.x86_64

Isso mostra que há um arquivo /usr/lib64/python2.7/site-packages/bcrypt/__init__.pypara que eu possa obter a documentação com

pydoc bcrypt

Isso me mostra o suficiente para escrever o seguinte comando que fará o hash da string "password":

$ python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(log_rounds=10)))'
$2a$10$vWFRZgbOx6RKOKYxCTtyWuMJM60E90Vdm/.0nj.X/o3dYUxvQ/2Dm

Para versões posteriores de bcryptuso em rounds=vez de log_rounds=.

meuh
fonte
2
+1. FTR você não precisa sudoexecutar dnf search, ele funciona bem como um usuário padrão.
Stephen Kitt
1
A partir de abril de 2018, o parâmetro log_roundsparece ter mudado para roundstorná-lo python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'.
precisa saber é o seguinte
4

Adicional à @Disassemblerresposta de:

  • não é uma boa ideia passar senhas na linha de comando (pois a senha pode ser visualizada com ps)
  • 15 é um bom equilíbrio para a velocidade de geração de complexidade / senha

Script de wrapper para htpasswd& bcrypt:

#!/bin/sh

## bcrypt passwd generator ##
#############################
CMD=$(which htpasswd 2>/dev/null)
OPTS="-nBC 15"
USERNAME=$1

usage() {
        local script=$(basename $0)
        cat <<EOF
$script: Generate Bcrypt Hashed Passwords using htpasswd

Usage: $script username
EOF
        exit 1
}

check_config() {
    if [ -z $CMD ]; then
        printf "Exiting: htpasswd is missing.\n"
        exit 1
    fi

    if [ -z "$USERNAME" ]; then
            usage
    fi
}

check_config $USERNAME
printf "Generating Bcrypt hash for username: $USERNAME\n\n"
$CMD $OPTS $USERNAME
exit $?
Stuart Cardall
fonte
1
E, a menos que você inicie a linha de comando com um espaço, a senha passará para o histórico do shell (um arquivo que provavelmente não está criptografado).
Gabriel Devillers
@GabrielDevillers sim, o mesmo aqui. Adicionei "-i" ao OPTS e "" à penúltima linha.
fácil
para o histórico BASH e mySQL para o rootusuário, é uma boa ideia criar um link simbólico /dev/null.
Stuart Cardall
1
Em relação ao comentário de @ GabrielDevillers, talvez valha a pena mencionar que adicionar um espaço ao início nem sempre oculta um item do histórico do shell - depende do shell e das configurações.
tremby 28/07/19