搭建 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 生成工具

ZeroTool 的 htpasswd 生成工具 支持:

  • bcrypt(推荐,$2y$ 前缀)
  • APR1 MD5($apr1$ 前缀,Apache 兼容)
  • SHA1({SHA} 前缀)
  • 明文(仅用于测试)

输入用户名和密码,选择算法,直接将生成的行复制到 .htpasswd 文件中。所有计算均在本地完成,数据不会离开浏览器。

立即使用 htpasswd 生成工具 →