web-dev-qa-db-fra.com

Calculer le hachage bcrypt à partir de la ligne de commande

Je voudrais calculer le hachage bcrypt de mon mot de passe.

Existe-t-il un outil de ligne de commande open source qui ferait cela?

J'utiliserais ce hachage dans le fichier de configuration Syncthing (même si je sais d'ici que je peux réinitialiser le mot de passe en éditant le fichier de configuration pour supprimer l'utilisateur et le mot de passe dans la section gui, puis redémarrer Syncthing) .

22
Gabriel Devillers

Vous pouvez (ab) utiliser htpasswd depuis le package Apache-utils , à condition que vous disposiez de la version 2.4 ou supérieure.

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

-b prend le mot de passe du deuxième argument de commande
-n imprime le hachage sur stdout au lieu de l'écrire dans un fichier
-B demande d'utiliser bcrypt
-C 10 définit le coût de bcrypt sur 10

La commande nue htpasswd sort au format <nom>: <hash> suivi de deux retours à la ligne. D'où la chaîne vide pour le nom et tr supprimant les deux-points et les retours à la ligne.

La commande génère bcrypt avec $2y$ préfixe, qui peut poser problème pour certaines utilisations, mais peut facilement être corrigé par un autre sed depuis la variante OpenBSD utilisant $2a$ est compatible avec la variante fixe crypt_blowfish utilisant $2y$.

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

Lien vers la page de manuel htpasswd: https://httpd.Apache.org/docs/2.4/programs/htpasswd.html
Détails sur les variantes de bcrypt: https://stackoverflow.com/a/36225192/6732096

28
Disassembler

Vous pouvez utiliser une bibliothèque Python. Sur mon système Fedora, j'ai fait:

Sudo dnf search bcrypt

(le Sudo est juste pour éviter de gaspiller de l'espace pour un cache dnf utilisateur) et du résultat peut voir qu'il y a un paquet Python2 et 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

Installez la version Python2 et répertoriez les fichiers dans le package:

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

Cela montre qu'il existe un fichier /usr/lib64/python2.7/site-packages/bcrypt/__init__.py pour pouvoir obtenir la documentation avec

pydoc bcrypt

Cela me montre assez pour écrire la commande suivante qui hachera la chaîne "password":

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

Pour les versions ultérieures de bcrypt utilisez rounds= au lieu de log_rounds=.

11
meuh

Complémentaire à @Disassembler réponse:

  • ce n'est pas une bonne idée de passer des mots de passe depuis la ligne de commande (car le mot de passe pourrait être visible avec ps)
  • 15 est un bon équilibre entre complexité et vitesse de génération de mot de passe

Script de wrapper pour 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 $?
4
Stuart Cardall