Oblicz skrót bcrypt z wiersza poleceń

19

Chciałbym obliczyć skrót bcrypt mojego hasła.

Czy istnieje narzędzie wiersza polecenia open source, które by to zrobiło?

Chciałbym użyć tego skrótu w pliku konfiguracyjnym Syncthing (nawet jeśli wiem , że mogę zresetować hasło, edytując plik konfiguracyjny, aby usunąć użytkownika i hasło w sekcji GUI, a następnie ponownie uruchomić Syncthing).

Gabriel Devillers
źródło

Odpowiedzi:

27

Możesz (ab) używać htpasswdz pakietu apache-utils , pod warunkiem, że masz wersję 2.4 lub wyższą.

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

-bbierze hasło z drugiego argumentu polecenia
-nwypisuje skrót na standardowe wyjście zamiast zapisywać je w pliku
-Binstruuje, aby użyć bcrypt
-C 10ustawia koszt bcrypt na 10

Polecenie gołe htpasswd wyprowadza w formacie <nazwa>: <skrót> i dwie nowe linie. Stąd pusty ciąg nazwy i trusuwania dwukropka i znaków nowej linii.

Komenda wypisuje bcrypt z $2y$prefiksem, co może być problemem dla niektórych zastosowań, ale może być łatwo naprawiony przez inny, sedponieważ wariant OpenBSD korzystający $2a$jest kompatybilny ze stałym wariantem crypt_blowfish $2y$.

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

Link do strony podręcznika htpasswd: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
Szczegółowe informacje na temat wariantów bcrypt: /programming//a/36225192/6732096

Dezasembler
źródło
Ta wersja ma problem z implementacją BCrypt programu Java Spring Security. Hasło do skrótu musi być zakończone znakiem null. Wygląda na to, że Spring Security robi to poprawnie. Myślę, że htpasswd nie robi tego poprawnie.
k_o_
@k_o_: Czy możesz bardziej szczegółowo określić „problem”? Wszystkie implementacje bcrypt używają terminatora zerowego. Niektóre, takie jak py-bcrypt, mają nawet dodatkowe kontrole, aby upewnić się, że znak zerowy nie jest częścią hasła. Możesz sprawdzić implementację Apache na GitHub . Używam htpasswd z dodatkowym sedem do zapełniania rekordów bazy danych dla wielu aplikacji Spring bez problemów (tak właściwie doszedłem do odpowiedzi).
Dezasembler
Zakładałem, że pominięcie znaku zerowego było problemem htpasswd w celu wyjaśnienia różnych kodowań między Spring i htpasswd. Dane wyjściowe z bcrypt wykorzystujące podejście Python drugiej odpowiedzi dawały takie same wyniki jak wiosną, ale htpasswd nie. Być może moja wersja htpasswd jest dość stara, myślę, że plik binarny nie był aktualizowany od 2 lat.
k_o_
11

Możesz użyć biblioteki Python. W moim systemie Fedora:

sudo dnf search bcrypt

(sudo ma po prostu uniknąć marnowania miejsca na pamięć podręczną dnf użytkownika), a na podstawie wyników widać, że jest pakiet Python2 i 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

Zainstaluj wersję Python2 i wyświetl listę plików w pakiecie:

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

To pokazuje, że jest plik, /usr/lib64/python2.7/site-packages/bcrypt/__init__.pydzięki czemu mogę uzyskać dokumentację

pydoc bcrypt

To pokazuje mi wystarczająco dużo, aby napisać następującą komendę, która zaszyfruje ciąg "password":

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

W przypadku późniejszych wersji bcryptużycia rounds=zamiast log_rounds=.

meuh
źródło
2
+1. FTR, którego nie musisz sudouruchamiać dnf search, działa dobrze jako zwykły użytkownik.
Stephen Kitt,
1
Według stanu na kwiecień 2018 r. Parametr log_roundszmienił się na jego roundswykonanie python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'.
HorstKevin
4

Dodatkowa @Disassemblerodpowiedź:

  • przekazywanie haseł z wiersza poleceń nie jest dobrym pomysłem (ponieważ hasło można wyświetlić za pomocą ps)
  • 15 jest dobrą równowagą dla szybkości generowania złożoności / hasła

Skrypt opakowania dla 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
źródło
2
I jeśli nie uruchomisz wiersza poleceń spacją, hasło przejdzie do historii powłoki (plik, który prawdopodobnie nie jest zaszyfrowany).
Gabriel Devillers
@GabrielDevillers tak, tak samo tutaj. Dodałem „-i” do OPTS i „” do linii od 2 do ostatniej.
towi
dla historii BASH i mySQL dla rootużytkownika dobrym pomysłem jest utworzenie dowiązania symbolicznego /dev/null.
Stuart Cardall
1
Jeśli chodzi o komentarz @ GabrielDevillers, warto wspomnieć, że dodanie spacji na początku nie zawsze ukrywa element w historii powłoki - zależy od powłoki i ustawień.
tremby