搭建 Apache 或 Nginx 的 HTTP 基础认证需要一个 .htpasswd 文件——每行存储一个用户名与哈希密码的组合。正确生成这些哈希是第一道坎。本文介绍 htpasswd 的原理、算法选择、Apache/Nginx 配置方法,以及为什么我们的 htpasswd 生成工具 在浏览器本地完成所有计算才是正确做法。
.htpasswd 文件是什么
.htpasswd 文件存储 HTTP 基础认证的用户名–密码对,每行格式如下:
用户名:$哈希密码
Apache 在验证请求时读取此文件。Nginx 通过 auth_basic_user_file 指令使用相同格式。文件可包含多个用户,每行一个。
示例 .htpasswd 文件:
alice:$2y$10$abcdefghijklmnopqrstuuVwXyZabcdefghijklmnopqrstuuVwXyZ
bob:$apr1$xyz12345$abcdefghijklmnopqrstuvwx
carol:{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=
htpasswd 算法对比
选择正确的算法对安全性至关重要:
| 算法 | 前缀 | 安全性 | 说明 |
|---|---|---|---|
| bcrypt | $2y$ | 推荐 | 可调节工作因子,专为慢速设计 |
| APR1 MD5 | $apr1$ | 可接受 | Apache 专有 MD5 变体,含拉伸处理 |
| SHA1 | {SHA} | 弱 | 无盐值,易受彩虹表攻击 |
| 明文 | (无) | 无 | 生产环境绝对不要使用 |
选 bcrypt。 它是唯一支持可调节工作因子的算法——随着硬件性能提升,可以增大计算成本。SHA1 没有盐值,预计算哈希表可以直接破解。明文就是把密码原样存储,文件泄露即意味着所有账号沦陷。
bcrypt 哈希结构
$2y$10$Rlm8Mzv3bKNv1Pz5h3W1Ou6G7SjkUzW9C5h4RpYNi6TmVjD8sLYi
字段说明:
$2y$— bcrypt,Apache 兼容变体10— 成本因子(2^10 = 1024 轮)- 后续 53 个字符编码盐值 + 哈希
Apache 基础认证配置
第一步 — 生成 htpasswd 文件,使用 htpasswd 生成工具 或命令行:
# 创建新文件并添加第一个用户
htpasswd -cB /etc/apache2/.htpasswd alice
# 添加更多用户(不加 -c,否则会覆盖文件)
htpasswd -B /etc/apache2/.htpasswd bob
-B 参数强制使用 bcrypt。不加此参数,多数系统默认使用 MD5。
第二步 — 配置虚拟主机或目录:
<Directory "/var/www/html/private">
AuthType Basic
AuthName "受限区域"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
或在受保护目录中使用 .htaccess(需要服务器配置中启用 AllowOverride AuthConfig):
AuthType Basic
AuthName "受限区域"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
第三步 — 重载 Apache:
sudo systemctl reload apache2
Nginx 基础认证配置
Nginx 没有内置 htpasswd 命令,但读取相同的文件格式。
第一步 — 创建密码文件。 使用 浏览器生成工具 或系统已安装的 htpasswd 工具:
htpasswd -cB /etc/nginx/.htpasswd alice
第二步 — 配置 Nginx location 块:
server {
listen 80;
server_name example.com;
location /private/ {
auth_basic "受限区域";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
如需保护整个站点,将指令移到 location 块之外的 server 块中。
第三步 — 测试并重载:
sudo nginx -t
sudo systemctl reload nginx
安全注意事项
必须使用 HTTPS。 HTTP 基础认证只是将凭据进行 Base64 编码后放入请求头,任何网络抓包工具都能轻松解码。没有 TLS 的基础认证等同于裸奔——它不是认证,只是一个摆设。
限制文件权限。 .htpasswd 文件只应对 Web 服务器进程可读:
sudo chown root:www-data /etc/apache2/.htpasswd
sudo chmod 640 /etc/apache2/.htpasswd
文件不要放在 Web 根目录下。 一旦放入公开可访问的目录,任何人都能下载这个文件。
定期轮换密码。 更新单个用户的密码而不影响其他条目:
htpasswd -B /etc/apache2/.htpasswd alice
不要将基础认证用于敏感业务系统。 它没有速率限制、没有会话管理、不支持多因素认证。涉及实际用户数据的系统,应使用完整的认证框架。
为什么要用浏览器端生成工具
标准做法是使用 apache2-utils 包中的 htpasswd 命令行工具。但这需要安装软件包并有终端访问权限。很多时候开发者需要在没有安装 Apache 工具的机器上生成密码条目,或者正在远程配置服务器。
在线生成工具可以解决这个问题——但大多数在线工具会把你的密码发送到服务器端进行哈希计算。这对密码来说是完全错误的模型。
zerotool.dev 的 htpasswd 生成工具 完全在浏览器中运行。 bcrypt 哈希(以及其他所有算法实现)通过 JavaScript 在你的设备上本地执行。密码不会离开浏览器,没有服务器请求,没有输入字段日志记录。验证方法很简单:生成哈希时打开浏览器开发者工具的 Network 面板,你不会看到任何与密码相关的出站请求。
这使得它对生产环境凭据同样安全,在组织安全策略禁止向第三方网站粘贴密码的场景下也完全适用。
使用 htpasswd 生成工具
- bcrypt(推荐,
$2y$前缀) - APR1 MD5(
$apr1$前缀,Apache 兼容) - SHA1(
{SHA}前缀) - 明文(仅用于测试)
输入用户名和密码,选择算法,直接将生成的行复制到 .htpasswd 文件中。所有计算均在本地完成,数据不会离开浏览器。