Skip to content

htpasswd 生成器 — bcrypt、Apache MD5 (apr1) 与 Basic Auth

在线生成 htpasswd 条目,支持 bcrypt、Apache MD5 (apr1)、SHA-1 等算法,并输出 Apache、nginx 和 Docker 的即用配置。100% 在浏览器中运行,密码不上传。

无追踪 浏览器中运行 免费
100% 在浏览器中运行——密码不会离开你的设备。
服务器
bcrypt cost: 12
htpasswd 条目
Authorization 请求头
 
验证现有哈希
已审查哈希正确性与 Basic Auth 标准合规性 — Go Tools 工程团队 · 2026年6月4日

什么是 htpasswd 文件?

.htpasswd 文件存储 HTTP Basic 认证所使用的凭证。每行是一个 用户名:哈希 对,其中哈希是密码的单向摘要——明文从不存储。Web 服务器读取该文件以决定谁可以访问受保护的 URL。在 Apache 中,.htaccess 文件(或 <Directory> 块)引用 .htpasswd 文件,并在访问页面前向浏览器弹出用户名和密码提示。

哈希格式取决于所使用的算法。Apache 的 htpasswd 工具支持多种格式:bcrypt(以 $2y$ 开头)最为安全,推荐用于 Apache、Docker Registry 和 Caddy;apr1(Apache MD5,以 $apr1$ 开头)兼容性最广,是 nginx 的安全默认值;SHA-1(以 {SHA} 开头)无盐,被认为不安全;crypt(传统 DES)是遗留格式,密码截断至 8 个字符;plain 以明文存储密码,绝不应在生产环境中使用。

本工具完全在浏览器中运行——用户名、密码和哈希均不会上传。如果需要为条目生成强密码,请使用我们的 随机密码生成器。若要手动构造 Authorization: Basic 请求头,凭证格式为 base64(用户名:密码),可用我们的 Base64 编码器 生成。保护好接口后,可通过我们的 cURL 命令构建器 从命令行进行测试。

# Apache htpasswd CLI equivalents (apache2-utils / httpd-tools)

# bcrypt entry, printed to stdout (recommended; -B = bcrypt, -n = no file, -b = password on CLI)
htpasswd -Bbn admin 's3cret'
# → admin:$2y$10$N9qo8uLOickgx2ZMRZoMye...

# apr1 (Apache MD5) entry, portable for nginx — no apache2-utils needed
printf "admin:$(openssl passwd -apr1 's3cret')\n"
# → admin:$apr1$k3l4Hj9.$qN8...

# Append a user to an existing file from the shell
htpasswd -B /etc/apache2/.htpasswd alice

# Note: nginx delegates bcrypt to the system crypt(); on Alpine/musl or old
# glibc that fails — prefer apr1 for nginx to stay portable.

核心功能

多种哈希算法

支持生成 bcrypt ($2y$)、apr1 / Apache MD5 ($apr1$) 和 SHA-1 ({SHA}) 条目,以及用于测试的明文选项。每种格式在支持的情况下均使用全新的加密盐值。

生成与验证

既可创建新条目,也可验证现有条目。粘贴存储的 user:hash 行和待验证密码,即可立即确认是否匹配——非常适合调试生产环境中的 401 错误。

按服务器选择

选择 Apache、nginx、Docker 或 Caddy,系统自动选择正确算法——支持 bcrypt 时使用 bcrypt,nginx 则使用 apr1 以保证可移植性,避免 crypt() 静默失败。

即用型配置块

一次性获得六种即用配置片段——Apache .htaccess、nginx auth_basic、Docker、Kubernetes ingress-nginx、Caddy 和 Traefik——均已与生成的 .htpasswd 条目关联好,可直接粘贴。

100% 客户端运行

所有哈希计算均在浏览器中通过 Web Crypto 和内置 bcrypt 实现完成。用户名、密码和哈希均不发送至服务器,可安全地生成生产环境凭证。

示例

bcrypt 条目(推荐)

admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

带有 $2y$ 前缀、cost 为 10 的 bcrypt 条目。这是最强、兼容性最广的格式——适用于 Apache、Docker Registry、Caddy 和 Traefik。

apr1 条目(可移植 nginx)

admin:$apr1$kl3H9j2.$qN8vY7tLp2mZ0xW5cR4fK1

Apache MD5 (apr1) 格式,$apr1$ 标记后跟 8 个字符的盐值。这是 nginx 的安全默认值,因为 nginx 的 bcrypt 验证依赖不稳定的系统 crypt()。

SHA-1 条目(遗留)

