从命令行计算 bcrypt 哈希值

从命令行计算 bcrypt 哈希值

我想计算密码我的密码的哈希值。

有没有一个开源命令行工具可以做到这一点?

我会在 Syncthing 配置文件中使用这个哈希(即使我知道从这里我可以通过编辑配置文件来重置密码,删除 gui 部分中的用户和密码,然后重新启动 Syncthing)。

答案1

您可以(ab)使用htpasswd来自apache-utils包,前提是您有 2.4 或更高版本。

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

-b从第二个命令参数中获取密码
-n将哈希值打印到 stdout,而不是将其写入文件
-B指示使用 bcrypt
-C 10设置 bcrypt成本至 10

裸 htpasswd 命令以格式输出<名称>:<哈希>接下来是两个换行符。因此名称为空字符串并tr删除冒号和换行符。

该命令输出带有$2y$前缀的 bcrypt,这对于某些用途可能会出现问题,但可以很容易地由另一个修复,sed因为使用的 OpenBSD 变体$2a$与使用的固定 crypt_blowfish 变体兼容$2y$

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

链接到 htpasswd 手册页:https://httpd.apache.org/docs/2.4/programs/htpasswd.html
有关 bcrypt 变体的详细信息:https://stackoverflow.com/a/36225192/6732096

答案2

您可以使用 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=.

答案3

这与 FreeBSD 相关,因为如果不安装 apache,则 htpasswd 不可用。基于 @meuh 的答案,以下是如何在 FreeBSD 中使用 Python3 来获取密码的 bcrypt 哈希值 - 例如,用于 traefik 监狱中的基本身份验证。

请注意,以下假设是监狱。如果这是基本操作系统,请小心使用 pip。根据 FreeBSD 版本和当前可用的 Python3 版本调整 Python3 的版本。

pkg install py37-pip
pip install bcrypt

并运行,再次调整Python 3版本:

python3.7 -c 'import bcrypt; print(bcrypt.hashpw(b"PASSWORD", bcrypt.gensalt(rounds=15)).decode("ascii"))'

@Stuart Cardall 正确地指出,这将使您的密码载入史册。 “留给读者”获取此 Python3 片段并通过提示输入用户名和密码进行扩展,以便此信息最终不会在ps输出或历史记录中可见。

答案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 $?

相关内容