Вычислить хэш bcrypt из командной строки

19

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

Есть ли инструмент командной строки с открытым исходным кодом, который бы это сделал?

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

Габриэль Девиллерс
источник

Ответы:

26

Вы можете (ab) использовать htpasswdиз пакета apache-utils , если у вас версия 2.4 или выше.

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

-bпринимает пароль от второго аргумента команды
-nвыводит хэш на стандартный вывод вместо записи в файл
-Bпредписывает использовать Bcrypt
-C 10наборы в Bcrypt стоимости 10

Голая команда htpasswd выводит в формате <name>: <hash>, за которым следуют две новые строки. Отсюда и пустая строка для имени и 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

Disassembler
источник
Эта версия имеет проблему с реализацией 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

(sudo просто для того, чтобы не тратить пространство на пользовательский 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=.

meuh
источник
2
+1. FTR вам не нужно sudoзапускать dnf search, он отлично работает как обычный пользователь.
Стивен Китт
1
По состоянию на апрель 2018 года параметр , log_roundsпохоже, изменилась к roundsсделать его python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'.
ХорстКевин
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 $?
Стюарт Кардалл
источник
1
И если вы не запустите командную строку с пробелом, пароль попадет в историю вашей оболочки (файл, который, вероятно, не зашифрован).
Габриэль Devillers
@GabrielDevillers да, здесь тоже самое. Я добавил "-i" в OPTS и "" в строку со второй по последнюю.
Towi
для BASH и истории MySQL для rootпользователя неплохо создать символическую ссылку на /dev/null.
Стюарт Кардалл
1
Что касается комментария @ GabrielDevillers, возможно, стоит упомянуть, что добавление пробела в начало не всегда скрывает элемент из истории оболочки - зависит от оболочки и настроек.
Тремби