admin:{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=

{SHA} 条目是无盐 SHA-1 摘要的 base64 编码。Apache 和 nginx 均支持,但无盐且不安全——仅用于遗留兼容场景。

Authorization: Basic 请求头

Authorization: Basic YWRtaW46czNjcmV0

同一用户的客户端凭证:base64('admin:s3cret')。通过 curl -H 或 Postman 发送此请求头,无需 .htpasswd 文件即可完成认证。

多用户 .htpasswd 文件

admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
alice:$2y$10$3bQ8xY7tLp2mZ0xW5cR4fO9vK1jH6sD2nG8aQ5wE3rT7uI4oP1cm
bob:$apr1$mZ0xW5cR$4fK1jH6sD2nG8aQ5wE3rT2

每个用户对应一行 username:hash。同一文件中可以混用不同算法——此示例中两个 bcrypt 条目和一个 apr1 条目共存于三个用户的凭证文件中。

使用方法

  1. 1

    配置服务器与算法

    选择目标服务器(Apache、nginx、Docker、Caddy),系统会自动选择合适的算法——Apache/Docker/Caddy 使用 bcrypt,nginx 使用 apr1 以保证可移植性。你也可以手动切换并调整 bcrypt cost 值。

  2. 2

    生成哈希

    输入用户名和密码(或点击「随机密码」),再点击「生成」。哈希会在本地使用全新随机盐值计算。随时点击「重置盐值」可生成同一密码的不同哈希。

  3. 3

    复制条目

    复制 user:hash 行用于 .htpasswd 文件,复制 echo >> 追加命令用于 Shell,或复制 Authorization: Basic 请求头用于 curl 和 Postman。

  4. 4

    部署配置

    将生成的配置块粘贴到 Apache .htaccess、nginx server 块、Docker、Kubernetes ingress、Caddy 或 Traefik 配置中,指向你的 .htpasswd 文件,然后重新加载服务器即可生效。

常见使用场景

Apache 目录保护
通过 .htaccess 文件和 AuthUserFile 指令为目录添加 HTTP Basic Auth 保护。添加 bcrypt 条目和生成的 Apache 配置块,即可为任意路径启用登录验证。
nginx auth_basic
使用 auth_basic 和 auth_basic_user_file 保护 location 或 server 块。使用 apr1 格式,确保在 Alpine、Debian 及其他基础镜像上均能可靠地完成验证。
Docker Registry
私有 Docker Registry 仅接受 bcrypt htpasswd 条目。使用 htpasswd -Bbn 生成 $2y$ 行,挂载到 registry 容器中,然后进行 docker login 认证。
Kubernetes ingress-nginx
从 .htpasswd 文件创建 basic-auth Secret,并通过 nginx.ingress.kubernetes.io/auth-type 和 auth-secret 注解引用,为 ingress 路由添加访问控制。
Caddy 与 Traefik
Caddy 的 basic_auth 指令和 Traefik 的 basicauth 中间件均要求 bcrypt 哈希。将生成的条目直接粘贴至 Caddyfile 或 Traefik 标签/动态配置中即可。
curl 与 Postman Authorization 请求头
快速测试时无需文件:复制 Authorization: Basic 请求头直接发送凭证。将其添加到 curl -H 参数或 Postman 请求中,即可访问受保护的接口。

技术详情

bcrypt ($2y$)
基于 Blowfish 密码的自适应加盐哈希,具有可调的 cost 因子。每个条目内嵌一个 16 字节的随机盐值和 cost 值,因此相同密码会产生不同哈希。注意:bcrypt 将密码截断至 72 字节,超出部分会被忽略。
apr1(Apache MD5)
Apache 的迭代加盐 MD5 变体($apr1$ + 8 个字符的盐值)。运行 1000 次 MD5 迭代,强度远低于 bcrypt 的自适应 cost,但 Apache 和 nginx 均原生支持,使其成为跨平台和基础镜像最具可移植性的格式。
SHA-1 与 crypt
SHA-1 条目({SHA} + base64 摘要)无盐,相同密码产生相同哈希,易受彩虹表攻击——仅用于遗留兼容场景。传统 crypt(DES)更弱,会静默截断密码至 8 个字符。
盐值与迭代
加盐可防止预计算(彩虹表)攻击,使每个哈希唯一。bcrypt 使用 128 位随机盐值和可配置的 cost;apr1 使用 8 个字符的盐值和 1000 次固定迭代。点击「重置盐值」可为同一密码重新生成不同的有效哈希。
Base64 与 UTF-8 处理
密码在哈希前以 UTF-8 字节编码,确保非 ASCII 字符的一致处理。Authorization: Basic 请求头是原始 UTF-8 格式 username:password 字节的 base64 编码,与服务器端解码结果一致。
说明与注意事项
生成的哈希在本地计算,不会与实际服务器进行验证。复制的条目和下载的 .htpasswd 文件以明文哈希形式保存在剪贴板和磁盘上——请将其视为敏感信息,限制文件权限,粘贴到生产配置后及时清空剪贴板。

最佳实践

在支持的环境下优先使用 bcrypt
对于 Apache、Docker、Caddy 和 Traefik,使用 bcrypt ($2y$)——它有盐、自适应,远强于 apr1 或 SHA-1。仅在 bcrypt 依赖系统 crypt() 导致不可靠时,才为 nginx 保留 apr1。
将文件存放在 Web 根目录之外
确保 .htpasswd 不在任何可访问目录中,以防止通过 HTTP 被下载。设置 chmod 640 并将文件归属于 Web 服务器用户,使服务器可读而其他账号无法访问。
始终通过 HTTPS 提供服务
Basic Auth 在每次请求时以可逆的 base64 传输凭证。没有 TLS,网络路径上的任何人都可以读取密码。永远不要在纯 HTTP 上启用 Basic Auth——在受保护接口前终止 TLS。
使用唯一的强密码
每个账号应有独立的高熵密码,不跨服务复用。使用我们的 随机密码生成器 生成密码,并存储在密码管理器中,而非手动编造。

常见问题

bcrypt 与 apr1——该如何选择?
Apache、Docker Registry、Caddy 和 Traefik 使用 bcrypt——它是强健的、有盐的自适应哈希,是现代标准。nginx 使用 apr1(Apache MD5),因为 nginx 将 bcrypt 交给系统 crypt() 处理,在许多环境下会失败,而 apr1 是内置实现,在任何平台上都能正常工作。如果你能控制运行环境并确认支持 bcrypt,那么 bcrypt 始终是更强的选择;apr1 的优势在于可移植性,而非安全性。
nginx 支持 bcrypt 吗?
仅间接支持,且并不可靠。nginx 本身不哈希密码——对于 $2y$ 条目,它将验证委托给 C 库的 crypt() 函数,因此支持情况完全取决于你的 libc。Alpine 的 musl 和旧版 glibc 不包含 blowfish(bcrypt)方案,导致认证静默失败。对于可移植的 nginx 部署,建议使用 apr1 格式,nginx 在任何平台上均可内部验证。
如何修复 nginx 报错 `crypt_r() failed (22: Invalid argument)`?
该错误表示 nginx 试图在不支持 blowfish 方案的 libc 上验证 bcrypt ($2y$) 哈希——通常发生在 Alpine/musl 或旧版 glibc 环境中。解决方法是将条目重新生成为 apr1(Apache MD5)而非 bcrypt,nginx 在任何平台上均可内部验证 apr1。也可以切换到 libc 包含 bcrypt 支持的基础镜像,但 apr1 是更简单的可移植方案。
.htpasswd 文件应放在哪里?权限如何设置?
将 .htpasswd 文件存放在 Web 文档根目录之外,确保它不会被作为静态文件提供访问。常见位置是 /etc/apache2/.htpasswd 或 /etc/nginx/.htpasswd。设置权限为 640(chmod 640),并将文件归属于 Web 服务器运行用户(如 www-data 或 nginx),这样服务器可以读取,而其他账号无法访问。
如何在 .htaccess / nginx 中配置 Basic Auth?
对于 Apache,本工具生成包含 AuthType Basic、AuthName、AuthUserFile(指向你的 .htpasswd 路径)和 Require valid-user 的 .htaccess 配置块。对于 nginx,生成包含 auth_basic "Restricted"; 和 auth_basic_user_file /path/.htpasswd; 的 location 块。复制与你服务器匹配的配置块,调整文件路径,重新加载服务器即可——片段均可直接粘贴使用。
我的密码会被上传吗?
不会。所有哈希完全在你的浏览器中通过 JavaScript 计算——用户名、密码和生成的哈希均不会通过网络发送。你可以打开浏览器开发者工具(F12 → Network 选项卡)在生成时确认:没有任何外发请求。任何服务器上都不会存储或记录任何内容,因此可以安全地在此生成真实的生产环境凭证。
$2a$、$2b$ 和 $2y$ 在 bcrypt 中有何区别?
它们是同一 bcrypt 算法的版本前缀,产生的哈希等效;差异源于历史上不同实现处理高位字符和字符串长度时的 bug 修复。Apache 的 htpasswd 生成 $2y$。现代 bcrypt 库将 $2a$、$2b$ 和 $2y$ 视为可互换来进行验证,因此这里生成的 $2y$ 条目在 Apache、Caddy、Traefik 和 Docker Registry 中均可正确验证。
bcrypt cost 应该设置为多少?
cost 12 是目前推荐的默认值,能在安全性和速度之间取得良好平衡。cost 是工作因子:每增加 1,计算和验证哈希的时间翻倍,从而减缓暴力破解攻击,但也会增加每次登录的延迟。对于低流量或低风险接口,cost 10 也可接受;对于敏感场景,建议使用 12 到 14。避免设置过高导致合法认证明显变慢。
htpasswd 与 Authorization: Basic 请求头有何区别?
它们处于同一交换流程的两端。.htpasswd 文件保存服务器端存储的哈希——服务器用它来验证凭证的单向摘要。Authorization: Basic 请求头是客户端的请求凭证:浏览器或 curl 在每次请求时发送的 username:password 的 base64 编码。服务器对请求头进行 base64 解码,再将密码与存储的哈希比对。一个是存储,一个是传输。
没有安装 apache2-utils,如何生成 htpasswd 条目?
你不需要安装——本工具可在浏览器中完整生成有效的 bcrypt、apr1 和 SHA-1 条目。如果你更喜欢命令行,几乎所有系统都自带 OpenSSL:运行 openssl passwd -apr1 生成 apr1 哈希,然后加上 username: 前缀即可构成完整条目。在 Debian/Ubuntu 上也可以通过 apt install apache2-utils 安装 htpasswd 工具,在 RHEL/CentOS 上则是 httpd-tools。
htpasswd 的 -B、-Bbn、-bnB 参数是什么意思?
每个字母是独立的参数:-B 选择 bcrypt,-n 将结果输出到 stdout 而非写入文件,-b 从命令行参数读取密码(而非交互式提示)。顺序不影响结果,-Bbn 和 -bnB 完全相同。-Bbn 是将 bcrypt 条目通过管道写入 Docker Registry htpasswd 文件时常用的组合。
为什么 Docker Registry 要求使用 bcrypt?
Docker Registry 的 htpasswd 认证后端仅接受 bcrypt 格式的条目;apr1、SHA-1 和 crypt 哈希会被拒绝,登录将失败。使用 htpasswd -Bbn user password 生成条目(或在此使用 bcrypt 选项),将文件挂载到 registry 容器中,并将 REGISTRY_AUTH_HTPASSWD_PATH 指向该文件。务必配合 TLS 使用,否则 Basic Auth 凭证在传输过程中可被读取。
Basic Auth 安全吗?
仅在 HTTPS 下是安全的。HTTP Basic Auth 在每次请求时将凭证以 base64(username:password) 形式发送,而 base64 是可逆编码——不是加密——任何能读取流量的人都可以立即恢复密码。通过 TLS 传输时,请求头在传输过程中被加密,Basic Auth 是简单门控场景的可接受方案。永远不要在纯 HTTP 上使用,对于高价值应用请考虑更强的认证方案。

cURL 命令生成器与构建工具

网络与 API

在浏览器中构建 curl 命令——设置请求方法、请求头、认证与请求体,即刻获得可复制的命令。支持 Bearer、POST JSON、文件上传预设。免费、隐私安全、无需注册。

进制转换器 — 二进制、十六进制、十进制、八进制互转

转换工具

在线免费进制转换工具,支持二进制、八进制、十进制、十六进制及 2-36 任意进制互转。无需注册,数据不离开浏览器,即时获取结果。

Base64 解码与编码工具

编码和格式化

免费在线 Base64 解码编码工具。实时转换,支持中文和 Emoji,100% 浏览器端运行,数据不离开设备,无需注册。

大小写转换器 — UPPERCASE、lowercase、camelCase 一次搞定

文本处理

在浏览器里把文本一键转成 UPPERCASE、lowercase、Title Case、Sentence case、camelCase、PascalCase、snake_case、kebab-case、CONSTANT_CASE 等共 15 种命名格式。免费、纯本地、无需注册。

颜色转换器 — HEX、RGB、HSL 与 OKLCH

转换工具

在浏览器中将 HEX 转 RGB、HSL、OKLCH、OKLAB 与 CMYK,一键复制任意格式。免费、免注册,您的颜色永远不会离开本页。

Crontab 生成器与 Cron 表达式构建工具

日期和时间

在浏览器里构建、校验并解读 cron 表达式,按本地时间或 UTC 实时预览下一次运行。支持 POSIX 五字段语法、常用预设和中文描述。免费、隐私、无需注册。