Calcola l'hash bcrypt dalla riga di comando


19

Vorrei calcolare l' hash bcrypt della mia password.

Esiste uno strumento da riga di comando open source che lo farebbe?

Vorrei usare questo hash nel file di configurazione di Syncthing (anche se so da qui che posso ripristinare la password modificando il file di configurazione per rimuovere l'utente e la password nella sezione gui, quindi riavviare Syncthing).

Risposte:


26

Puoi (ab) usare htpasswddal pacchetto apache-utils , a condizione che tu abbia la versione 2.4 o successiva.

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

-bprende la password dal secondo argomento del comando
-nstampa l'hash su stdout invece di scriverla in un file
-Bindica di usare bcrypt
-C 10imposta il costo di bcrypt su 10

Il comando bare htpasswd viene visualizzato nel formato <nome>: <hash> seguito da due nuove righe. Da qui la stringa vuota per nome e trstripping dei due punti e delle nuove linee.

Il comando genera bcrypt con $2y$prefisso, che può essere un problema per alcuni usi, ma può essere facilmente risolto da un altro sedpoiché la variante OpenBSD che utilizza $2a$è compatibile con la variante fissa crypt_blowfish che utilizza $2y$.

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

Link alla pagina man htpasswd: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
Dettagli sulle varianti di bcrypt: /programming//a/36225192/6732096


Questa versione presenta un problema con l'implementazione BCrypt di Java Spring Security. La password per l'hash deve essere terminata con un carattere null. Spring Security sembra farlo correttamente. Penso che htpasswd non lo stia facendo correttamente.
k_o_

@k_o_: puoi essere più specifico su "ha un problema"? Tutte le implementazioni di bcrypt utilizzano il terminatore di caratteri null. Alcuni, come py-bcrypt, hanno persino controlli aggiuntivi per assicurarsi che il carattere null non faccia parte della password. Puoi controllare l' implementazione di Apache su GitHub . Sto usando htpasswd con il sed aggiuntivo per popolare senza problemi i record del database per più applicazioni Spring (in realtà è così che arrivo alla risposta).
Disassemblatore

Supponevo che tralasciare il carattere null fosse un problema di htpasswd per spiegare le diverse codifiche tra Spring e htpasswd. L'output di bcrypt usando l'approccio Python dell'altra risposta stava producendo gli stessi risultati di Spring, ma htpasswd no. Forse anche la mia versione htpasswd è piuttosto vecchia, penso che il binario non sia stato aggiornato da 2 anni.
k_o_

11

Puoi usare una libreria Python. Sul mio sistema Fedora ho fatto:

sudo dnf search bcrypt

(il sudo è solo per evitare di sprecare spazio per una cache dnf dell'utente) e dal risultato può vedere che c'è un pacchetto 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

Installa la versione di Python2 ed elenca i file nel pacchetto:

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

Questo mostra che c'è un file in /usr/lib64/python2.7/site-packages/bcrypt/__init__.pymodo che io possa ottenere la documentazione con

pydoc bcrypt

Questo mi mostra abbastanza per scrivere il seguente comando che cancellerà la stringa "password":

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

Per le versioni successive di bcryptutilizzo rounds=anziché log_rounds=.


2
+1. FTR che non è necessario sudoeseguire dnf search, funziona bene come utente standard.
Stephen Kitt,

1
Ad aprile 2018 il parametro log_roundssembra essere cambiato per roundsrenderlo python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'.
HorstKevin,

4

In aggiunta alla @Disassemblerrisposta:

  • non è una buona idea passare le password dalla riga di comando (poiché la password potrebbe essere visualizzabile con ps)
  • 15 è un buon equilibrio tra velocità di generazione complessità / password

Script wrapper per 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 $?

1
E se non si avvia la riga di comando con uno spazio, la password passerà alla cronologia della shell (un file che probabilmente non è crittografato).
Gabriel Devillers,

@GabrielDevillers sì, lo stesso qui. Ho aggiunto "-i" a OPTS e "" alla penultima riga.
towi,

per la storia BASH e mySQL per l' rootutente è una buona idea creare un collegamento simbolico a /dev/null.
Stuart Cardall,

1
Per quanto riguarda il commento di @ GabrielDevillers, forse vale la pena ricordare che l'aggiunta di uno spazio all'inizio non nasconde sempre un elemento dalla cronologia della shell, dipende dalla shell e dalle impostazioni.
tremby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.