piapia123
zh

htpasswd 密码生成器

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
输出

生成 `.htpasswd` 文件里那一行,用来给站点或目录加一层基本认证。四种标准形式都在:bcrypt($2y$,Apache 的当前推荐)、APR1-MD5($apr1$,Apache 的传统默认,老配置里到处都是)、SHA-1({SHA})与明文。另外两种是非标准的:SHA-256 与 SHA-512 输出 `{SHA256}` / `{SHA512}`,Apache 和 nginx 都不认,只有明确接受这个格式的系统能用 —— 结果行上标了出来。 用 nginx 的话选 APR1。 nginx 的 `auth_basic_user_file` 官方只认 crypt、apr1 与 {scheme},而 `htpasswd -B` 产出的 `$2y$` 常报 `crypt_r() failed` —— 这是会直接让人配不通、但两边文档都没写清楚的坑。 除了这一行本身,还会给出可以直接粘贴的 htpasswd 命令与 Docker 一行命令 —— 命令里的密码用单引号包住,所以密码里有 $ 或反引号也不会被 shell 展开成别的东西。APR1 的结果与 openssl passwd -apr1 的输出逐字一致(测试里用它的向量钉住了)。全部在浏览器里算,密码不会离开这台设备。

功能

  • 六种形式:bcrypt($2y$)、APR1-MD5($apr1$)、SHA-1({SHA})、SHA-256、SHA-512、明文
  • 用 nginx 就选 APR1 —— nginx 不支持 $2y$ 的 bcrypt,选错会报 crypt_r() failed
  • bcrypt 成本因子可调,从 4 到 15
  • APR1 的结果与 openssl passwd -apr1 逐字一致
  • 同时给出 .htpasswd 行、哈希本身、htpasswd 命令与 Docker 一行命令
  • SHA-256 / SHA-512 标注为非标准:Apache 与 nginx 都不认,因此只给 openssl 命令
  • 顺带给出密码强度(熵与分档),弱口令一眼看得出来
  • 命令里的密码用单引号包住,含 $ 或引号也不会被 shell 展开
  • 明文形式带明确警告
  • 用户名与密码都不上传,全部本地计算

使用方法

  1. 在输入框里输入密码
  2. 在选项里填用户名(默认 admin)并选择加密方式
  3. .htpasswd 那一行与命令同时出现,最后一行是密码强度
  4. 点某一行的复制按钮取走需要的内容

常见问题

应该选哪个加密方式?
新配置选 bcrypt。它有可调的成本因子,每次验证都要花几十毫秒,暴力破解的代价因此高得多。APR1-MD5 是 1990 年代的设计(1000 轮 MD5,当时足以拖垮破解,今天不值一提),保留它只是为了兼容老配置。SHA-1 已经不该用于任何安全用途。明文只适合本地测试。
bcrypt 的成本因子选多少?
默认 10(大约 60 毫秒)。这个数字要平衡两件事:验证时服务器也要花同样的时间,而攻击者破解也要花。每加一,时间翻倍 —— 12 是很多人的选择,15 会让每次请求多等将近两秒。除非你是为了对抗有专用硬件的攻击者,否则 10 到 12 就够了。
生成的结果怎么用?
把「.htpasswd 行」那一段追加到服务器上的 .htpasswd 文件里(一行一个用户),然后在 Apache 配置里用 AuthUserFile 指向这个文件、开启 AuthType Basic 与 require valid-user;Nginx 则用 auth_basic 与 auth_basic_user_file 指向它。这个文件本身要放在网站根目录之外,否则会被直接下载走。
密码会被上传或者记录吗?
不会。哈希在浏览器里算出来,页面不发送任何请求 —— 密码是最不该经过第三方服务器的东西,这里也没有服务器能经过。
Nginx 支持 bcrypt 吗?
不支持。nginx 的 `auth_basic_user_file` 官方只认 crypt()、apr1 与 {scheme} 三种形式,而 `htpasswd -B` 生成的 `$2y$` 属于 Apache 的 bcrypt 变体 —— 直接拿去用,nginx 常报 `crypt_r() failed (22: Invalid argument)` 或直接 500。用 nginx 就选 APR1-MD5,把它留给 Apache 2.4+。
htpasswd 支持 SHA-256 吗?
不支持 —— 这一点很多在线工具没有说清楚。 htpasswd 命令只有 `-B`(bcrypt)、`-m`(apr1)、`-s`(SHA-1)、`-d`(crypt)与 `-p`(明文)五个选项,没有 SHA-256;Apache 与 nginx 也都不认 `{SHA256}` 条目。这里之所以仍然提供 SHA-256 与 SHA-512,是因为一部分系统(RFC 2307 风格的 LDAP、自建认证)明确接受这个形式 —— 但别拿它去配 Apache 或 nginx,会直接验不过。结果行上标着「非标准」,就是提醒这件事。

相关工具