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 | # centos |
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 | import getpass |
6.2. bcrypt 算法
1 | import getpass |