Обчисліть хеш-код bcrypt з командного рядка


20

Я хотів би обчислити хеш bcrypt мого пароля.

Чи є інструмент командного рядка з відкритим кодом, який би це зробив?

Я використовував би цей хеш у файлі конфігурації Syncthing (навіть якщо я знаю звідси, що я можу скинути пароль, відредагувавши конфігураційний файл для видалення користувача та пароля в розділі gui, а потім перезапустіть Syncthing).

Відповіді:


28

Ви можете (ab) використовувати htpasswdз пакету apache-utils , якщо у вас версія 2.4 або новіша.

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

-bбере пароль з другого командного аргументу,
-nвиводить хеш до stdout замість того, щоб записувати його у файл,
-Bвказує на використання bcrypt
-C 10встановлює вартість bcrypt до 10

Гола команда htpasswd виводить у форматі <ім'я>: <хаш>, а потім два нові рядки. Звідси порожній рядок для імені та trзачистки двокрапки та нових рядків.

Команда виводить bcrypt з $2y$префіксом, який може бути проблемою для деяких застосувань, але легко може бути виправлений іншим, sedоскільки варіант OpenBSD при використанні $2a$сумісний з фіксованим варіантом crypt_blowfish з використанням $2y$.

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

Посилання на головну сторінку htpasswd: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
Деталі про варіанти bcrypt: /programming//a/36225192/6732096


Ця версія має проблеми з реалізацією BCrypt Java Spring Security. Пароль на хеш повинен бути скасований з нульовим символом. Здається, Spring Security робить це правильно. Я думаю, що htpasswd робить це не правильно.
k_o_

@k_o_: Чи можете ви бути більш конкретними щодо "є проблема"? Усі реалізації bcrypt використовують термінатор з нульовим символом. Деякі, як py-bcrypt, мають навіть додаткові перевірки, щоб переконатися, що нульовий символ не є частиною пароля. Ви можете перевірити реалізацію Apache на GitHub . Я використовую htpasswd з додатковим sed для того, щоб без проблем заповнити записи баз даних для декількох додатків Spring (саме так я і приходжу до відповіді).
Розбиральник

Я припускав, що виключення нульового символу є проблемою htpasswd для пояснення різних кодувань між Spring та htpasswd. Вихід з bcrypt з використанням підходу іншого відповіді Python дав ті самі результати, що і у Spring, але htpasswd не був. Можливо, моя версія htpasswd досить стара, я думаю, що двійковий файл не оновлювався з 2 років.
k_o_

11

Можна використовувати бібліотеку Python. У своїй системі Fedora я зробив:

sudo dnf search bcrypt

(Судо - це просто уникнути втрати місця для кешу dnf користувача), і з результату видно, що є пакети Python2 та 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

Встановіть версію Python2 і перерахуйте файли в пакеті:

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

Це показує, що є файл, /usr/lib64/python2.7/site-packages/bcrypt/__init__.pyтому я можу отримати документацію

pydoc bcrypt

Це показує мені достатньо написати наступну команду, яка буде хеш-рядок "password":

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

Для пізніших версій bcryptвикористання rounds=замість log_rounds=.


2
+1. FTR вам не потрібно sudoзапускати dnf search, він працює чудово як звичайний користувач.
Стівен Кітт

1
Станом на квітень 2018 року, log_roundsздається, параметр змінився на roundsйого створення python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'.
HorstKevin

4

Додатково до @Disassemblerвідповіді:

  • це не дуже гарна ідея вводити паролі з командного рядка (так як пароль можна побачити за допомогою ps)
  • 15 є хорошим балансом щодо складності / швидкості генерації пароля

Сценарій обгортки для 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 $?

2
І якщо ви не запустите командний рядок з пробілом, пароль перейде до вашої історії оболонки (файл, який, ймовірно, не зашифрований).
Габріель Дияволс

@GabrielDevillers yup, тут же. Я додав "-i" до OPTS та "" до другого-останнього рядка.
букси

для історії BASH та mySQL для rootкористувача корисно створити символічне посилання на /dev/null.
Стюарт Кардалл

1
Щодо коментаря @ GabrielDevillers, можливо, варто згадати, що додавання пробілу до початку не завжди приховує елемент з історії оболонки - залежить від оболонки та налаштувань.
тремтіння
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.