Calculer le hachage bcrypt à partir de la ligne de commande

19

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 de Syncthing (même si je sais d'ici que je peux réinitialiser le mot de passe en modifiant le fichier de configuration pour supprimer l'utilisateur et le mot de passe dans la section gui, puis redémarrer Syncthing).

Gabriel Devillers
la source

Réponses:

26

Vous pouvez (ab) utiliser à htpasswdpartir du paquet apache-utils , à condition d'avoir la version 2.4 ou supérieure.

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

-bprend le mot de passe du deuxième argument de commande
-nimprime le hachage sur stdout au lieu de l'écrire dans un fichier
-Bindique à bcrypt
-C 10définit le coût de bcrypt à 10

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

La commande génère bcrypt avec $2y$préfixe, ce qui peut être problématique pour certaines utilisations, mais peut facilement être corrigé par un autre sedcar la variante OpenBSD using $2a$est compatible avec la variante fixe crypt_blowfish using $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: /programming//a/36225192/6732096

Démonteur
la source
Cette version a un problème avec l'implémentation BCrypt de Java Spring Security. Le mot de passe de hachage doit se terminer par un caractère nul. Spring Security semble le faire correctement. Je pense que htpasswd ne fait pas cela correctement.
k_o_
@k_o_: Pouvez-vous être plus précis sur "a un problème"? Toutes les implémentations de bcrypt utilisent le terminateur à caractère nul. Certains, comme py-bcrypt, ont même des vérifications supplémentaires pour s'assurer que le caractère nul ne fait pas partie du mot de passe. Vous pouvez vérifier l' implémentation d'Apache sur GitHub . J'utilise htpasswd avec le sed supplémentaire pour remplir les enregistrements de base de données pour plusieurs applications Spring sans problème (c'est en fait la façon dont j'arrive à la réponse).
Démonteur
Je supposais que laisser de côté le caractère nul était un problème de htpasswd pour expliquer les différents encodages entre Spring et htpasswd. La sortie de bcrypt utilisant l'approche Python de l'autre réponse produisait les mêmes résultats qu'au printemps, mais pas htpasswd. Peut-être aussi que ma version htpasswd est assez ancienne, je pense que le binaire n'a pas été mis à jour depuis 2 ans.
k_o_
11

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 y a un fichier /usr/lib64/python2.7/site-packages/bcrypt/__init__.pypour que je puisse 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 d' bcryptutilisation rounds=au lieu de log_rounds=.

meuh
la source
2
+1. FTR que vous n'avez pas besoin sudod'exécuter dnf search, cela fonctionne très bien en tant qu'utilisateur standard.
Stephen Kitt
1
En avril 2018, le paramètre log_roundssemble avoir changé pour le roundsrendre python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'.
HorstKevin
4

Complément à @Disassemblerla réponse de:

  • 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 la complexité et la 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 $?
Stuart Cardall
la source
1
Et à moins que vous ne commenciez la ligne de commande avec un espace, le mot de passe ira à votre historique shell (un fichier qui n'est probablement pas chiffré).
Gabriel Devillers
@GabrielDevillers yup, même ici. J'ai ajouté "-i" à OPTS et "" à l'avant-dernière ligne.
2018
pour l'historique BASH & mySQL pour l' rootutilisateur, c'est une bonne idée de créer un lien symbolique vers /dev/null.
Stuart Cardall
1
En ce qui concerne le commentaire de @ GabrielDevillers, il convient peut-être de mentionner que l'ajout d'un espace au début ne masque pas toujours un élément de l'historique du shell - dépend du shell et des paramètres.
tremby