一个计算机技术爱好者与学习者

0%

shell命令之htpasswd

1. htpasswd简介

htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。

参考文档:htpasswd命令

2. htpasswd语法说明

语法格式:

1
htpasswd [参数] [用户和密码]

常用参数:

  • -c 创建一个加密文件
  • -n 不更新加密文件,只将加密后的用户名密码显示在屏幕上
  • -m 默认采用MD5算法对密码进行加密
  • -d 采用CRYPT算法对密码进行加密
  • -p 不对密码进行进行加密,即明文密码
  • -s 采用SHA算法对密码进行加密
  • -B 强制对密码进行bcrypt加密(非常安全)
  • -b 在命令行中一并输入用户名和密码而不是根据提示输入密码
  • -D 删除指定的用户

3. 安装htpasswd

1
2
3
4
5
# centos
yum install httpd-tools

# ubuntu
apt install apache2-utils

4. htpasswd常用命令

4.1. 生成用户密码对

使用 md5 算法生成 .passwd 密码文件,同时添加一对用户和密码

1
htpasswd -bc .passwd voidking 123456

在上面生成的密码文件中,再添加一对用户和密码

1
htpasswd -b .passwd voidking2 123456

使用 bcrypt 算法生成 .passwd 密码文件,同时添加一对用户和密码

1
htpasswd -B -bc .passwd voidking 123456

4.2. 删除用户密码对

删除用户名和密码

1
htpasswd -D .passwd voidking2

4.3. 修改密码

1
htpasswd -b .passwd voidking 654321

5. salt 说明

多次执行 htpasswd 命令,输入相同的用户名和密码,生成的加密后的密码是不同的。

这是因为htpasswd和许多密码哈希函数在工作时都会使用一项称为 salt 的技术。一个 salt 是一个随机生成的字符串,在哈希过程中和密码组合在一起,然后一起被哈希。结果,即使密码是相同的,但是由于 salt 是随机的,所以最终生成的哈希值会不同。

这个 salt 值通常会被嵌入到生成的哈希值中,这样在进行密码验证时,可以使用同样的 salt 来进行哈希操作,然后比较结果。因此,即使每次执行htpasswd生成的哈希值看起来不同(因为 salt 不同),但是所有这些哈希值实际上还是可以正确地验证同一个密码。

使用 salt 可以提高密码的安全性,使得它更难以被破解,因为每次哈希的结果都不同,这使得对哈希值的彩虹表攻击变得无效。

salt 值不仅嵌入到生成的哈希值中,而且按照特定的格式进行了组织。
因此,当我们有一个哈希值(包括 salt 值)和一个要验证的原始密码时,我们可以从哈希值中提取 salt ,然后将其用于哈希原始密码,产生一个新的哈希值,然后和原哈希进行比较。

不同的哈希函数可能会有不同的格式来存储 salt 和哈希值,但是基本都是将 salt 值和哈希值组合在一起,用特殊的字符进行分隔。

例如,bcrypt使用的哈希格式看起来大致上如下:

1
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

其中,$2a$表示这是一个bcrypt哈希,10$表示使用的成本参数,N9qo8uLOickgx2ZMRZoMye是 salt ,而 IjZAgcfl7p92ldGxad68LJZdL17lhWy 是实际的哈希值。

当验证密码时,我们可以从哈希字符串中取出 salt 值和哈希值,再使用同样的哈希函数和相同的 salt 来哈希要验证的密码,然后将结果与原哈希值进行比较。如果二者匹配,那么密码就是有效的。

6. python实现htpasswd

在不方便安装 htpasswd 的环境中,如果有 python 环境,那么可以基于python实现和 htpasswd 相同的功能。

6.1. md5算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import getpass
from passlib.apache import HtpasswdFile

# 输入用户名
username = input("Enter username: ")

# 输入密码
password = getpass.getpass("Enter password: ")

# 新建一个htpasswd文件
ht = HtpasswdFile(".passwd", new=True)

# 将用户名和相应的哈希密码添加到文件中
ht.set_password(username, password)

# 保存文件
ht.save()

6.2. bcrypt 算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import getpass
import bcrypt
from passlib.apache import HtpasswdFile

# 输入用户名
username = input("Enter username: ")

# 输入密码
password = getpass.getpass("Enter password: ")

# 用bcrypt加密密码
hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())

# 将hashed password转化为htpasswd能接受的格式
hashed_password_htpasswd = hashed_password.decode().replace("$2b$", "$2y$")

# 新建一个htpasswd文件
ht = HtpasswdFile(".passwd", new=True)

# 将用户名和相应的hashed密码添加到文件中
ht.set_password(username, hashed_password)

# 保存文件
ht.save()
  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-shell-htpasswd/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~