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