什么是 openssl passwd

openssl passwd 是 OpenSSL 提供的密码哈希生成工具,用于生成 Unix 系统兼容的密码哈希值。常用于:

  • 创建系统用户密码
  • 配置文件中的密码存储
  • 脚本中批量设置密码
  • 验证密码哈希格式

支持的算法

选项 算法 说明
-6 SHA-512 推荐,最安全
-5 SHA-256 安全性良好
-1 MD5 已不推荐
-apr1 Apache APR1 Apache 特有的 MD5 变体

基本用法

生成 SHA-512 密码哈希

1
openssl passwd -6 "mypassword"

输出示例:

1
$6$2ImZDTlvDtl.K5Dv$BAb4eqBXEc.3cYefDcF4s7Ghs3JAN.yGC64Cfb2HRKkKjHG/tBXFMqAUiaTN37WuQq3KJctIro5hc2/GynmK0/

生成 SHA-256 密码哈希

1
openssl passwd -5 "mypassword"

输出示例:

1
$5$rounds=5000$salt$hashedvalue

指定盐值

默认情况下,OpenSSL 随机生成盐值。可以手动指定:

1
openssl passwd -6 -salt "mysalt" "mypassword"

输出:

1
$6$mysalt$NnV971IQBjpm05xN58mTwg/dwJU99ggOM/ZBcm/.T9.jLDUJY.aQjCupSKXbs79UGyLeLTYGyfGxmam7gYAs1.

注意:指定盐值会降低安全性,仅用于测试或特定场景。

算法对比

SHA-512 vs SHA-256 vs MD5

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# SHA-512(推荐)
openssl passwd -6 -salt "testsalt" "mypassword"
# 输出:$6$testsalt$NnV971IQBjpm05xN58mTwg/dwJU99ggOM/ZBcm/.T9.jLDUJY.aQjCupSKXbs79UGyLeLTYGyfGxmam7gYAs1.

# SHA-256
openssl passwd -5 -salt "testsalt" "mypassword"
# 输出:$5$testsalt$wgNKDjGIgT8IFAxDiRL.PJNsG./bzm/9VeKSK2Fg0C4

# MD5(不推荐)
openssl passwd -1 -salt "testsalt" "mypassword"
# 输出:$1$testsalt$LKHGuPSPCwxuZTx9xKXh5.

安全性排序:SHA-512 > SHA-256 > MD5

实际应用

创建系统用户并设置密码

1
2
3
4
5
# 生成密码哈希
HASH=$(openssl passwd -6 "securepassword")

# 创建用户并设置密码
sudo useradd -m -p "$HASH" newuser

Apache .htpasswd 文件

Apache 使用 APR1 格式:

1
openssl passwd -apr1 "mypassword"

输出:

1
$apr1$randomsalt$hashedvalue

从标准输入读取

1
echo "mypassword" | openssl passwd -6 -stdin

批量处理

从文件读取多个密码:

1
2
3
4
5
# 创建密码文件
echo -e "password1\npassword2\npassword3" > passwords.txt

# 批量生成哈希
openssl passwd -6 -in passwords.txt

哈希格式解析

以 SHA-512 为例:

1
$6$2ImZDTlvDtl.K5Dv$BAb4eqBXEc.3cYefDcF4s7Ghs3JAN.yGC64Cfb2HRKkKjHG/tBXFMqAUiaTN37WuQq3KJctIro5hc2/GynmK0/
  • $6$ — 算法标识(6 = SHA-512)
  • 2ImZDTlvDtl.K5Dv — 盐值
  • BAb4eqBXEc... — 哈希值

常见问题

1. 为什么每次生成的哈希不同?

默认使用随机盐值,相同密码产生不同哈希。这是正常的安全行为。

2. 如何验证密码?

使用系统工具验证:

1
2
3
4
5
# 查看用户密码哈希
sudo grep username /etc/shadow

# 或使用 Python 验证
python3 -c "import crypt; print(crypt.crypt('mypassword', '\$6\$salt\$'))"

3. MD5 还能用吗?

不推荐。MD5 存在碰撞漏洞,仅用于兼容旧系统。

安全建议

  1. 优先使用 SHA-512-6 选项提供最高安全性
  2. 不要在命令行暴露密码:使用 -stdin-in 选项
  3. 避免指定盐值:让 OpenSSL 自动生成随机盐
  4. 妥善保管哈希:哈希本身虽不可逆,但可被暴力破解

参考来源