Berechnen Sie den bcrypt-Hash über die Befehlszeile

17

Ich würde gerne die bcrypt berechnen Hash meines Passworts .

Gibt es ein Open-Source-Kommandozeilen-Tool, das das macht?

Ich würde diesen Hash in der Syncthing-Konfigurationsdatei verwenden (auch wenn ich von hier aus weiß , dass ich das Passwort zurücksetzen kann, indem ich die Konfigurationsdatei bearbeite, um den Benutzer und das Passwort im GUI-Abschnitt zu entfernen, und dann Syncthing neu starte).

Gabriel Devillers
quelle

Antworten:

23

Sie können (ab) Verwendung htpasswdvon Apache-utils - Paket, vorausgesetzt , Sie haben die Version 2.4 oder höher.

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

-bNimmt man das Kennwort aus dem zweiten Befehlsargument,
-ndruckt man den Hash nach stdout, anstatt ihn in eine Datei
-Bzu schreiben. Die Anweisung, bcrypt zu verwenden,
-C 10setzt die bcrypt- Kosten auf 10

Der Befehl bare htpasswd gibt im Format <Name>: <Hash> aus, gefolgt von zwei Zeilenumbrüchen. Daher die leere Zeichenfolge für den Namen und trdas Entfernen des Doppelpunkts und der Zeilenumbrüche.

Der Befehl gibt bcrypt mit $2y$Präfix aus, was für einige Anwendungen problematisch sein kann, aber von anderen leicht behoben werden kann, sedda die OpenBSD-Variante using $2a$mit der festen crypt_blowfish-Variante using kompatibel ist $2y$.

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

Link zur htpasswd-Manpage: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
Details zu bcrypt-Varianten: /programming//a/36225192/6732096

Disassembler
quelle
Diese Version hat ein Problem mit der BCrypt-Implementierung von Java Spring Security. Das Passwort für den Hash muss mit einem Null-Zeichen abgeschlossen werden. Spring Security scheint es richtig zu machen. Ich denke, htpasswd macht das nicht richtig.
k_o_
@k_o_: Kannst du genauer auf "hat ein Problem" eingehen? Alle bcrypt-Implementierungen verwenden das Nullzeichen-Abschlusszeichen. Einige, wie py-bcrypt, haben sogar zusätzliche Überprüfungen, um sicherzustellen, dass das Nullzeichen nicht Teil des Passworts ist. Sie können die Apache-Implementierung auf GitHub überprüfen . Ich benutze htpasswd mit dem Zusatz sed, um problemlos Datenbankeinträge für mehrere Spring-Anwendungen zu füllen (so komme ich eigentlich zur Antwort).
Disassembler
Ich ging davon aus, dass das Weglassen des Nullzeichens ein Problem von htpasswd ist, um die verschiedenen Codierungen zwischen Spring und htpasswd zu erklären. Die Ausgabe von bcrypt unter Verwendung des Python-Ansatzes der anderen Antwort lieferte dieselben Ergebnisse wie in Spring, jedoch nicht htpasswd. Vielleicht ist auch meine htpasswd-Version ziemlich alt, ich denke die Binärdatei wurde seit 2 Jahren nicht mehr aktualisiert.
k_o_
11

Sie können eine Python-Bibliothek verwenden. Auf meinem Fedora-System habe ich:

sudo dnf search bcrypt

(das sudo ist nur, um Platz für einen Benutzer-dnf-Cache nicht zu verschwenden) und aus dem Ergebnis geht hervor, dass es ein Python2- und ein Python3-Paket gibt:

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

Installieren Sie die Python2-Version und listen Sie die Dateien im Paket auf:

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

Dies zeigt, dass es eine Datei gibt /usr/lib64/python2.7/site-packages/bcrypt/__init__.py, mit der ich die Dokumentation erhalten kann

pydoc bcrypt

Dies zeigt mir genug, um den folgenden Befehl zu schreiben, der den String hasht "password":

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

Für spätere Versionen bcryptverwenden rounds=statt log_rounds=.

meuh
quelle
2
+1. FTR müssen Sie nicht sudoausführen dnf search, es funktioniert gut als Standardbenutzer.
Stephen Kitt
1
Ab April 2018 log_roundsscheint sich der Parameter geändert zu roundshaben python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'.
HorstKevin
4

Ergänzend zu @Disassembler's Antwort:

  • Es ist keine gute Idee, Kennwörter über die Befehlszeile einzugeben (da das Kennwort mit angezeigt werden kann ps).
  • 15 ist ein gutes Gleichgewicht zwischen Komplexität und Geschwindigkeit der Passworterstellung

Wrapper-Skript für 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
quelle
1
Wenn Sie die Befehlszeile nicht mit einem Leerzeichen beginnen, wird das Kennwort in den Shell-Verlauf übernommen (eine Datei, die wahrscheinlich nicht verschlüsselt ist).
Gabriel Devillers
@ GabrielDevillers yup, das gleiche hier. Ich habe "-i" zu OPTS und "" zur vorletzten Zeile hinzugefügt.
21.
Für die BASH & mySQL-Historie ist es für den rootBenutzer eine gute Idee, eine symbolische Verknüpfung zu erstellen /dev/null.
Stuart Cardall
1
In Bezug auf den Kommentar von @ GabrielDevillers ist es vielleicht erwähnenswert, dass das Hinzufügen eines Leerzeichens zum Start nicht immer ein Element aus dem Shell-Verlauf verbirgt - dies hängt von der Shell und den Einstellungen ab.
Tremby